http://tech.blogbus.com/logs/219144.html
两个月前,写了一篇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 2008-10-05 23:25
Blog of JoJo 阅读(222)
评论(0) 编辑 收藏 所属分类:
Programming 相关