Struts2+Spring+Hibernate框架整合总结详细教程

一.SSH三大框架知识总结

  Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

一 Struts2工作原理
  在Struts2框架中的处理大概分为以下几个步骤 
  1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
  2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,
   这个过滤器对于Struts2和其他框架的集成很有帮助,例 如:SiteMesh Plugin) 
  3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action 
  4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
  5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
  6 ActionProxy创建一个ActionInvocation的实例。 
  7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
  8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
   返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
   在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 
二 Struts2工作流程
  1、客户端浏览器发出HTTP请求.
  2、根据web.xml配置,该请求被FilterDispatcher接收
  3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
  4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
  5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
  6、返回HTTP响应到客户端浏览器
 
  Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言,绝大部分Java应用都可以从Spring中受益。◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

      Spring内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。  
      Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过  配置类达到的。  
      Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)  
      要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。  
Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式), Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring.

一、 IoC(Inversion of control): 控制反转  
1、IoC:  
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系  
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean  
二、AOP(Aspect-Oriented Programming): 面向方面编程  
1、 代理的两种方式:  
静态代理:  
 针对每个具体类分别编写代理类;  
 针对一个接口编写一个代理类;  
动态代理:  
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

2、动态代理:

不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的反射得到真实对象的Method,调用装备的invoke方法,将动态代理、 Method、方法参数传与装备的invoke方法,invoke方法在唤起method方法前或后做一些处理。     

             1、产生动态代理的类:

                            java.lang.refect.Proxy

             2、装备必须实现InvocationHandler接口实现invoke方法

3、反射

    什么是类的返射?

        通过类说明可以得到类的父类、实现的接口、内部类、构造函数、方法、属性并可以根据构造器实例化一个对象,唤起一个方法,取属性值,改属性值。如何得到一个类说明:

                        Class cls=类.class;

                        Class cls=对象.getClass();

                        Class.forName("类路径");

       如何得到一个方法并唤起它?

                        Class cls=类.class;

                        Constructor cons=cls.getConstructor(new Class[]{String.class});

                        Object obj=cons.newInstance(new Object[]{"aaa"});

                        Method method=cls.getMethod("方法名",new Class[]{String.class,Integer.class});

                        method.invoke(obj,new Object[]{"aa",new Integer(1)}); 

4、spring的三种注入方式是什么?

        setter

        interface

        constructor

5、spring的核心接口及核类配置文件是什么?

        FactoryBean:工厂bean主要实现ioc/di

         ApplicationContext ac=new FileXmlApplicationContext("applicationContext.xml");

          Object obj=ac.getBean("id值");

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。

Hibernate工作原理和作用:

原理:
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory

作用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
 
2. Hibernate是如何延迟加载?
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)

2. Hibernate3 提供了属性的延迟加载功能

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、

4. 说下Hibernate的缓存机制

1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2. 二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据
c) 第三方缓存的实现
////////一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致。不能对其进行管理。

不用显示的调用。

二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。

首先配置第3放插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入

<property name="hibernate.cache.user_second_level_cache">true</property>

在映射中也要显示的调用,<cache usage="read-only"/>

二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。

在程序中必须手动启用查询缓存:query.setCacheable(true);/////////

5. Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数

6. 如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰

二,创建数据库并并设置编码。

1.create database  dataname;注意:hibernate不会自己创建数据库;

2.default character set utf8;原因:避免出现乱码;

三,Eclipse项目

1.在eclipse里创建web项目,并设置编码为utf-8;原因:避免出现乱码;

四.搭建SSH三大框架环境

1.到SSH各官网下载插件(注意版本!):struts-2.3.30、spring-framework-4.2.2.RELEASE,hibernate-release-5.2.2.Final;

2.把各大插件的jar包导入到项目的lib文件夹下:

1).Struts2必需的jar包(注意版本!)

2).spring必需的jar包(注意版本!):

注意:struts2-spring-plugin-2.3.30.jar,commons-logging-1.1.3.jar是struts的jar包

3).hibernate必需的jar包(注意版本!在required文件夹下):

还有在optional文件夹下的c3p0jar包(它既是数据库连接池包,类似的还有dbcp):

 

其它可选的到用到的时候再导入吧!注意:三大框架全部都导进来可能会产生包冲突!

3.配置web.xml文件:

1).配置默认首页等等其它的;

2).配置struts,struts就是一个过滤器,在客服端发送请求之后和响应客户端之前进行适当的处理;

3).配置spring,spring就是一个监听器,监听Context(上下文),它管理所有类的实例的创建,就像会计所有人要钱都要去找她;

4).配置classpath路径,因为默认路径是/WEB-INF/***.xml而src文件夹路径是/WEB-INF/classes/***.xml;

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 3   <display-name>stuAciton</display-name>
 4   <welcome-file-list>
 5     <welcome-file>default.jsp</welcome-file>
 6   </welcome-file-list>
 7   
 8     <filter>
 9         <filter-name>struts2</filter-name>
10      <!-- 2.3.3版本 -->
11         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
12     </filter>
13 
14     <filter-mapping>
15         <filter-name>struts2</filter-name>
16         <url-pattern>/*</url-pattern>
17     </filter-mapping>
18     
19     <context-param>
20      <!-- XML文件src路径 -->
21         <param-name>contextConfigLocation</param-name>
22         <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
23     </context-param>
24 
25     <listener>
26         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
27     </listener>
28 </web-app>

 注意:每个版本有相应的配置,可以去下载的jar包里的示例代码中找;

4.在src文件夹创建或拷贝SSH框架的配置文件:

1). struts.xml的文件配置:(可以拷贝一个struts.xml模版到src目录)

struts.xml是struts2核心的核心,它负责跳转,传递参数;可以用struts.properties代替;

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <!-- 上面的头,注意版本,从样例里复制过来 showcase.warWEB-INFsrcjavastruts.xml -->
 6 
 7 <!-- include文件用于分割,实现多人并发不冲突 -->
 8 <struts>
 9     <!-- 告知Struts2运行时使用Spring来创建对象 -->
10     <constant name="struts.objectFactory" value="spring"></constant>
11     
12     <!--指定Struts2默认的ObjectFactory Bean,该属性默认值是spring--> 
13     <package name="mypkg" extends="struts-default">
14         <!-- StudentAction是请求地址、myStudentAction是Action类、execute2是Action类里的方法-->
15         <action name="StudentAction"  class="myStudentAction" method="execute2">
16             <!-- Action类里return的字符串,这个必须要一致,有默认的 -->
17             <result name="success">/WEB-INF/jsp/student.jsp</result>
18             <result name="error">/WEB-INF/jsp/error.jsp</result>
19         </action>
20     </package>
21 </struts>  

2).applicationContext.xml文件的配置:

applicationContext.xml是spring框架的入口点,是struts关联spring的桥梁也是spring关联hibernate的桥梁;

<?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:aop="http://www.springframework.org/schema/aop"   
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:jee="http://www.springframework.org/schema/jee"  
        xmlns:tx="http://www.springframework.org/schema/tx"  
        xsi:schemaLocation="    
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd  
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    <!-- 类似于财务部门一样,类就是钱,所有需要类的实例都由srping去管理 -->
    <!-- id属性的值是接口、class属性的值为id接口的一个实例、prototype属性值为非单例 -->
    <bean id="myStudentAction" class="action.StudentAction" scope="prototype">
        <!-- ss是class实例里的一个全局属性,给ss设置一个 StudentService实例的值-->
        <property name="ss" ref="StudentService"></property><!-- Spring依赖注入 -->
    </bean>
    <!-- id属性的值是接口、class属性的值为id接口的一个实例、prototype属性值为非单例 -->
    <bean id="StudentService" class="serverce.StudentServiceImpl" scope="prototype">
        <!-- sdd是class实例里的一个全局属性,给sdd设置一个 StudentDao实例的值-->
        <property name="sdd" ref="StudentDao"></property><!-- Spring依赖注入 -->
    </bean>
    <bean id="StudentDao" class="dao.StudentDaoImpl" scope="prototype">
        <!-- 注入两个hibernate类 一个用来查询一个用来插入-->
        <property name="sessionfactory" ref="sessionfactory"></property><!-- Spring依赖注入 -->
        <property name="sessionfactory2" ref="sessionfactory2"></property><!-- Spring依赖注入 -->
    </bean>
    <!-- org.springframework.orm.hibernate5.LocalSessionFactoryBean是hibernate的jar包 -->
    <bean id="sessionfactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
        scope="prototype">
        <!-- 注入一个数据库连接池 -->
        <property name="dataSource" ref="SQLServerDatasource"></property>
        <!--配置hibernateproperties替换hibernate.cfg.xml文件  -->
        <property name="hibernateProperties">
            <props>
                <!-- 方言是必需的 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop>
                <!-- 显示SQL语句  -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- 格式化SQL语句 -->
                <prop key="hibernate.format_sql">true</prop>
                <!-- 是否自动提交 -->
                <prop key="hibernate.connection.autocommit">false</prop>
                <!-- 自动创建修改表 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!-- 关联数据映射文件  -->
        <property name="mappingResources">
            <!-- 数据表映射配置文件 -->
            <list>
                <value>Student.hbm.xml</value>
            </list>
        </property>
    </bean>
    <!-- 同上  -->
     <bean id="sessionfactory2" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" scope="prototype">
        <!-- <property name="configLocation" value="/WEB-INF/classes/hibernate2.cfg.xml"></property> -->
        <property name="dataSource" ref="MySQLDatasource"></property>
        
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list><value>Student.hbm.xml</value></list>
        </property>
    </bean> 
    
    <!--SQLServer连接池  -->
    <bean id="SQLServerDatasource" class="org.apache.commons.dbcp.BasicDataSource" >
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
        <property name="url" value="jdbc:sqlserver://localhost:1433;DatabaseName=StuSys"/>
        <property name="username" value="sa"/>
        <property name="password" value="123456"/>
        <!--每300秒检查连接池中的空闲连接  -->
        <property name="numTestsPerEvictionRun" value="300"></property>
        <!-- 最大空闲时间,900秒未使用则丢弃,若是0则永远不丢弃 -->
        <property name="minEvictableIdleTimeMillis" value="900"></property>
        <!-- 最大连接数 -->
        <property name="maxIdle" value="2"></property>
    </bean>
    
    <!--MySQL连接池  org.apache.commons.dbcp.BasicDataSource是dbcp的jar包的类-->
    <bean id="MySQLDatasource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/StuSys"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <!--每300秒检查连接池中的空闲连接  -->
        <property name="numTestsPerEvictionRun" value="300"></property>
        <!-- 最大空闲时间,900秒未使用则丢弃,若是0则永远不丢弃 -->
        <property name="minEvictableIdleTimeMillis" value="900"></property>
        <!-- 最大连接数 -->
        <property name="maxIdle" value="2"></property>
    </bean>
</beans>
            

3).类名.hbm.xml文件的配置:

这是数据表和实体类的映射,注意类型不匹配很容易出现异常;

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- class代表实体类跟数据库表之间的映射 -->
    <class name="entity.Student" table="student">
        <id name="id" column="ID"><!-- ID的类型要注意对应,否则会出现异常 -->
            <generator class="native"/><!-- class要根据不的数据库填写不同的值 -->
        </id>
        <!--类的每个属性对应表里的每个字段,要注意类型的对应  -->
        <property name="name" column="NAME"/>
        <property name="sex" column="SEX"/>
        <property name="age"  column="AGE"/>
        <property name="addres" column="ADDRES"/>
     </class>
</hibernate-mapping>

5.在src目录下构建项目的包和类:

1).在entity包里创建student.java,实体类属性的类型要正确这很重要;

 1 package entity;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     private String sex;
 7     private int age;
 8     private String addres;
 9     
10     public Student(){}
11     
12     public Student(int id, String name, String sex, int age, String addres) {
13         super();
14         this.id = id;
15         this.name = name;
16         this.sex = sex;
17         this.age = age;
18         this.addres = addres;
19     }
20     
21     
22     public Student(String name, String sex, int age, String addres) {
23         super();
24         this.name = name;
25         this.sex = sex;
26         this.age = age;
27         this.addres = addres;
28     }
29 
30     public int getId() {
31         return id;
32     }
33 
34     public void setId(int id) {
35         this.id = id;
36     }
37 
38     public String getName() {
39         return name;
40     }
41 
42     public void setName(String name) {
43         this.name = name;
44     }
45 
46     public String getSex() {
47         return sex;
48     }
49 
50     public void setSex(String sex) {
51         this.sex = sex;
52     }
53 
54     public int getAge() {
55         return age;
56     }
57 
58     public void setAge(int age) {
59         this.age = age;
60     }
61 
62     public String getAddres() {
63         return addres;
64     }
65 
66     public void setAddres(String addres) {
67         this.addres = addres;
68     }
69     
70 }

 2).客服端发送请求到服务器被struts拦下让Action.java来处理:

 1 package action;
 2 
 3 import java.util.List;
 4 
 5 import com.opensymphony.xwork2.ActionSupport;
 6 
 7 import entity.Student;
 8 import serverce.StudentService;
 9 
10 //Action类就是继承ActionSupport类的普通类
11 public class StudentAction extends ActionSupport {
12     
13     //设置私有属性用于向JSP传递数据
14     private List<Student> myStuList;
15     //或从外部注入实例到本类;
16     private StudentService ss;
17     //这里采用set注入方法,还可以用构造函数方法、接口的方法;
18     public void setSs(StudentService ss) {
19         this.ss = ss;
20     }
21     public List<Student> getMyStuList() {
22         return myStuList;
23     }
24     public void setMyStuList(List<Student> myStuList) {
25         this.myStuList = myStuList;
26     }
27     
28     //返回的类型必需是字符串类型,可以创建多个方法用于不同的跳转
29     public String execute1(){
30         myStuList=ss.getStuAll();
31         System.out.println("全部在:"+myStuList);
32         return "success";
33     }
34     public String execute2(){
35         return "error";
36     }
37 }

3).在Action处理业务逻辑的时候,struts会调用spring为所有类提供实例

 1 package serverce;
 2 
 3 import java.util.List;
 4 
 5 import dao.StudentDao;
 6 import entity.Student;
 7 
 8 public class StudentServiceImpl implements StudentService {
 9     //set注入
10     private StudentDao sdd;
11 
12     /* (non-Javadoc)
13      * @see serverce.StudentService#setSdd(dao.StudentDao)
14      */
15     @Override
16     public void setSdd(StudentDao sdd) {
17         this.sdd = sdd;
18     }
19     
20     /* (non-Javadoc)
21      * @see serverce.StudentService#getStuAll()
22      */
23     @Override
24     public List<Student> getStuAll(){        //解耦合
25         List<Student> list=sdd.getStudentAll();
26         return list;
27     }
28 }

4).处理业务逻辑要用到数据,hibernate提供了sessionfactory类替代JDBC帮我们自动创建表

 1 package dao;
 2 
 3 import java.util.List;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.cfg.Configuration;
 8 
 9 import entity.Student;
10 import util.MyConnection;
11 
12 public class StudentDaoImpl implements StudentDao {
13     //注入sessionfactory工厂类
14     private SessionFactory sessionfactory;
15     private SessionFactory sessionfactory2;
16     
17     public void setSessionfactory(SessionFactory sessionfactory) {
18         this.sessionfactory = sessionfactory;
19     }
20     public void setSessionfactory2(SessionFactory sessionfactory2) {
21         this.sessionfactory2 = sessionfactory2;
22     }
23     /* (non-Javadoc)
24      * @see dao.StudentDao#getStudentAll()
25      */
26     @Override    
27     public List<Student> getStudentAll(){
28         System.out.println("获得一个非常重要的对象sessionFactory"+sessionfactory);
29         Session session=sessionfactory.openSession();
30         Session session2=sessionfactory2.openSession();
31         //读取全部数据打印
32         //创建事务,执行插入数据操作
33         session.beginTransaction();
34         session2.beginTransaction();
35         session.save(new Student("胡歌","男",30,"上海"));
36         session.save(new Student("胡兵","男",35,"深圳"));
37         //获得数据库结果集
38         List<Student> result=session.createQuery("from Student").getResultList();
39         for(Student stu:result){
40             System.out.println("ok");
41             session2.save(stu);
42         }
43         session.getTransaction().commit();
44         session2.getTransaction().commit();
45         sessionfactory.close();
46         sessionfactory2.close();
47         session.close();
48         session2.close();
49         
50         return result;
51     }
52 }

5).这样我们就可以把结果集跳转传递到JSP页面去:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3     <%@ taglib prefix="s" uri="/struts-tags" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11     <table border="1">
12         <tr>
13             <td>全选</td>
14             <td>序号</td>
15             <td>编号</td>
16             <td>姓名</td>
17             <td>性别</td>
18             <td>年龄</td>
19             <td>住址</td>
20         </tr>
21         <s:iterator value="myStuList" status="bcs">
22             <tr>
23                 <td></td>
24                 <td><s:property value="#bcs.count" /></td>
25                 <td><s:property value="id"></s:property></td>
26                 <td><s:property value="name"></s:property></td>
27                 <td><s:property value="sex"></s:property></td>
28                 <td><s:property value="age"></s:property></td>
29                 <td><s:property value="addres"></s:property></td>
30             </tr>
31         </s:iterator>
32         <s:if test="myStuList.size()==0">
33             <tr>
34                 <td colspan="7">没有查找到数据</td>
35             </tr>
36         </s:if>
37     </table>
38 </body>
39 </html>

6).测试:http://localhost:8080/studentSys/StudentAction.action

 
原文地址:https://www.cnblogs.com/huangjinwen/p/5845881.html