Spring , Struts整合方法
2006-09-11 16:14
363 查看
关于Spring , Struts结合学习。
一、前言
刚刚接触了日本一个项目,用的框架名称是Northland Framework,主要用到以下部分
Struts、Spring、iBATIS、Velocity。Struts、Spring如何结合在一起?
二、Spring提供了三种整合Struts的方法:
使用 Spring 的 ActionSupport 类整合 Structs
使用 Spring 的 DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor
将 Struts Action 管理委托给 Spring 框架
(参见Get a better handle on Struts actions, with Spring
http://www-128.ibm.com/developerworks/java/library/j-sr2.html?ca=drs-tp4105
对应还有译文:
http://gocom.primeton.com/modules/techresource/article504.htm?utm_campaign=searchengine&utm_source=baidu&utm_medium=jjpm&utm_term=Spring+Struts)
三、我只关心第三种整合方法:
这种方法通过Spring提供的两个和Struts相关类来实现:org.springframework.web.struts. DelegatingActionProxy,org.springframework.web.struts. ContextLoaderPlugIn。
ContextLoaderPlugIn实现Struts的PlugIn接口,只要在struts-config.xml中有如下配置:
[align=left]<action path="/searchSubmit">[/align] [align=left]type="ca.nexcel.books.actions.DelegatingActionProxy"[/align] [align=left] input="/searchEntry.do"[/align] [align=left] validate="true"[/align] [align=left] name="searchForm">[/align] [align=left] <forward name="success" path="/WEB-INF/pages/detail.jsp"/>[/align] <forward name="failure" path="/WEB-INF/pages/search.jsp"/> [align=left]</action>[/align] [align=left]<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">[/align] [align=left] <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>[/align] </plug-in> |
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
再看DelegatingActionProxy,它继承于Struts的Action,以后struts-config.xml中所有的
Action-mapping都要指向它,只是每个Action-mapping的path不同,将来也是用这个path来区分究竟需要执行beans.xml中的那个类。如下代码:
public ActionForward execute(){ Action delegateAction = getDelegateAction(mapping); return delegateAction.execute(mapping, form, request, response); } |
protected Action getDelegateAction(ActionMapping mapping) throws BeansException { WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig()); String beanName = determineActionBeanName(mapping); return (Action) wac.getBean(beanName, Action.class); } |
是如何取得WebApplicationContext呢:
wac=(WebApplicationContext)actionServlet.getServletContext().getAttribute( ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX); |
SERVLET_CONTEXT_PREFIX 正是 前边提到的ContextLoaderPlugIn中 的attrName。
现在这个原理一目了然,ContextLoaderPlugIn在actionServlet初始化过程中保存
起来留到后面供DelegatingActionProxy用。
四、在另一篇文章中提到在上面的方法中OpenSessionInView Filter不能用
(参照http://wyyhzc.itpub.net/),这个东西我也不熟悉,是不是有不少Spring的东西在这种方式中都不能用呢? 这就说到另一种取得Spring WebApplicationContext的方法:
在web.xml中配置ContextLoaderListener:
[align=left]<context-param>[/align] [align=left] <param-name>contextConfigLocation</param-name>[/align] [align=left] <param-value>[/align] [align=left] /WEB-INF/beans.xml[/align] [align=left] </param-value>[/align] [align=left] </context-param>[/align] [align=left] <listener>[/align] [align=left]<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>[/align] [align=left] </listener>[/align] [align=left] <listener>[/align] [align=left]<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>[/align] </listener> |
Web服务启动的时候,我们去看看ContextLoaderListener作了什么:
WebApplicationContext = createWebApplicationContext(servletContext, parent); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context); |
怎么才能不用ContextLoaderPlugIn而只用ContextLoaderListener?下面我修改
org.springframework.web.struts. DelegatingActionProxy 把它修改成
ca.nexcel.books.actions. DelegatingActionProxy并且修改一下代码:
修改getWebApplicationContext方法
Return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig); 换成下边方法 | |
ServletContext sc = actionServlet.getServletContext(); WebApplicationContext wac = null; wac = WebApplicationContextUtils.getWebApplicationContext(sc); return wac; |
ca.nexcel.books.actions. DelegatingActionProxy,PlugIn删除web.xml加上刚才提到的Listener,启动tomcat运行一切正常。
五、我把northland的配置文件贴出来。
Struts-config.xml: [align=left]<action-mappings>[/align] [align=left] <action[/align] [align=left] path="/list"[/align] [align=left] input="/list.jsp"[/align] [align=left] name="_list"[/align] [align=left] scope="request"[/align] [align=left] type="jp.co.nec.hnes.northland.web.struts.FlowAction"[/align] [align=left] >[/align] [align=left] <display-name>一覧画面</display-name>[/align] [align=left] </action>[/align] [align=left] <action[/align] [align=left] path="/register"[/align] [align=left] input="/register.jsp"[/align] [align=left] name="_register"[/align] [align=left] scope="request"[/align] [align=left] type="jp.co.nec.hnes.northland.web.struts.FlowAction"[/align] [align=left] >[/align] [align=left] <display-name>登録画面</display-name>[/align] </action> | |
Web.xml: [align=left] <context-param>[/align] [align=left] <param-name>contextConfigLocation</param-name>[/align] [align=left] <param-value>[/align] [align=left] classpath:flowConfig.xml,[/align] [align=left] classpath:viewConfig.xml,[/align] [align=left] classpath:applicationContext.xml,[/align] [align=left] classpath:applicationContext-extra.xml[/align] [align=left] </param-value>[/align] </context-param> [align=left]<listener>[/align] [align=left]<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>[/align] [align=left] </listener>[/align] [align=left] <listener>[/align] [align=left]<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>[/align] [align=left] </listener>[/align] [align=left] <servlet>[/align] [align=left] <servlet-name>ActionServlet</servlet-name>[/align] [align=left]<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>[/align] [align=left] <init-param>[/align] [align=left] <param-name>config</param-name>[/align] [align=left] <param-value>/WEB-INF/struts-config.xml</param-value>[/align] [align=left] </init-param>[/align] </servlet> |
从中可以看到
其中的jp.co.nec.hnes.northland.web.struts.FlowAction和
ca.nexcel.books.actions. DelegatingActionProxy的功能差不多。
相关文章推荐
- spring整合struts时创建ApplicationContext的方法
- struts整合spring的3中方法,怕忘记转一下
- Struts 和 Spring 整合3种方法
- Struts+hibernate+Spring的整合方法
- struts+spring+hibernate整合问题解决方法
- Struts与Spring整合方法(网络抽取)
- Struts ,Hibernate ,Spring 常用整合配置方法.
- 整合struts+spring+jpa中出现的解决方法
- 整合struts+spring+jpa中出现的解决方法
- struts整合spring的3中方法
- Struts+hibernate+Spring的整合方法
- struts+spring+hibernate整合出现的问题解决方法
- struts整合spring的3中方法
- Struts与Spring整合的方法
- 【转】spring整合struts时创建ApplicationContext的方法
- Struts+hibernate+Spring的整合方法
- Spring整合Struts的三种方法
- 整合Spring与Struts的几种方法
- Struts整合spring方法(二)
- Struts整合spring方法(二)