Spring+Struts2+Hibernate整合
Posted Nothing_doit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+Struts2+Hibernate整合相关的知识,希望对你有一定的参考价值。
详细的介绍搭建SSH框架环境 ,并用框架实现简单的CRUD操作。基本需求
概述:完成员工信息的增删改查操作(CRUD),其中员工和部门是单向的多对一关系,在保存和修改页面使用下拉列表实现部门的选择。
图示:所有员工显示:
保存:
修改:
环境搭建:
导入相关jar包
Spring+ Struts2+ Hibernate jar包目录 antlr-2.7.7.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar c3p0-0.9.1.2.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar commons-fileupload-1.3.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.3.jar dom4j-1.6.1.jar ehcache-core-2.4.3.jar freemarker-2.3.19.jar hibernate-commons-annotations-4.0.2.Final.jar hibernate-core-4.2.4.Final.jar hibernate-ehcache-4.2.4.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar javassist-3.15.0-GA.jar jboss-logging-3.1.0.GA.jar jboss-transaction-api_1.1_spec-1.0.1.Final.jar log4j-1.2.17.jar mysql-connector-java-5.1.7-bin.jar ognl-3.0.6.jar slf4j-api-1.6.1.jar spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar spring-jdbc-4.0.0.RELEASE.jar spring-orm-4.0.0.RELEASE.jar spring-tx-4.0.0.RELEASE.jar spring-web-4.0.0.RELEASE.jar struts2-core-2.3.15.3.jar struts2-spring-plugin-2.3.15.3.jar xwork-core-2.3.15.3.jar建立基本的包结构,编写配置文件
将包结构建立好后,就可以依据包结构对配置文件进行配置
建立配置文件(二级缓存的文件在优化的时候使用)
编写配置文件
hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 配置连接数据库的信息(交给Spring的IOC容器管理) -->
<!-- 方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 其他的配置 --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射文件配置 (在IOC容器中管理映射文件,IOC容器中可以进行批量管理) --> </session-factory> </hibernate-configuration>
jdbc.properties jdbc.driverClass=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springhibernate jdbc.user=root jdbc.password=123456
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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 开启包扫描 --> <context:component-scan base-package="com.myframe.ssh"></context:component-scan>
<!-- 引入外部文件(jdbc的配置信息) --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 配置连接数据库的相关信息 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="$jdbc.url"></property> <property name="driverClass" value="$jdbc.driverClass"></property> <property name="user" value="$jdbc.user"></property> <property name="password" value="$jdbc.password"></property> </bean>
<!-- 配置LocalSessionFactoryBean 用于创建一个sessionFactory,ioc容器管理session对象 这样就可以完成hibernate和Spring整合 --> <bean id="sessionFactory" class=" org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 使用配置的数据源与数据库建立连接 --> <property name="dataSource" ref="dataSource" /> <!--设置hibernate配置文件的位置--> <property name="configLocation" value=" classpath:hibernate.cfg.xml" /> <!-- 管理每个pojo类的映射文件,使用ioc容器可以实现批量管理 --> <property name="mappingLocations"> <list> <value>classpath:com/myframe/ssh/pojo/*.hbm.xml</value> </list> </property> </bean> <!-- 配置事务管理器,由ioc容器创建session对象,管理事务 --> <bean id="transactionManager" class=" org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 开启基于注解的事务管理 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
struts.xml <?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> <constant name="struts.devMode" value="true" /> <!--使用增量模式编写action方法和映射--> <package name="default" namespace="/" extends="struts-default">
</package> </struts>
Spring的IOC容器和Struts2的核心控制器需要在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">
<!-- 自动创建IOC容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置核心控制器 --> <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> </web-app>
基本的环境配置完成。
编写POJO类,并生成映射文件
测试使用的POJO类(员工和部门类,单向的多对一的关系),并创建映射文件,在设置好的包结构中创建(已经提前配置好映射文件的管理)。 <property name="mappingLocations"> <list> <value>classpath:com/myframe/ssh/pojo/*.hbm.xml</value> </list> </property>Employee package com.myframe.ssh.pojo;
public class Employee private Integer empId; private String empName; // 建立单向的多对一关系 private Department department;
public Department getDepartment() return department;
public void setDepartment(Department department) this.department = department;
public Employee() super();
public Employee(Integer empId, String empName) super(); this.empId = empId; this.empName = empName;
public Integer getEmpId() return empId;
public void setEmpId(Integer empId) this.empId = empId;
public String getEmpName() return empName;
public void setEmpName(String empName) this.empName = empName;
@Override public String toString() return "Employee [empId=" + empId + ", empName=" + empName + "]";
Employee.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-11-1 18:53:50 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="com.myframe.ssh.pojo"> <class name="Employee" table="T_EMPLOYEE"> <id name="empId" type="java.lang.Integer"> <column name="EMP_ID" /> <generator class=" native" /> </id> <property name="empName" type="java.lang.String"> <column name="EMP_NAME" /> </property> <many-to-one name="department" class="Department" fetch="join" > <column name="DEPT_ID" /> </many-to-one> </class> </hibernate-mapping>
Department package com.myframe.ssh.pojo;
public class Department private Integer deptId; private String deptName;
public Department(Integer deptId, String deptName) super(); this.deptId = deptId; this.deptName = deptName;
public Department() super();
public Integer getDeptId() return deptId;
public void setDeptId(Integer deptId) this.deptId = deptId;
public String getDeptName() return deptName;
public void setDeptName(String deptName) this.deptName = deptName;
@Override public String toString() return "Department [deptId=" + deptId + ", deptName=" + deptName + "]";
Department.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-11-1 18:53:50 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="com.myframe.ssh.pojo"> <class name="Department" table="T_DEPARTMENT"> <id name="deptId" type="java.lang.Integer"> <column name="DEPT_ID" /> <generator class=" native" /> </id> <property name="deptName" type="java.lang.String"> <column name="DEPT_NAME" /> </property> </class> </hibernate-mapping>
编写实现CRUD功能
基本接口准备:
Dao 接口 package com.myframe.ssh.dao;import java.util.List;
import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee;
public interface EmployeeDao /** * 获取所有员工 * * @return 包含所有员工list集合 */ public List<Employee> getAllEmp();
/** * 获取所有部门 * * @return 包含所有部门的list集合 */ public List<Department> getAllDept();
/** * 获取一个员工 * * @param id * @return 一个员工对象 */ public Employee getEmp(Integer empId);
/** * 保存一个员工 * * @param employee */ public void saveEmp(Employee employee);
/** * 更新一个员工 * * @param employee */ public void updateEmp(Employee employee);
/** * 删除一个员工 * * @param employee */ public void deleteEmp(Employee employee);
Dao接口实现(使用注解自动装配) package com.myframe.ssh.dao;
import java.util.List;
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository;
import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee;
@SuppressWarnings("unchecked") @Repository public class EmployeeDaoImpl implements EmployeeDao @Autowired private SessionFactory sessionFactory;
/** * 提供一个获取session对象的方法 * * @return session对象 */ private Session getSession() return sessionFactory.getCurrentSession();
@Override public List<Employee> getAllEmp() return getSession().createQuery( "from Employee e left join fetch e.department").list();
@Override public List<Department> getAllDept() return getSession().createQuery("from Department").list();
@Override public Employee getEmp(Integer EmpId) return (Employee) getSession().get(Employee.class, EmpId);
@Override public void saveEmp(Employee employee) getSession().save(employee);
@Override public void updateEmp(Employee employee) getSession().update(employee);
@Override public void deleteEmp(Employee employee) getSession().delete(employee);
Service接口 package com.myframe.ssh.service;
import java.util.List;
import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee;
public interface EmployeeService /** * 获取所有员工 * * @return 包含所有员工list集合 */ public List<Employee> getAllEmp();
/** * 获取所有部门 * * @return 包含所有部门的list集合 */ public List<Department> getAllDept();
/** * 获取一个员工 * * @param id * @return 一个员工对象 */ public Employee getEmp(Integer EmpId);
/** * 保存一个员工 * * @param employee */ public void saveEmp(Employee employee);
/** * 更新一个员工 * * @param employee */ public void updateEmp(Employee employee);
/** * 删除一个员工 * * @param employee */ public void deleteEmp(Integer empId);
Service接口实现(使用注解配置事务) package com.myframe.ssh.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
import com.myframe.ssh.dao.EmployeeDao; import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee;
@Transactional @Service public class EmployeeServiceImpl implements EmployeeService @Autowired private EmployeeDao employeeDao;
@Transactional(readOnly = true) @Override public List<Employee> getAllEmp() return employeeDao.getAllEmp();
@Transactional(readOnly = true) @Override public List<Department> getAllDept() // TODO Auto-generated method stub return employeeDao.getAllDept();
@Transactional(readOnly = true) @Override public Employee getEmp(Integer EmpId) return employeeDao.getEmp(EmpId);
@Override public void saveEmp(Employee employee) System.out.println(employee); employeeDao.saveEmp(employee);
@Override public void updateEmp(Employee employee) employeeDao.updateEmp(employee);
@Override public void deleteEmp(Integer empId) Employee emp = employeeDao.getEmp(empId); if (emp != null) employeeDao.deleteEmp(emp);
对编写的接口进行测试(测试的时候创建数据库表)
编写action(CRUD)---使用增量式编码的方式对代码进行补充
根据流程编写对应的action 编写页面:index.jsp, list.jsp, save.jsp, update.jsp查询所有员工
实现步骤: ①页面发出请求getAll.action <a href="$pageContext.request.contextPath /getAll.action">查询所有员工</a> ②struts.xml配置action(要由框架帮我们管理请求) <action name="getAll" class="com.myframe.ssh.action.EmployeeAction" method="getAll"> <result>list.jsp</result> </action> ③写处理action的方法(注:要想在页面获取某域中的数据必须实现XxxAware) 在准备好的包结构中创建一个专门来管理所有action方法的类 @Controller @Scope("prototype") public class EmployeeAction@Autowired private EmployeeService employeeService; 添加一个获取所有员工的action package com.myframe.ssh.action;
import java.util.List; import java.util.Map;
import org.apache.struts2.interceptor.RequestAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller;
import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee; import com.myframe.ssh.service.EmployeeService;
@Controller @Scope("prototype") public class EmployeeAction implements RequestAware
@Autowired private EmployeeService employeeService; private Map<String, Object> request;
public String getAll() // 要想保存到request中必须实现RequestAware // 要想在页面获取必须实现XxxAware List<Employee> empList = employeeService.getAllEmp(); request.put("empList", empList); return "success";
@Override public void setRequest(Map<String, Object> request) this.request = request;
④list.jsp页面获取,并显示 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1 align="center">显示所有员工信息</h1> <s:if test="#request.empList == null || #request.empList.empty"> 没有员工信息 </s:if>
<s:else> <center> <table border="1" width="80%"> <tr> <th>ID</th> <th>员工姓名</th> <th>部门名称</th> <th>修改</th> <th>删除</th> </tr> <s:iterator value="#request.empList"> <tr> <td><s:property value="empId"/></td> <td><s:property value="empName"/></td> <td><s:property value="department.deptName"/></td> <td><s:a action="#">修改</s:a></td> <td><s:a action="#">删除</s:a></td> </tr> </s:iterator> </table> </center> </s:else> <center> <!-- 到添加页面,需要向页面传递一些信息,因此需要发送请求 --> <a href="#">添加</a> </center> </body> </html> 测试
保存一名员工
步骤: ①从list.jsp页面发送tosave.action(保存前做一些准备工作) <a href="$pageContext.request.contextPath /tosave.action">添加</a> ②配置action <!-- 向保存页面传递一些部门信息 --> <action name="tosave" class="com.myframe.ssh.action.EmployeeAction" method="tosave"> <!-- 到保存页面 --> <result name="save">save.jsp</result> </action> ③写处理action的方法(注:表单要可以显示部门的下拉列表,可以供选择) public String tosave() List<Department> deptList = employeeService.getAllDept(); request.put("deptList", deptList); return "save"; ④到save.jsp页面,填写信息,然后提交表单(注意:下拉列选的设置),发送 dosave.action请求 <h1 align="center">添加员工</h1> <!-- action 路径从当前项目开始 --> <s:form action="dosave"> <s:textfield name="empName" label="员工姓名"/> <s:select list="#request.deptList" label="部门" listKey="deptId" listValue="deptName" name="department.deptId" ></s:select> <s:submit value="保存"></s:submit> </s:form> ⑤ 配置dosave.action <action name="dosave" class="com.myframe.ssh.action.EmployeeAction" method="dosave"> <!--重定向到list.jsp--> <result type="redirectAction" name="list"> <param name="actionName">getAll</param> <param name="namespace">/</param> </result> </action> ⑥编写 dosave的方法(使用模型对象接收表单提交的数据)实现 ModelDriven<T>接口, Preparable接口(使用模型驱动封装表单数据) public class EmployeeAction implements RequestAware, ModelDriven<Employee>, Preparable 声明模型对象 //模型对象,我们需要提前给模型对象赋初始值 private Employee employee; /** * 框架会将表单提交的数据自动封装到我们准备的模型对象中(使用参数拦截器),同时也可以在页面获取模型对象中的值(因为getModel将模型对象保存在对象栈中) * 将模型对象压入栈中,注:对象不能是null,若是null不进行压栈工作 * 因为getModel方法每次处理请求之前都会执行,因此不在这个方法中给模型对象赋值 使用前缀方法 */ @Override public Employee getModel() return employee;
/** * 它也是每个请求都会执行,因此也不在这个里面赋值 */ @Override public void prepare() throws Exception System.out.println("prepare...."); 使用前缀方法给模型对象赋值 public void prepareDosave() employee = new Employee(); 这样框架就会自动将我们从表单提交的数据封装到模型对象上,我们只需要保存这个对象即可。 public String dosave() employeeService.saveEmp(employee); return "list";
修改一名员工
步骤: ①从list.jsp页面发送toupdate.action(这个操作是给update.jsp回显一些信息) <td><s:a action="toupdate?empId=%empId">修改</s:a></td> ②配置action <action name="toupdate" class="employeeAction" method="toupdate"> <result name="update">update.jsp</result> </action> ③编写action方法 //属性驱动 private Integer empId;/** * 需要在前缀方法执行之前,执行参数拦截器 */ public void prepareToupdate() employee = employeeService.getEmp(empId);
public String toupdate() List<Department> deptList = employeeService.getAllDept(); request.put("deptList", deptList); return "update"; public Integer getEmpId() return empId;
public void setEmpId(Integer empId) this.empId = empId; getModel() getModel方法可以将前缀方法准备的对象压入对象栈,这样在页面就可以获取到 需要在执行前缀方法前执行参数拦截器,给empId赋值 需要在struts.xml中配置拦截器栈 <default-interceptor-ref name="paramsPrepareParamsStack"/> ④update.jsp <h1 align="center">修改员工</h1> <s:form action="doupdate"> <s:hidden name="empId"/> <s:textfield name="empName" label="员工姓名"/> <s:select list="#request.deptList" listKey="deptId" listValue="deptName" label="部门名称" name="department.deptId"></s:select> <s:submit value="修改"></s:submit> </s:form> ⑤修改后,提交doupdate.action,保存修改信息 <action name="doupdate" class="employeeAction" method="doupdate"> <result type="redirectAction" name="list">getAll</result> </action> ⑥真正执行保存的action public void prepareDoupdate() employee = new Employee(); //employee = employeeService.getEmp(empId);
public String doupdate() employeeService.updateEmp(employee);; return "list"; getModel()会将模型对象压栈,参数拦截器完成将表单数据包装成模型对象
总结:保存和修改操作都需要发送两次请求,原因是在执行保存和修改操作前,编辑页面需要从数据库获取一些信息在页面显示。
删除一名员工
步骤: ① list.jsp页面发送delete.action list.jsp <td><s:a action="delete?empId=%empId">删除</s:a></td> ②配置action <action name="delete" class="employeeAction" method="delete"> <result type="redirectAction" name="list">getAll</result> </action> ③ 编写action方法 public String delete() employeeService.deleteEmp(empId); return "list";完整action类
package com.myframe.ssh.action;import java.util.List; import java.util.Map;
import org.apache.struts2.interceptor.RequestAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller;
import com.myframe.ssh.pojo.Department; import com.myframe.ssh.pojo.Employee; import com.myframe.ssh.service.EmployeeService; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable;
@Controller @Scope("prototype") public class EmployeeAction implements RequestAware, ModelDriven<Employee>, Preparable
@Autowired private EmployeeService employeeService; private Map<String, Object> request; private Employee employee;
private Integer empId;
public String delete() employeeService.deleteEmp(empId); return "list";
public void prepareDoupdate() //employee = new Employee(); employee = employeeService.getEmp(empId);
public String doupdate() employeeService.updateEmp(employee);; return "list";
/** * 需要在前缀方法执行之前,执行参数拦截器 */ public void prepareToupdate() employee = employeeService.getEmp(empId);
public String toupdate() List<Department> deptList = employeeService.getAllDept(); request.put("deptList", deptList); return "update";
public void prepareDosave() employee = new Employee();
// 保存功能使用模型驱动 public String dosave() employeeService.saveEmp(employee); return "list";
public String tosave() List<Department> deptList = employeeService.getAllDept(); request.put("deptList", deptList); return "save";
public String getAll() // 要想保存到request中必须实现RequestAware // 要想在页面获取必须实现XxxAware List<Employee> empList = employeeService.getAllEmp(); request.put("empList", empList); return "success";
@Override public void setRequest(Map<String, Object> request) this.request = request;
/** * 框架会将表单提交的数据自动封装到我们准备的模型对象中(使用参数拦截器),同时也可以在页面获取模型对象中的值(它使用getModel保存在对象栈中) * 将模型对象压入栈中,注:对象不能是null,若是null不进行压栈工作 * 因为getModel方法每次处理请求之前都会执行,因此不在这个方法中给模型对象赋值 使用前缀方法 */ @Override public Employee getModel() return employee;
/** * 它也是每个请求都会执行,因此也不在这个里面赋值 */ @Override public void prepare() throws Exception System.out.println("prepare....");
public Integer getEmpId() return empId;
public void setEmpId(Integer empId) this.empId = empId;
完整action映射
<?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> <constant name="struts.devMode" value="true" />
<!-- 这里的class可以直接使用类名首字母小写 --> <package name="default" namespace="/" extends="struts-default"> <default-interceptor-ref name="paramsPrepareParamsStack"/> <action name="getAll" class="com.myframe.ssh.action.EmployeeAction" method="getAll"> <result>list.jsp</result> </action> <!-- 向保存页面传递一些部门信息 --> <action name="tosave" class="com.myframe.ssh.action.EmployeeAction" method="tosave"> <!-- 到保存页面 --> <result name="save">save.jsp</result> </action> <action name="dosave" class="com.myframe.ssh.action.EmployeeAction" method="dosave"> <result type="redirectAction" name="list"> <param name="actionName">getAll</param> <param name="namespace">/</param> </result> </action>
<action name="toupdate" class="employeeAction" method="toupdate"> <result name="update">update.jsp</result> </action>
<action name="doupdate" class="employeeAction" method="doupdate"> <result type="redirectAction" name="list">getAll</result> </action>
<action name="delete" class="employeeAction" method="delete"> <result type="redirectAction" name="list">getAll</result> </action>
</package> </struts>
二级缓存配置
可以配置一个二级缓存对性能进行优化(hibernate配置文件中配置) <!-- 使用二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- 配置一个缓存工厂组件 -->以上是关于Spring+Struts2+Hibernate整合的主要内容,如果未能解决你的问题,请参考以下文章
createSQLQuery is not valid without active transaction解决方法
spring 学习之三(spring 与hibernate, struts2整合)
Struts2 + Spring + Hibernate 分页
Struts2+Spring+Hibernate(SSH)框架的搭建