Struts2和Spring整合中的一些问题

来源:互联网 发布:网络推广软件三尾狐 编辑:程序博客网 时间:2024/05/19 18:48

前言

为了学习web开发的经典的SSH框架,首先学习了struts2框架,struts2的一些问题在上一篇博客中说明了,这篇博客主要是说在整合struts2和Spring的一些理解。学习整个框架最好是先搞懂每个框架的位置和作用,最后再整合。此文不能作为新手的搭建教程,因为具体的搭建过程示例很少,只是帮助理解整合的原理。


怎样整合struts2和Spring

  • 首先搭建好struts2框架,能够跑通代码。
  • 下载spring的jar包,导入相关的包,注意,我们要实现struts2和spring的连接,必须要有桥梁,这个桥梁有两个,第一个就是struts2-spring-plugin x.x.x.jar(这个插件是struts2可以识别Spring并和spring联合的关键插件,这个插件的版本必须和struts2框架搭建的其他的依赖包的版本一致尤其是xwork-corn.jar版本一致,我因为这个之前搭建struts2时没有用到struts2-spring-plugin x.x.x.jar包,最后在整合时重新下载的包版本不一致,导致没法正常启动)第二个桥梁就是在web系统中申明自己要使用spring,申明的办法就是在web.xml配置文件中添加spring的监听器,如下所示:
<listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  • 桥梁搭通之后,就该考虑怎么使用spring框架,上一篇说过struts2的Action实质上是一个Bean,每次发送请求,过滤器(相当于Controller)决定执行哪一Action,而在这之前提交的数据已经通过setData方法注入到Bean中,一旦调用Action,就会执行Action中的excute方法,得到执行结果后会查询struts2.xml文件,struts2.xml文件中早就定义好了不同返回结果所对应的view,也就是相对应要返回的x.jsp页面。根据不同的返回结果跳转到相应的结果页面(这里又涉及到数据传输,结果页面不仅仅是静态固定的页面,有可能是需要携带处理之后的数据的,结果页面有两种方式可以得到提交的数据,第一种:由于之前的数据在提交之后就注入到Bean中,所以可以利用struts2的标签特性,直接从Bean中提取,具体方法代码之后添加。第二种:session,在excute方法中创建session对象然后注入数据,在jsp结果页中调用session获取数据。
  • struts2通过自身的反射机制通过ObjectFactory来创建Action类,所以我们一般在struts.xml中会申明创建Action的方式,<bean
    class="com.opensymphony.xwork2.ObjectFactory"
    name="struts"/>
    ,这段代码就说明Action是由struts2的ObjectFactoy来创建,而整合这两个框架的实质就是将Action对象的创建托管给spring容器,所以我们需要修改上一段代码:
<!-- 在struts配置文件中引入spring,并且把由struts2自己产生action的 方法,变成由Spring容器产生,覆盖本身有struts2本身产生的ObjectFactory,进入class源代码 -->    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />    <!--  Make the Spring object factory the automatic default -->    <constant name="struts.objectFactory" value="spring" />
  • 修改完成之后,struts.xml中之前定义的action的class的地址就不能写之前的地址了,因为创建对象的权利已经交给spring了,所以这里只能填写引用名,这个引用名比如class=“loginAction”,loginAction的真正的创建是在spring容器里,而spring容器中定义和申明这些action应该书写在applicationContext.xml文件中(此文件为spring的配置文件),该文件中可能需要先定义一个applicationContext的路径,一般默认和web.xml在同一目录下。之后就是对各个Action的定义,在applicationContext.xml中的<beans></beans>标签中挨个定义<bean>,每个<bean>都对应一个Action:
<bean name="loginAction" class="ly.struts2.loginAction">     <property name="user">          <bean class="ly.struts2.User"></bean>     </property></bean>
  • 这里的class="ly.struts2.loginAction"则是之前在struts.xml的用引用名“loginAction”替代的之前的类地址。

整合完成后的整体运行流程

struts的运行流程在上篇已经说明了,大概说下整合之后的SS框架的实现流程,首先系统通过web.xml文件监听到spring容器的存在,然后配置struts2。在view端提交用户请求之后,struts查询struts.xml发现struts将action的创建托管给了spring,然后继续调用struts2.xml中的action定义,通过引用名查询spring的配置文件appliactionContext.xml中的对应的bean,然后spring创建相应的Action,并执行操作将结果返回给struts。之后struts根据结果返回相应的jsp。


结尾

记录自己刚开始学习软件工程的一些理解和感悟,在错误中前进。