Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

Tapestry整合Spring实践

两个月前,写了一篇blog,名为《将Tapestry整合到Spring里去》,是根据文档做了理论上的说明。这阵子终于开始动手做,由于犯了一个很低级的错误,浪费了很多时间,直到周六才“摆平”,很高兴。网上这方面的资料非常少,我把实际操作过程再介绍一下,也算补一下文档的不足。事实上Spring网站的文档是给对Spring和Tapestry都有开发经验的人写的,多少有点过于简略,不是很方便使用。

第一步:写一个Java Bean供后边调用:

package my;//接口
public interface IBean {
 public void amethod();
}

package my;//实现类
public class Bean implements IBean {
 
 public void amethod() {
  //do something;
 }
}

第二步:编写Spring的context config文档applicationContext.xml,放在web应用的/WEB-INF目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <bean id="aBean" class="my.Bean">
 </bean>
</beans>

第三步:先试试直接载入Spring Application Context的做法。写一个tapestry页面(这里要求你对tapestry多少有点认识),如test.html,在对应的test.java中写入以下代码:

WebApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(getRequestCycle().getRequestContext().getServlet().getServletContext());
IBean bean = appContext.getBean("aBean");
bean.amethod();

这里要说明一下,Spring的帮助文档有点错误,它用了WebApplicationContextUtils.getApplicationContext()的方法,但实际不存在这个方法,应该用WebApplicationContextUtils.getWebApplicationContext()

第四步,改为推荐的做法,在Engine里做上边的getWebApplicationContext(),并将其写到tapestry的global对象里边去。

public class MyEngine extends BaseEngine {
 public static final String APPLICATION_CONTEXT_KEY = "appContext";
 protected void setupForRequest(RequestContext context) {
  super.setupForRequest(context);
  Map global = (Map) getGlobal();
  ApplicationContext ac = (ApplicationContext) global.get(APPLICATION_CONTEXT_KEY);
  if (ac == null) { ac = WebApplicationContextUtils.getWebApplicationContext(context.getServlet().getServletContext());
   System.out.println("测试" + ac);//你可以看看这一句在什么时候执行,从而了解Engine是什么时候被调用的;
   global.put(APPLICATION_CONTEXT_KEY, ac);
  }
 }
}

global是一个Map,我们在里边增加了一个属性appContext,并将取到的ApplicationContext放进去,以后,通过调用global.appContext就可以得到context,并用来getBean。

第五步,在tapestry应用的sample.application文档(文件名与web.xml对应)里,指定所使用的Engine,也就是第四步写的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "
http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">

<application name="Sample Application" 
 engine-class="MyEngine">
 <page name="test" specification-path="test.page"/>
</application>

第六步:在test.html对应的test.page里,加入获取bean的操作,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "
http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
<page-specification class="test">
  <property-specification name="aBean" type="my.IBean">
   global.appContext.getBean("aBean")
  </property-specification>
</page-specification>

第七步:在test.java里增加一个abstract getter:

public abstract IBean getABean();

之后,就可以在代码里用getABean()的方法获取我们需要的bean了,如:

getABean().amethod();

当然,不要忘了编辑web.xml文档:

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <display-name>Tapestry Tutorial</display-name>
 <!--Redirect it to the servlet mapping address /h-->
 <filter>
  <filter-name>redirect</filter-name>
  <filter-class>org.apache.tapestry.RedirectFilter</filter-class>
  <init-param>
   <param-name>redirect-path</param-name>
   <param-value>/app</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>redirect</filter-name>
  <url-pattern>/</url-pattern>
 </filter-mapping>
   
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
 </context-param>
 <servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet>
  <servlet-name>sample</servlet-name>
  <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>sample</servlet-name>
  <url-pattern>/app</url-pattern>
 </servlet-mapping>

 <session-config>
  <session-timeout>15</session-timeout>
 </session-config>
 
 <welcome-file-list>
  <welcome-file>index.htm</welcome-file>
 </welcome-file-list>
 
</web-app>

小结:事实上,这个过程与我上次写的内容大体相似,不过经过实践之后,我可以肯定地说这是走得通的,如果你配置时出现问题,那可能是在一些其它地方忽略了什么。象我这一次就是……嗯,具体的不说了,说出来会很不好意思的。如果有人配置时正好看到这篇文档,希望对你有帮助^_^

Ps其实这一次失误的过程也可以写成篇blog,重点在于期间的心路历程。不过还是算了。这段时间的工作受情绪影响太大了,如果以后成为管理者,一定要注意下属的情绪问题并尽量予以解决,而不能认为职场不需要关注这样的事。

又:Blogbus回退时输入数据会丢失,虽然我知道这是Web应用开发里的难题,不过还是希望能够列入待解决的问题里去-_-
 

posted on 2006-02-26 10:42 都市淘沙者 阅读(711) 评论(4)  编辑  收藏

评论

# 有个问题 2006-07-03 10:05 tapestryaa

为什么在web.xml中用
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

启动时报错 error Listenerstart   回复  更多评论   

# re: Tapestry整合Spring实践 2006-07-03 12:42 jelver

看看你的项目,是不是缺少必须的包呢  回复  更多评论   

# re: Tapestry整合Spring实践 2006-07-04 09:12 tapestryaa

我用myeclipse做的,在做之前都要倒包,myeclipse自己倒  回复  更多评论   

# re: Tapestry整合Spring实践 2006-12-18 17:02 程程

包也导了。还是不对。。请问还有可能是什么错误呢。给点提示吧。
谢谢
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: