本文采用struts2.3.16+hibernate3.6+spring3.2.8进行整合
jar包列表
- antlr-2.7.6.jar
- aopalliance-1.0.jar
- asm-3.3.jar
- asm-commons-3.3.jar
- aspectjweaver.jar
- commons-collections-3.1.jar
- commons-dbcp-1.2.1.jar
- commons-fileupload-1.3.1.jar
- commons-io-2.2.jar
- commons-lang3-3.1.jar
- commons-logging-api.jar
- commons-logging.jar
- commons-pool-1.2.jar
- dom4j-1.6.1.jar
- freemarker-2.3.19.jar
- hibernate-jpa-2.0-api-1.0.1.Final.jar
- hibernate3.jar
- javassist-3.18.1-GA.jar
- jta-1.1.jar
- mysql-connector-5.1.8.jar
- ognl-3.0.6.jar
- slf4j-api-1.6.1.jar
- spring-aop-3.2.8.RELEASE.jar
- spring-beans-3.2.8.RELEASE.jar
- spring-context-3.2.8.RELEASE.jar
- spring-context-support-3.2.8.RELEASE.jar
- spring-core-3.2.8.RELEASE.jar
- spring-expression-3.2.8.RELEASE.jar
- spring-jdbc-3.2.8.RELEASE.jar
- spring-orm-3.2.8.RELEASE.jar
- spring-tx-3.2.8.RELEASE.jar
- spring-web-3.2.8.RELEASE.jar
- struts2-convention-plugin-2.3.16.1.jar
- struts2-core-2.3.16.1.jar
- struts2-spring-plugin-2.3.16.1.jar
- xwork-core-2.3.16.1.jar
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SSH1</display-name>
<!--
当hibernate采用懒加载时需要用到此过滤器,位于struts过滤器之前,
因为必须等struts处理完JSP后才能关闭session;如果spring没有配置
事务边界,则openSessionInView会认为所有事务为readonly,进行增删
改动作时会报错
-->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<!-- 查看源码可知,可过滤器依赖名字为“sessionFactory”的bean,
如果默认名字不是“sessionFactory”,需要加如下初始化参数。
-->
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sf</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<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>/*</url-pattern>
</filter-mapping>
<!-- spring容器初始化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 加载的配置文件,具体参考spring的文章 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:beans.xml</param-value>
</context-param>
</web-app>
另外几个注意点
1.struts2集成spring需加入struts-spring-plugin-2.3.16.jar,在此jar包中有个struts-plugin.xml,其中有个属性为struts.objectfactory=spring。
3.action有两种产生方式
3.1 由struts产生,会自动产生多实例
action中的属性会自动按照name注入(对应struts-spring.xml的属性为struts.objectfactory.spring.autowire=name),如果存在对应名字的bean,则属性不需要加@resource注解;如果不存在相应的名字的bean,则会注入失败,此时应该加上@Resource。或者将struts.objectfactory.spring.autowire=type。
action示例注解如下:
@Action(value="userAction",
results={@Result(name="list",location="/listuser.jsp")})
3.2 由spring产生
action交由spring管理。示例如下:
@Controller("userAction")
@Scope("prototype")
@Action(className="userAction",value="userAction"
results={@Result(name="list",location="/listuser.jsp")})
注意scope注解必须加,以及@Action中加className代表引用的spring容器的bean
4.中文问题,有如下几种办法
a.在struts2.1.6以上版本,直接找struts默认配置文件default.properties文件中的常量struts.i18n.encoding,看看此属性的值是什么,默认是UTF-8,注意JSP也要是UTF-8。
b.如果是struts2.1.6以下版本,可以自己写fitler(参考spring的实现)或者用spring提供的过滤器。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>