Spring3.x_Struts2.x_Hibernate3.x整合
1.导入Struts2的包(导入之后检查一下是否存在冲突的包)
Struts2下载地址:http://struts.apache.org/download.cgi
2.导入Struts2和Spring整合的包(struts2-spring-plugin-2.3.16.3.jar)
3.配置struts2的struts.xml配置文件
<!-- 表示Action由Spring来进行创建,可以直接使用Spring的依赖注入来注入value="org.apache.struts2.spring.StrutsSpringObjectFactory"-->
<constant name="struts.objectFactory" value="spring" />
/** * 此时等于用Spring来创建了userAction对象, * 在struts的配置文件中写Action的class的时候就不能写类, * 而应该写userAction中对象 * @author sunlight * */ @Controller("userAction")
<!-- 基于通配符的方式,由于整合了Spring在class中不用使用完整的类了,而一个使用Spring所注入的对象, 如userAction就应该使用userAction来创建,此处特别注意,第一个字母是小写,文件夹就应该使用小写的 --> <action name="*_*" class="{1}Action" method="{2}"> <!-- 在action中引入相应的拦截器,如果在action中引入了相应的拦截器之后, 原有得继承自struts-default.xml的拦截器就不起作用了,此时需要手动引入 --> <!-- <interceptor-ref name="helloStack"/> --> <result>/WEB-INF/jsp/{1}/{2}.jsp</result> <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result> <result name="redirect" type="redirect">/${url}</result> </action>
<!-- 创建Spring的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Context Configuration locations for Spring XML files --> <!-- Spring的监听器可以通过这个上下文参数来获取beans.xml的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:beans.xml</param-value> --> <param-value>classpath*:beans.xml</param-value> </context-param>
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
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_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 创建Spring的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Context Configuration locations for Spring XML files --> <!-- Spring的监听器可以通过这个上下文参数来获取beans.xml的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:beans.xml</param-value> </context-param> <!-- 表单处理乱码 --> <filter> <filter-name>CharacterFilter</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> </filter> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!-- 打开Spring的Annotation的支持 --> <context:annotation-config /> <!-- 设定Spring去哪些包中找Annotation --> <context:component-scan base-package="org.oms.spring" /> <!-- 创建数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置连接池的初始值 --> <property name="maxActive" value="500" /> <!-- 最大空闲时,当经过一个高峰之后,连接池可以将一些用布到的连接释放,一直减少到maxIdle为止 --> <property name="maxIdle" value="20" /> <!-- 当最小空闲时,当连接少于minIdle时会自动申请一些连接 --> <property name="minIdle" value="1" /> <property name="maxWait" value="1000" /> </bean> <!-- 导入src下的jdbc.properties --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 创建sessionFactory工厂 --> <!-- 如果使用的是Annotation方式不能使用org.springframework.orm.hibernate3.LocalSessionFactoryBean,而应该使用org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 设置Spring去那个包中查找相应的实体类 --> <property name="packagesToScan"> <value>org.oms.spring.model</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.format_sql">false</prop> </props> </property> </bean> <!-- 开启HibernateTemplate,并且为其注入sessionFactory, 使用HibernateTemplate不太方便的就是要获取session得通过getSessionFactory() --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置Spring的事物处理 --> <!-- 创建事物管理器 --> <!-- SessionFactory, DataSource, etc. omitted --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置AOP,Spring是通过AOP来进行事物管理的 --> <aop:config> <!-- 设置pointcut表示哪些方法要加入事物处理 --> <aop:pointcut id="allMethods" expression="execution(* org.oms.spring.dao.*.*(..))" /> <!-- 通过advisor来确定具体要加入事物控制的方法 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" /> </aop:config> <!-- 配置哪些方法要加入事物控制 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- 让所有方法都加入事物管理(效率低,实际使用中按需处理) --> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> </beans>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- Some or all of these can be flipped to true for debugging --> <constant name="struts.devMode" value="false" /> <constant name="struts.configuration.xml.reload" value="false" /> <constant name="struts.i18n.reload" value="false" /> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <constant name="struts.action.extension" value="action,do" /> <!-- 表示Action由Spring来进行创建,可以直接使用Spring的依赖注入来注入 --> <constant name="struts.objectFactory" value="spring" /> <package name="default" namespace="/" extends="struts-default"> <default-action-ref name="index" /> <!-- 全局结果集,所有action相应的返回值来找对应的处理页面 --> <global-results> <result name="error">/error.jsp</result> </global-results> <!-- 定义异常处理页面 --> <global-exception-mappings> <exception-mapping exception="org.oms.spring.exception.UserException" result="error" /> </global-exception-mappings> <action name="index"> <result>/index.jsp</result> </action> <!-- 基于通配符的方式,由于整合了Spring在class中不用使用完整的类了,而一个使用Spring所注入的对象, 如userAction就应该使用userAction来创建,此处特别注意,第一个字母是小写,文件夹就应该使用小写的 --> <action name="*_*" class="{1}Action" method="{2}"> <!-- 在action中引入相应的拦截器,如果在action中引入了相应的拦截器之后, 原有得继承自struts-default.xml的拦截器就不起作用了,此时需要手动引入 --> <!-- <interceptor-ref name="helloStack"/> --> <result>/WEB-INF/jsp/{1}/{2}.jsp</result> <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result> <result name="redirect" type="redirect">/${url}</result> </action> </package> <!-- Add packages here --> </struts>
package org.oms.spring.action; import javax.annotation.Resource; import org.oms.spring.model.Group; import org.oms.spring.service.IGroupService; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; @SuppressWarnings("serial") /** * 此时等于用Spring来创建了groupAction对象, * 在struts的配置文件中写Action的class的时候就不能写类, * 而应该写groupAction中对象 * @author sunlight * */ @Controller("groupAction") @Scope("prototype") public class GroupAction extends ActionSupport implements ModelDriven<Group>{ private IGroupService groupService; private Group group; @Override public Group getModel() { if (group==null) { group=new Group(); } return group; } public IGroupService getGroupService() { return groupService; } @Resource public void setGroupService(IGroupService groupService) { this.groupService = groupService; } public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } public String list(){ ActionContext.getContext().put("gl", groupService.list()); return SUCCESS; } }
浏览器测试结果图:
个人备忘笔记~~~呵呵!