• SSH整合简单例子


    说明:简单SSH整合,struts版本2.3.32,spring版本3.2.9,hibernate版本3.6.10

    一、开发步骤

    1 引jar包,创建用户library。使用的包和之前博文相同,可以参考spring和hibernate整合,事务管理struts和spring整合

    jar包如下

    //struts_core
    Struts2.3.32corecommons-fileupload-1.3.2.jar
    Struts2.3.32corecommons-io-2.2.jar
    Struts2.3.32corecommons-lang3-3.2.jar
    Struts2.3.32corefreemarker-2.3.22.jar
    Struts2.3.32corejavassist-3.11.0.GA.jar
    Struts2.3.32coreognl-3.0.19.jar
    Struts2.3.32corestruts2-core-2.3.32.jar
    Struts2.3.32corexwork-core-2.3.32.jar
    
    //spring_core
    spring3.2.9corecommons-logging-1.2.jar
    spring3.2.9corespring-beans-3.2.9.RELEASE.jar
    spring3.2.9corespring-context-3.2.9.RELEASE.jar
    spring3.2.9corespring-core-3.2.9.RELEASE.jar
    spring3.2.9corespring-expression-3.2.9.RELEASE.jar
    
    //struts_spring_web
    struts-spring-webstruts2-spring-plugin-2.3.32.jar
    struts-spring-webspring-web-3.2.9.RELEASE.jar
    struts-spring-webspring-webmvc-3.2.9.RELEASE.jar
    
    //hibernate_core
    hibernate3.6coreantlr-2.7.6.jar
    hibernate3.6corecommons-collections-3.1.jar
    hibernate3.6coredom4j-1.6.1.jar
    hibernate3.6corehibernate3.jar
    hibernate3.6corehibernate-jpa-2.0-api-1.0.1.Final.jar
    hibernate3.6corejavassist-3.12.0.GA.jar
    hibernate3.6corejta-1.1.jar
    hibernate3.6coreslf4j-api-1.6.1.jar
    hibernate3.6coreslf4j-nop-1.7.25.jar
    
    //DB_connector
    DB-connectorc3p0-0.9.1.2.jar
    DB-connectormysql-connector-java-5.1.40-bin.jar
    DB-connectorspring-jdbc-3.2.9.RELEASE.jar
    
    //AOP
    springAOPaopalliance.jar
    springAOPaspectjrt.jar
    springAOPaspectjweaver.jar
    springAOPspring-aop-3.2.9.RELEASE.jar
    
    //spring_ORM
    spring-ORMspring-orm-3.2.9.RELEASE.jar
    spring-ORMspring-tx-3.2.9.RELEASE.jar
    View Code

    2 创建数据库表

    CREATE TABLE employee(
    id INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(50) NOT NULL,
    depId INT,
    FOREIGN KEY(depId) REFERENCES department(id));
    
    CREATE TABLE department(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50) NOT NULL);

    3 写实体类

    //Department 
    public class Department {
        private int id;
        private String dname;
        private Set<Employee> dEmployees = new HashSet<Employee>();
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getDname() {
            return dname;
        }
        public void setDname(String dname) {
            this.dname = dname;
        }
        
        public Set<Employee> getdEmployees() {
            return dEmployees;
        }
        public void setdEmployees(Set<Employee> dEmployees) {
            this.dEmployees = dEmployees;
        }
        
    }
    
    // Employee 
    public class Employee {
        
        private int id;
        private String ename;
        private Department department = new Department();
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getEname() {
            return ename;
        }
        public void setEname(String ename) {
            this.ename = ename;
        }
        public Department getDepartment() {
            return department;
        }
        public void setDepartment(Department department) {
            this.department = department;
        }
        
        @Override
        public String toString() {
            return "Employee [id=" + id + ", ename=" + ename + "]";
        }
    }
    View Code

    注意:在实体类中有属性是其他类,要进行初始化动作。否则可能在以后操作数据时有问题。

    4 Dao/Service/Action

    // EmployeeDao 
    public class EmployeeDao {
        private SessionFactory sessionFactory;
        
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
        
        public void saveEmployee(Employee emp){
            sessionFactory.getCurrentSession().save(emp);
        }
        
        public Employee getEmployee(Employee emp){
            Employee result = (Employee) sessionFactory.getCurrentSession().get(Employee.class, emp.getId());
            return result;
        }
        
        public boolean isExistEmployee(Employee emp){
            Object result = sessionFactory.getCurrentSession().get(Employee.class, emp.getId());
            return result!=null;
        }
        
        public List<Employee> getAllEmployee(){
            Query q = sessionFactory.getCurrentSession().createQuery("from Employee");
            List<Employee>list = q.list();
            return list;
        }
    }
    
    //EmployeeService 
    public class EmployeeService {
        private EmployeeDao employeeDao;
        
        public void setEmployeeDao(EmployeeDao employeeDao) {
            this.employeeDao = employeeDao;
        }
        
        public void saveEmployee(Employee emp){
            employeeDao.saveEmployee(emp);
        }
        
        public Employee getEmployee(Employee emp){
            Employee result = null;
            if(employeeDao.isExistEmployee(emp)){
                result = employeeDao.getEmployee(emp);
            }
            return result;
        }
        
        public List<Employee> getAllEmployee(){
            return employeeDao.getAllEmployee();
        }
    
    }
    
    //EmployeeAction 
    public class EmployeeAction extends ActionSupport implements SessionAware,ApplicationAware,RequestAware{
        private EmployeeService employeeService;
        private Map<String, Object> request;
        private Map<String, Object> session;
        private Map<String, Object> application;
        
        public void setEmployeeService(EmployeeService employeeService) {
            this.employeeService = employeeService;
        }
        
        public String getAllEmployees(){
            List<Employee> allEmployees = employeeService.getAllEmployee();
    //        ActionContext.getContext().getContextMap().put("allEmployees", allEmployees);
    //        ServletActionContext.getRequest().setAttribute("allEmployees", allEmployees);
            request.put("allEmployees", allEmployees);
            
            
            return SUCCESS;
        }
    
        @Override
        public void setRequest(Map<String, Object> arg0) {
            request = arg0;        
        }
    
        @Override
        public void setApplication(Map<String, Object> arg0) {
            application = arg0;
        }
    
        @Override
        public void setSession(Map<String, Object> arg0) {
            session = arg0;
        }
    
    }
    View Code

    注意:

    1)在这些类中如果有私有对象,要设置对应的set方法。因为所有对象的创建都交给了spring,需要有set方法与之对应。

    2)在Action方法保存对象到域中有3中方法。具体可以参考之前博文struts2开发流程及配置,域对象对数据存储的3种方式。比较方便的是继承SessionAware,ApplicationAware,RequestAware接口

    5 对spring和hibernate进行配置,将所有和数据库相关的配置都在spring配置中配置,配置文件bean.xml;以后项目如果比较大可以将bean-dao.xml,bean-service.xml,bean-action.xml,bean-base.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:p="http://www.springframework.org/schema/p"
        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/beans
            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop.xsd">
            
            <!-- 1 dataSource config combopooleddatasource -->
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
                <property name="jdbcUrl" value="jdbc:mysql:///day26?useSSl=true"></property>
                <property name="user" value="root"></property>
                <property name="password" value="123456"></property>
                <property name="initialPoolSize" value="2"></property>
                <property name="maxPoolSize" value="20"></property>
                <property name="acquireIncrement" value="2"></property>
                <property name="maxStatements" value="20"></property>
            </bean>
            
            <!-- 2 sessionFactory config -->
            <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                <!-- 2.1 dataSource property -->
                <property name="dataSource" ref="dataSource"></property>
                
                <!-- 2.2 DB other property, dialect/showsql/ -->
                <property name="hibernateProperties">
                    <props>
                        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                        <prop key="hibernate.show_sql">true</prop>
                        <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
                    </props>
                </property>
                
                <!-- 2.3 mapping file list -->
                <property name="mappingLocations">
                    <list>
                        <value>classpath:com/huitong/entity/*.hbm.xml</value>
                    </list>
                </property>
            
            </bean>
            
            <!-- 3 dao/service/action bean -->
            <bean id="employeeDao" class="com.huitong.dao.EmployeeDao">
                <property name="sessionFactory" ref="sessionFactory"></property>
            </bean>
            
            <bean id="employeeService" class="com.huitong.service.EmployeeService">
                <property name="employeeDao" ref="employeeDao"></property>
            </bean>
            
            <bean id="employeeAction" class="com.huitong.action.EmployeeAction" scope="prototype">
                <property name="employeeService" ref="employeeService"></property>
            </bean>
            
            
            <!-- 4 transaction config -->
            <!-- 4.1 transaction manager bean config -->
            <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory"></property>
            </bean>
            
            <!-- 4.2 transaction advice -->
            <tx:advice id="txAdvice" transaction-manager="txManager">
                <tx:attributes>
                    <tx:method name="get*" read-only="true"/>
                    <tx:method name="query*" read-only="true"/>
                    <tx:method name="*"/>
                </tx:attributes>
            </tx:advice>
            
            <!-- 4.3 AOP config -->
            <aop:config>
                <aop:pointcut expression="execution(* com.huitong.service.EmployeeService.*(..))" id="emppt"/>
                <aop:advisor advice-ref="txAdvice" pointcut-ref="emppt"/>
            </aop:config>
               
               
    </beans>

    6 struts配置,struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd">    
        
    <struts>
        <package name="Employeepkg" extends="struts-default" >
            <action name="employee_*" class="employeeAction" method="{1}">
                <result name="success" type="dispatcher">/employeeList.jsp</result>
            </action>
        </package>
        
    </struts>

    7 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">
      <display-name>SSH1</display-name>
      
      <!-- 3 opensessioninview config, for lazyInitialization exception -->
      <filter>
          <filter-name>opensessionInview</filter-name>
          <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>opensessionInview</filter-name>
          <url-pattern>*.action</url-pattern>
      </filter-mapping>
      
      <!-- 1 struts config -->
      <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>
      
      
      <!-- 2 spring config -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/bean*.xml</param-value>
      <!--另一种方案<param-value>classpath:bean*.xml</param-value> --> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
    <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>

    注意:在spring中配置事务,由于使用了懒加载。在jsp页面访问关联数据不能访问。事务配置在了service方法中,在action方法中无法获取相关联的数据。解决办法有四种,

    1)在action方法中将要用到的数据先获取一遍

    2)关闭懒加载,不过这种方法对于数据关系复杂的情况不太好,它会加载所有相关数据而不是用到什么取什么。

    3)使用openSessionInViewFilter,注意配置的时候filter mapping要在struts的filter mapping之前。否则不起效果。

    4)在service层强行初始化代理对象

    8 前台页面employeeList.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags" prefix="s"%>
    <%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
    
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">    
        <title>所有员工信息</title>
      </head>
      
      <body>
        <div>
            <table cellpadding="5" cellspacing="0" align="center" border="1">
                <tr>
                    <th>员工名</th>
                    <th>部门</th>
                </tr>
                <c:forEach items="${requestScope.allEmployees }" var="emp" varStatus="empStatus">
                    <tr>
                        <td>${emp.ename }</td>
                        <td>${emp.department.dname }</td>
                    </tr>
                </c:forEach>
            </table>
        </div>
      </body>
    </html>
    View Code

    9 简单测试

    public void fun1(){
            ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
            EmployeeService empService = (EmployeeService) ac.getBean("employeeService");
            System.out.println(empService);        //spring ok?
            
            Employee emp1 = new Employee();
            emp1.setEname("good");
            
            Employee emp2 = new Employee();
            emp2.setEname("nice");
            
            Department department = new Department();
            department.setDname("软件开发部");
    
            emp1.setDepartment(department);
            emp2.setDepartment(department);
            
            empService.saveEmployee(emp1);
            empService.saveEmployee(emp2);//hibernate ok?
            
        }

    项目在github上的地址https://github.com/crazyCodeLove/SSHpro1.git

    struts输入表单中的隐藏域可以使用<s:hidden>

    <s:hidden name="id"></s:hidden>
  • 相关阅读:
    第三章,DNA序列的进化演变
    哈迪-温伯格定律和近亲杂交
    mysql
    Dajngo admin使用
    Django之Form组件
    python三大器
    python函数
    python文件操作
    python字典和集合
    算法基础
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/6807300.html
Copyright © 2020-2023  润新知