Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建这个框架的经验总结,有很多人搭建这个框架总会遇到
大大小小的问题,网上也没有什么行之有效的方案或成体系的介绍,所以我就决定总结一下我的搭建过程。给一些搭
建尚存问题的朋友提供帮助。
我用这个框架,实现的是基本的CRUD功能的一个雇员管理系统,本来打算丰富一下功能,但是一直没能抽出空去搞。
目前版本暂定为1.0,除了CRUD外还配置了表单验证框架JSValidation。功能都能很顺利的实现。
现在分享部分源码,来说明一些注意事项。
以下是部分搭建过程及源码:
1.先组合实现Hibernate3.2+Spring2.5支持,删除hibernate.cfg.xml文件,修改applicationContext.xml文件的内容,增加SessionFactory和dataSource的设置。
2.通过MyEclipse的向导方式,生成POJO类和对应的映射文件。
3.修改applicationContext.xml文件中<property name="mappingResources">元素的内容。
4.编写DAO接口和实现类。
5.修改applicationContext.xml文件,增加对Dao实现类的配置。
6.组合Struts2和Spring2.5,修改web.xml文件,增加struts2的所需要的过滤器配置。
7.增加struts2相应类库,增加struts2与spring的配置jar包。
8.拷贝struts.xml文件到src根目录下,再修改struts.xml文件,进行常量配置。
9.修改web.xml文件,配置Spring监听器,和上下文变量。并增加OpenSessionInViewFilter的设置。
10.写入action类。
11.配置struts.xml文件。
12.修改applicationContext.xml
13.编写Jsp文件。
14.加载运行项目。
下面是关键文件的源码:
struts.xml源码:
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
<!-- struts2委托spring管理 -->
< constant name ="struts.objectFactory" value ="spring" />
<!-- /crm/emp/add.action -->
< package name ="crm_employee" extends ="struts-default" namespace ="/emp" >
< action name ="add" class ="addBean" method ="add" >
< result > add.action </ result >
< result > /emp/add_suc.jsp </ result >
</ action >
< action name ="list" class ="listBean" method ="list" >
< result > /emp/list.jsp </ result >
</ action >
< action name ="delete" class ="deleteBean" method ="delete" >
< result > delete.action </ result >
< result > /emp/delete_suc.jsp </ result >
</ action >
< action name ="update" class ="updateBean" method ="update" >
< result > update.action </ result >
< result > /emp/edit_suc.jsp </ result >
</ action >
< action name ="edit" class ="editBean" method ="edit" >
< result > /emp/edit.jsp </ result >
</ action >
<!-- Add actions here -->
</ package >
</ struts >
web.xml源码:
< web-app version ="2.5" xmlns ="http://java.sun.com/xml/ns/javaee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
<!-- 配置spring的监听器 -->
< context-param >
< param-name > contextConfigLocation </ param-name >
< param-value > /WEB-INF/applicationContext*.xml </ param-value >
</ context-param >
<!-- 开启监听 -->
< listener >
< listener-class >
org.springframework.web.context.ContextLoaderListener
</ listener-class >
</ listener >
<!-- 配置OpenSessionInViewFilter,必须在struts2监听之前 -->
< filter >
< filter-name > lazyLoadingFilter </ filter-name >
< filter-class >
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</ filter-class >
</ filter >
<!-- 设置监听加载上下文 -->
< filter >
< filter-name > struts2 </ filter-name >
< filter-class >
org.apache.struts2.dispatcher.FilterDispatcher
</ filter-class >
</ filter >
< filter-mapping >
< filter-name > lazyLoadingFilter </ filter-name >
< url-pattern > *.action </ url-pattern >
</ filter-mapping >
< 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 >
applicationContext.xml源码:
< beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop ="http://www.springframework.org/schema/aop"
xmlns:tx ="http://www.springframework.org/schema/tx"
xsi:schemaLocation ="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" >
<!-- 配置Hibernate支持 -->
< bean id ="dataSource"
class ="org.apache.commons.dbcp.BasicDataSource" >
< property name ="driverClassName"
value ="com.mysql.jdbc.Driver" >
</ property >
< property name ="url"
value ="jdbc:mysql://localhost:3306/tables" >
</ property >
< property name ="username" value ="root" ></ property >
< property name ="password" value ="hicc" ></ property >
</ bean >
< bean id ="sessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
< property name ="dataSource" >
< ref bean ="dataSource" />
</ property >
< property name ="hibernateProperties" >
< props >
< prop key ="hibernate.dialect" >
org.hibernate.dialect.MySQLDialect
</ prop >
< prop key ="hibernate.show_sql" > true </ prop >
</ props >
</ property >
< property name ="mappingResources" >
< list >
< value > com/sy/crm/model/Employee.hbm.xml </ value >
</ list >
</ property >
</ bean >
< bean id ="employeeDao"
class ="com.sy.crm.dao.hibernate.EmployeeDaoHibernate" >
< property name ="sessionFactory" >
< ref bean ="sessionFactory" />
</ property >
</ bean >
< bean id ="employeeManager"
class ="com.sy.crm.service.impl.EmployeeManagerImpl" >
< property name ="employeeDao" >
< ref bean ="employeeDao" />
</ property >
</ bean >
< bean id ="addBean" class ="com.sy.crm.action.EmployeeAction" scope ="prototype" >
< property name ="employeeManager" >
< ref bean ="employeeManager" />
</ property >
</ bean >
< bean id ="listBean" class ="com.sy.crm.action.EmployeeAction" scope ="prototype" >
< property name ="employeeManager" >
< ref bean ="employeeManager" />
</ property >
</ bean >
< bean id ="deleteBean" class ="com.sy.crm.action.EmployeeAction" scope ="prototype" >
< property name ="employeeManager" >
< ref bean ="employeeManager" />
</ property >
</ bean >
< bean id ="updateBean" class ="com.sy.crm.action.EmployeeAction" scope ="prototype" >
< property name ="employeeManager" >
< ref bean ="employeeManager" />
</ property >
</ bean >
< bean id ="editBean" class ="com.sy.crm.action.EmployeeAction" scope ="prototype" >
< property name ="employeeManager" >
< ref bean ="employeeManager" />
</ property >
</ bean >
<!-- 事务管理器 -->
< bean id ="transactionManager"
class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >
< property name ="sessionFactory" >
< ref local ="sessionFactory" />
</ property >
</ bean >
<!-- 配置事务特性,配置add,delete,update开始的方法,事务传播特性为required -->
< tx:advice id ="txAdvice" transaction-manager ="transactionManager" >
< tx:attributes >
< tx:method name ="add*" propagation ="REQUIRED" />
< tx:method name ="delete*" propagation ="REQUIRED" />
< tx:method name ="update*" propagation ="REQUIRED" />
< tx:method name ="*" read-only ="true" />
</ tx:attributes >
</ tx:advice >
<!-- 配置那些类的方法进行事务管理,当前com.sy.crm.service包中的子包,
类中所有方法需要,还需要参考tx:advice的设置 -->
< aop:config >
< aop:pointcut id ="allManagerMethod" expression ="execution(*
com.sy.crm.service.*.*(..))" />
< aop:advisor advice-ref ="txAdvice" pointcut-ref ="allManagerMethod" />
</ aop:config >
</ beans >
<% @ taglib uri = " /struts-tags " prefix = " s " %>
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01 Transitional//EN " >
< html >
< head >
< title > add page </ title >
< script language = " JavaScript " src = " validation-framework.js " ></ script >
< meta http - equiv = " pragma " content = " no-cache " >
< meta http - equiv = " cache-control " content = " no-cache " >
< meta http - equiv = " expires " content = " 0 " >
< meta http - equiv = " keywords " content = " keyword1,keyword2,keyword3 " >
< meta http - equiv = " description " content = " This is my page " >
</ head >
< body >
< center >
< h3 > 雇员注册: </ h3 >< br >
< h4 >< a href = " ../emp/list.action " > 查看所有雇员 </ a ></ h4 >
< div id = " error " style = " color:blue; font-weight:bold; " ></ div >
< s:form action = " add " method = " post " onsubmit = " return doValidate('form') " name = " form " id = " form " >
< s:textfield name = " employee.name " label = " 姓名 " id = " name " />
< s:textfield name = " employee.address " label = " 地址 " />
< s:textfield name = " employee.phone " label = " 电话 " />
< s:submit value = " 员工注册 " />
</ s:form >
</ center >
</ body >
</ html >
list.jsp源码:
<% @ taglib uri = " /struts-tags " prefix = " s " %>
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01 Transitional//EN " >
< html >
< head >
< title > list employee page </ title >
< meta http - equiv = " pragma " content = " no-cache " >
< meta http - equiv = " cache-control " content = " no-cache " >
< meta http - equiv = " expires " content = " 0 " >
< meta http - equiv = " keywords " content = " keyword1,keyword2,keyword3 " >
< meta http - equiv = " description " content = " This is my page " >
< style type = " text/css " >
table {
border: 1px solid black;
border - collapse: collapse;
}
table thead tr th {
border: 1px solid black;
padding: 3px;
background - color: #cccccc;
}
table tbody tr td {
border: 1px solid black;
padding: 3px;
}
</ style >
</ head >
< body >
< center >
< h3 >
雇员管理:
</ h3 >
< br >
< h4 >
< a href = " ../emp/add.jsp " > 员工注册 </ a >
</ h4 >
< s:form action = " delete " theme = " simple " >
< table >
< thead >
< tr >
< th >
选择
</ th >
< th >
编号
</ th >
< th >
姓名
</ th >
< th >
电话
</ th >
< th >
地址
</ th >
< th >
操作
</ th >
</ tr >
</ thead >
< tbody >
< s:iterator value = " employees " >
< tr >
< td >
< input type = " checkbox " name = " id "
value = ' <s:property value="id" /> ' />
</ td >
< td >
< s:property value = " id " />
</ td >
< td >
< s:property value = " name " />
</ td >
< td >
< s:property value = " phone " />
</ td >
< td >
< s:property value = " address " />
</ td >
< td >
< a
href = ' <s:url action="edit"><s:param name="id" value="id" /></s:url> ' >
修改 </ a > & nbsp;
< a
href = ' <s:url action="delete"><s:param name="id" value="id" /></s:url> ' >
删除 </ a >
</ td >
</ tr >
</ s:iterator >
</ tbody >
</ table >
< s:submit value = " delete " />
</ s:form >
</ center >
</ body >
</ html >
![](https://i-blog.csdnimg.cn/blog_migrate/7aa89a70e4836d5863014ac2dd687a16.jpeg)
第一点注意的是,搭建出项目,一定会报错,因为Spring 2.5 AOP Libraries中的asm的三个jar包会和
Hibernate 3.2 Core Libraries中的asm的jar包中的某些类中有冲突。所以一定要删除Spring中的三个asm的jar包。
第二点要注意的是,struts2的配置包的导入,需要的是5个jar包分别是:
struts2-core-2.0.11.2.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
xwork-2.05.jar
commons-logging-1.0.4.jar
struts2+spring配置包:struts2-spring-plugin-2.0.11.2.jar
网上有些还说需要把4个spring的包拷到lib下,我是拷了但是,并不确定这样做是否有必要。
总之是正常运行了。
所以也就没想太多。如果有的朋友运行不了,可以考虑把这4个需要的包写上来。
好了就说这么多吧,有疑问的朋友可以留言。我会尽量答复。
施杨出品!!!
作者:施杨(施杨's Think out)
出处:http://shiyangxt.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。