1.上一章集成了spring和hibernate, 这一章节再讨论把struts2集成的方案。
2.在解压了struts-2.3.12-all.zip之后有个apps 目录, 这里面是struts2的一些使用示例, 我们使用winrar解压struts2-blank.war,解压后到WEB-INF/lib 目录把所有jar文件拷贝到项目WEB-INF/lib目录下面, 之前hibernate中带了一个javaassist-3.15.0.jar, struts2中带了javaassist-3.11.0.jar文件,会冲突, 需要把avaassist-3.11.0.jar 删除, 保留高版本。 如果整合后报velocity-tool 的错误,还有其他几个jar文件也需要加入velocity-1.7.jar velocity-tools-2.0.jar。 在解压了struts-2.3.12-all.zip之后有个lib 目录下拷贝struts2-spring-plugin-2.3.12.jar 到项目中, 此jar包是spring 和 struts2 整合的jar。
3.在解压了struts-2.3.12-all.zip之后有个apps 目录, 到WEB-INF/classes 目录下面 把struts.xml拷贝到项目src目录下面。
4.3. spring 和 struts2 整合提供了两种方案
第一:把struts2 action类完全交给spring 来创建 一般配置如下
@Controller("userAction")
@Scope("prototype")
public class UserAction {
}
需要把UserAction交给spring来创建对象, 并且需要写@Scope("prototype") 如果不写上就会有线程安全的问题, 默认struts2 创建的action 都是多实例的, 因此需要开发人员不要遗忘写上这个属性,否则很容易引起bug
struts.xml配置
<action name="userList" class="userAction" method="userList"> <result name="success"> /WEB-INF/page/user/user_list.jsp </result> </action>
此处action标签配置上的class=”userAction” 名称则是刚才在UserAction类上面注解重命名的名称, 如果UserAction 里面有些类属性是交给spring 管理, spring则可以自动注入。
第二: 由struts2-spring-plugin-2.3.12.jar 插件来创建action实例
struts.xml配置
<constant name="struts.objectFactory" value="spring" /> <actionname="userList"class="com.lysoft.web.action.user.UserAction" method="userList"> <result name="success"> /WEB-INF/page/user/user_list.jsp</result> </action>
此处action标签配置上的class=”com.lysoft.web.action.user.UserAction” 名称则是UserAction类全路径的名称,这样的好处在于不用写@Scope("prototype")
避免了开发人员不小心犯错, 如果UserAction 里面有些类属性是交给spring 管理
spring则也可以自动注入。
Struts2 在匹配一个请求时,到配置文件中查找和请求相同的action标签, 如果配置了<constant name="struts.objectFactory" value="spring" />
会根据标签上面的class 属性上面的值, 到spring配置文件中查找是否配置了对应的bean节点, 查找到了则有spring来创建action, 如果查找不到会由struts2 的插件创建action的实例。
总结: 推荐使用第二种方法, 避免不小心犯下错误。
5. 在项目中的web.xml 文件加入如下配置:
<!-- 初始化Spring Beans --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- log4j 和spring 的整合 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>ssh2.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 使用Spring提供的编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- openSessioInView 需要放在strts2的前面 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <!-- 当sessionFactory名称不叫sessionFactory的时候 使用下面的配置 --> <!-- <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>mySessionFactory</param-value> </init-param>--> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <!-- 拦截Struts2 Action --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
6.至此已经完成struts2.12+spring3.2+hibernate4.2的集成了, 下一章节讨论测试3个框架整合是否正常。