`

struts1.2和spring2.5.X的整合几种方式

    博客分类:
  • SSH
阅读更多

struts1.2和spring的整合几种方式
使用了struts和spring一段时间.但是对其中他们的整合也用了好几次.就这次机会总结下经验并整理下思绪.
整合方式1:
最原始而易懂的方式:
Action继承spring提供的类org.springframework.web.struts.MappingDispatchActionSupport
Action中的代码:
Java代码
1.    public class UserAction extends MappingDispatchActionSupport {   
2.    public ActionForward login(ActionMapping mapping, ActionForm form,   
3.                 HttpServletRequest request, HttpServletResponse response)   
4.                throws Exception {   
5.             String uname = request.getParameter("uname");   
6.             String upass = request.getParameter("upass");   
7.            //使用其自带的一个方法实例化ApplicationContext对象   
8.             ApplicationContext context = this.getWebApplicationContext();   
9.             userService=(UserService)context.getBean("userService");   
10.             User user = userService.findByName(uname, upass);   
11.            if (user==null) {   
12.                 request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");   
13.                   
14.                return mapping.findForward("failure");   
15.             } else {   
16.                 request.getSession().setAttribute("user", user);   
17.                return mapping.findForward("success");   
18.                   
19.             }   
20.         }   
21.    }  

struts-config.xml代码:
Java代码
1.    <action path="/login" parameter="login"  
2.                 type="com.addresslist.action.UserAction" scope="request">   
3.                 <forward name="success" path="/page/index.htm"></forward>              
4.             </action>  

你会发现使用这种方法的话.直接可以保持你原先struts的配置.只需要改变一下你相应的Action类继承MappingDispatchActionSupport.
其中缺点就是:你的Action将会和Spring耦合在一起.当你有多个Action类都继承MappingDispatchActionSupport的话你将会每次都需要调用

getWebApplicationContext()获取ApplicationContext的实例.这样如果你想放弃使用spring的话.所要修改的代码量将非常大

整合方式2:
启动Spring再在相应的Action类中实例化ApplicationContext
spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.
我的测试使用的ContextLoaderListener
web.xml的配置:
Java代码
1.    <!--     
2.        //可以选择使用ContextLoaderServle   
3.         <servlet>   
4.       <servlet-name>springInitServlet</servlet-name>   
5.         <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>   
6.            // 如果使用要注意这里设置开启的优先级要比Struts的ActionServlet高   
7.         <load-on-startup>2</load-on-startup>   
8.       </servlet>   
9.         -->   
10.         <context-param>   
11.         <param-name>contextConfigLocation</param-name>   
12.         <param-value>/WEB-INF/applicationContext.xml</param-value>   
13.       </context-param>   
14.       <!-- 使用ContextLoaderListener -->   
15.         <listener>   
16.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
17.         </listener>  

与整合1主要的变化是使用了 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
形成spring的环境
struts-config.xml代码:
Java代码
1.    <action path="/login" parameter="login"  
2.                 type="com.addresslist.action.UserAction" scope="request">   
3.                 <forward name="success" path="/page/index.htm"></forward>              
4.             </action>   
5.    <!--   
6.             可以选择使用   
7.             <plug-in   
8.             className="org.springframework.web.struts.ContextLoaderPlugIn">   
9.             <set-property property="contextConfigLocation"  
10.                 value="/WEB-INF/applicationContext.xml" />   
11.         </plug-in>   
12.    -->  

Action的代码:
Java代码
1.    public class UserAction extends MappingDispatchAction {   
2.    public UserService getFileService(){   
3.    //这里使用了WebApplicationContextUtils工具类实例化ApplicationContext   
4.             ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());   
5.            return (UserService) ac.getBean("userService");   
6.         }   
7.      
8.        public ActionForward login(ActionMapping mapping, ActionForm form,   
9.                 HttpServletRequest request, HttpServletResponse response)   
10.                throws Exception {   
11.             String uname = request.getParameter("uname");   
12.             String upass = request.getParameter("upass");   
13.               
14.             User user = getFileService().findByName(uname, upass);   
15.            if (user==null) {   
16.                 request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");   
17.                   
18.                return mapping.findForward("failure");   
19.             } else {   
20.                 request.getSession().setAttribute("user", user);   
21.                return mapping.findForward("success");   
22.                   
23.             }   
24.         }   
25.    }  

WebApplicationContextUtils(参考于http://tech.ddvip.com/2007-08/118764954132510_8.html)

  当 Web 应用集成 Spring 容器后,代表 Spring 容器的EebApplicationContext 对象将以

  WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在 ServletContext 属性列表中。您当然可以直接通过以下语句获取

WebApplicationContext:

  WebApplicationContext wac = (WebApplicationContext)servletContext.

  getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:

  WebApplicationContext wac =WebApplicationContextUtils.

  getWebApplicationContext(servletContext);
  当 ServletContext 属性列表中不存在 WebApplicationContext 时,getWebApplicationContext() 方法不会抛出异常,它简单地返回 null。如果后续代码直接

访问返回的结果将引发一个 NullPointerException 异常,而 WebApplicationContextUtils 另一个 getRequiredWebApplicationContext(ServletContext sc) 方法

要求 ServletContext 属性列表中一定要包含一个有效的 WebApplicationContext 对象,否则马上抛出一个 IllegalStateException 异常。我们推荐使用后者,因为

它能提前发现错误的时间,强制开发者搭建好必备的基础设施。

通过该方式整合我们只需要进行启动Spring和在相应的Action类获取WebApplicationContext .这样子对Spring的耦合降低


整合方式3:将动作管理委托给 Spring
将Struts的动作管理委托给Spring.使用Struts-config.xml的动态映射中注册一个代理.
代理负责在Spring中找到Struts的动作.由于动作在Spring的控制之下.所以Spring可以对Action进行javaBean的注入和Spring的一些Aop使用
需要发生改变的配置有:
Struts-config.xml:
Java代码
1.    <struts-config>   
2.         <data-sources />   
3.         <form-beans />   
4.         <global-exceptions />   
5.         <global-forwards />   
6.         <action-mappings>   
7.              <!--这里使用了org.springframework.web.struts.DelegatingAction-->   
8.         <action path="/login" parameter="login" type="org.springframework.web.struts.DelegatingActionProxy">   
9.         <forward name="success" path="/page/index.htm"/>   
10.         <forward name="failure" path="/page/fail.htm"/>   
11.         </action>   
12.         </action-mappings>   
13.           
14.      
15.         <message-resources   
16.             parameter="com.addresslist.properties.ApplicationResources" />   
17.    <!--这里使用ContextLoaderPlugIn建立Spring的环境-->   
18.         <plug-in   
19.             className="org.springframework.web.struts.ContextLoaderPlugIn">   
20.    <set-property property="contextConfigLocation"  
21.                 value="/WEB-INF/applicationContext.xml" />   
22.    </plug-in>  

Action中的代码:
Java代码
1.    public class UserAction extends MappingDispatchAction {   
2.    //使用普遍依赖注入方式   
3.    UserService userService;   
4.    public void setUserService(UserService userService) {   
5.            this.userService = userService;   
6.    }   
7.    public ActionForward login(ActionMapping mapping, ActionForm form,   
8.                 HttpServletRequest request, HttpServletResponse response)   
9.                throws Exception {   
10.             String uname = request.getParameter("uname");   
11.             String upass = request.getParameter("upass");   
12.            //直接使用userService   
13.             User user = userService.findByName(uname, upass);   
14.            if (user==null) {   
15.                 request.setAttribute("error", "对不起,您输入的用户名或者密码错误!");   
16.                   
17.                return mapping.findForward("failure");   
18.             } else {   
19.                 request.getSession().setAttribute("user", user);   
20.                return mapping.findForward("success");   
21.                   
22.             }   
23.         }   
24.    }  

这个配置只于传统的struts-config的配置.这里使用的是Spring的注册代理.而不是直接使用相应Action类的完整类名.
这里使用的ContextLoaderPlugIn.声明的环境。通过DelegatingActionProxy使用动作映射名/login在Spring环境中找到相应的Action.所以我们需要在Spring环境中注

册一个Struts的动作:
Java代码
1.    <bean name="/login" class="com.addresslist.action">   
2.    <property name="userService" ref="userService"></property>   
3.    </bean>  

这个方法可以说是多数人认可最好的方法:
这个方法的使用只在配置文件中着手不需要对源码进行修改.将struts动作放置到Spring中使得其享受了Spring提供的各种好处.一旦让 Spring 控制您的 Struts 动作

,您就可以使用 Spring 给动作补充更强的活力。例如,没有 Spring 的话,所有的 Struts 动作都必须是线程安全的。如果您设置 <bean> 标记的 singleton 属性

为“false”,那么不管用何种方法,您的应用程序都将在每一个请求上有一个新生成的动作对象。您也可以利用 Spring 的生命周期方法。例如,当实例化 Struts 动

作时,<bean> 标记的 init-method 属性被用于运行一个方法。类似地,在从容器中删除 bean 之前,destroy-method 属性执行一个方法.

整合方式4:
使用 org.springframework.web.struts.DelegatingRequestProcessor 类来覆盖 Struts 的 RequestProcessor 处理程序
只需要在struts-config.xml中配置:
Java代码
1.    <action-mappings>   
2.         <action path="/login" parameter="login" type="com.addresslist.action.UserAction">   
3.         <forward name="success" path="/page/index.htm"/>   
4.         <forward name="failure" path="/page/fail.htm"/>   
5.         </action>   
6.    <!--下面controller配置是核心-->   
7.    <controller processorClass="org.springframework.web.struts.   
8.        DelegatingRequestProcessor"/>   
9.    <plug-in   
10.             className="org.springframework.web.struts.ContextLoaderPlugIn">   
11.    <set-property property="contextConfigLocation"  
12.                 value="/WEB-INF/applicationContext.xml" />   
13.    </plug-in>  

Struts中的action配置则无需配置type属性(即使配置了type属性也不起任何作用,除非在spring的配置文件里找不到对应的name属性值)
其他的配置和类使用和整合方式3一样.
这个设计方式是使用Spring提供的一个RequestProcessor来进行工作.这里如果对struts工作流程比较熟悉的话就指定struts1.2真正工作的核心是RequestProecssor和

Action.
这里使用Spring的DelegatingRequestProcessor替换了struts的RequestProcessor.可以使得struts享受到Spring的控制容器.网上人都不建议使用这种方法.因为考虑

到效率和方法使用寿命的问题.所以我也比较少用.
总结语:
通过以上的总结。大概了解了struts和Spring整合的几种方式.



.

分享到:
评论

相关推荐

    struts1.2 + spring2.5 + hibernate3.2框架demo

    Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...

    Struts2升级到2.5.30,问题解决及过程记录

    2. **配置文件的调整**:Struts2的配置文件(如struts.xml)可能会因版本升级而需要调整。例如,新的版本可能会引入新的拦截器或动作配置,需要检查并更新配置以充分利用新特性。 3. **API变化**:新版本可能移除了...

    struts2+spring2.5.x

    Struts2 和 Spring 2.5.x 是两个非常流行的开源框架,它们在Java Web开发中被广泛使用。Struts2 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它极大地简化了Java Servlet API的使用。而Spring则...

    struts2.3.24升级2.5.26.zip

    4. **配置文件修改**:Struts2的配置文件(如struts.xml)可能需要更新以适应新版本的要求。检查并更新配置,包括拦截器栈、结果类型、包配置等。注意,新版本可能会有新的配置选项或废弃旧的。 5. **安全更新**:...

    Struts1.2+Spring2.5+Hibernate3.2框架搭建(一)

    文档"Struts1.2+Spring2.5+Hibernate3.2框架搭建(周禄康).doc"和"Struts1.2+Spring2.5+Hibernate3.2框架搭建(原版)(周禄康).doc"可能包含了详细的步骤和示例代码,帮助读者理解如何实际操作。"Struts+...

    用户登录(Struts1.2+Spring2.5+Hibernate3.2)

    1、可以运行(发布后,删除\Tomcat 6.0\webapps\ssh\WebRoot\WEB-INF\lib下的asm-2.2.3.jar) 2、采用Struts1.2 + Spring2.5 + Hibernate3.2 整合开发 3、SSH入门级实例

    hibernate3.2+struts1.2+spring2.5整合源码带数据库表结构

    SSH整合是Java开发中一种常见的技术栈组合,指的是Spring、Struts和Hibernate三个开源框架的集成。本项目提供了"hibernate3.2+struts1.2+spring2.5"的整合源码,旨在帮助开发者理解并实践这三者如何协同工作,实现一...

    Hibernate3.1+Struts1.2+Spring2.5整合小项目

    在Java EE应用开发中,SSH(Struts、Spring、Hibernate)框架的整合是常见的技术实践,这个名为" Hibernate3.1+Struts1.2+Spring2.5整合小项目 "的示例提供了如何将这三个组件集成到一个小型应用程序中的教程。...

    struts2-spring-2.5.14.1.jar

    这个版本(2.5.14.1)是Struts2与Spring整合的一个较新的发行版,包含了源代码和帮助文档,为开发者提供了深入学习和调试的资源。 **Struts2** 是一个基于MVC(Model-View-Controller)架构的Web应用框架,它主要...

    Java SSH框架整合搭建Web系统(Struts1.2+Spring2.5+Hibernate3.2)

    ### Java SSH框架整合搭建Web系统(Struts1.2+Spring2.5+Hibernate3.2) #### 一、准备工作 在开始构建基于Struts1.2+Spring2.5+Hibernate3.2的Web应用之前,需要进行一系列的基础设置工作。 **1.1 创建工程** ...

    Struts1.2+Spring2.5+Hibernate3.2+Jmesa2.4.3+Jmesatag实例2分页A

    一个Struts1.2+Spring2.5+Hibernate3.2+Jmesa2.4.3+JmesaTag实现的强大分页控件例子 里 面有action实现分页和标签实现分页2个例子 action实现的分页 包括了表头排序,导出为PDF,TXT, excel等格式 jar包和数据库...

    struts1.2+spring2.5+hibernate3.2学习实例(Eclipse)

    由于上传限制,lib包不能上传,大家可以下载spring2.5版本的支持库(下最大的那个zip包),全部加进去就行了,还有mysql的连接包,项目很简单,直接导入eclipse,就可以使用,包内有mysql的sql文件,框架已经搭好,...

    搭建Struts1.2+Spring2.5+Hibernate3.2框架(Hibernate集成包)

    Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,通常被称为SSH框架。这个组合在过去的很多项目中被广泛使用,为开发人员提供了强大的模型-视图-控制器(MVC)架构支持,以及灵活的数据持久化...

    Myeclipse6.5GA__struts1.2_spring2.5_hibernate3.2

    这篇教程主要介绍的是如何在MyEclipse 6.5环境下整合Struts 1.2、Spring 2.5和Hibernate 3.2这三个流行的Java Web开发框架,以便于初学者理解SSH框架的工作机制并避免常见错误。 首先,教程强调了在高版本的...

    struts2.5.14.1最少的jar包

    Struts2.5.14.1是该框架的一个版本,它引入了若干增强功能和修复了已知问题,以提升开发效率和应用稳定性。 在Struts2.5.14.1中,为了实现基本功能,至少需要8个核心JAR文件。这些JAR文件包含了框架的核心组件、...

    struts2+spring2.5+hibernate3.2整合完整项目,带数据库脚本

    Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...

    SSH1整合代码简单的(struts1.2+Hibernate2.5+Spring2.5)

    在本文中,我们将深入探讨SSH1整合的关键知识点,并以"SSH1整合代码简单的(struts1.2+Hibernate2.5+Spring2.5)"为背景,解析它们如何协同工作。 **Struts1.2** 是MVC设计模式的实现,主要用于处理用户界面与业务...

Global site tag (gtag.js) - Google Analytics