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>
       <!-- 配置一个缓存工厂组件 -->
       <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
       <!-- 指定那些类使用二级缓存 -->
       <class-cache usage="read-only" class="com.myframe.ssh.pojo.Department"/>


SSH框架搭建完成,CRUD功能完成!!!
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值