Struts 和 Hibernate 集成

  • 简述

    Hibernate 是一种高性能的对象/关系持久化和查询服务,它在开源 GNU 宽松通用公共许可证 (LGPL) 下获得许可,可以免费下载。在这一章当中。我们将学习如何实现 Struts 2 与 Hibernate 的集成。如果您不熟悉 Hibernate,那么您可以查看我们的 Hibernate 教程。
  • 数据库设置

    在本教程中,我将使用“struts2_tutorial”MySQL 数据库。我使用用户名“root”并且没有密码连接到我机器上的这个数据库。首先,您需要运行以下脚本。此脚本创建一个名为的新表student 并在此表中创建少量记录 -
    
    CREATE TABLE IF NOT EXISTS `student` (
       `id` int(11) NOT NULL AUTO_INCREMENT,
       `first_name` varchar(40) NOT NULL,
       `last_name` varchar(40) NOT NULL,
       `marks` int(11) NOT NULL,
       PRIMARY KEY (`id`)
    );
    --
    -- Dumping data for table `student`
    --
    INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
       VALUES(1, 'George', 'Kane', 20);
    INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
       VALUES(2, 'Melissa', 'Michael', 91);
    INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
       VALUES(3, 'Jessica', 'Drake', 21);
    
  • 休眠配置

    接下来让我们创建 hibernate.cfg.xml,它是 hibernate 的配置文件。
    
    <?xml version = '1.0' encoding = 'utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
       "-//Hibernate/Hibernate Configuration DTD//EN"
       "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
       <session-factory>
          <property name = "hibernate.connection.driver_class">c
             om.mysql.jdbc.Driver
          </property>
          
          <property name = "hibernate.connection.url">
             jdbc:mysql://www.cainiaoya.com/struts_tutorial
          </property>
          
          <property name = "hibernate.connection.username">root</property>
          
          <property name = "hibernate.connection.password"></property>
          
          <property name = "hibernate.connection.pool_size">10</property>
          
          <property name = "show_sql">true</property>
          
          <property name = "dialect">
             org.hibernate.dialect.MySQLDialect
          </property>
          
          <property name = "hibernate.hbm2ddl.auto">update</property>
          
          <mapping class = "com.jc2182.hibernate.Student" />
       </session-factory>
    </hibernate-configuration> 
    
    让我们来看看休眠配置文件。首先,我们声明我们正在使用 MySQL 驱动程序。然后我们声明了连接数据库的jdbc url。然后我们声明了连接的用户名、密码和池大小。我们还表示我们希望通过将“show_sql”设置为 true 来查看日志文件中的 SQL。请阅读休眠教程以了解这些属性的含义。
    最后,我们将映射类设置为我们将在本章中创建的 com.jc2182.hibernate.Student。
  • 环境设置

    接下来你需要为这个项目准备很多 jars。附件是所需 JAR 文件的完整列表的屏幕截图 -
    Struts 和 Hibernate jars
    大多数 JAR 文件都可以作为 struts 发行版的一部分获得。如果您安装了应用程序服务器,例如 glassfish、websphere 或 jboss,那么您可以从应用程序服务器的 lib 文件夹中获取大部分剩余的 jar 文件。如果没有,您可以单独下载文件 -
    其余的文件,您应该能够从您的 Struts2 发行版中获得。
  • 休眠类

    现在让我们为休眠集成创建所需的 Java 类。以下是内容Student.java
    
    package com.jc2182.hibernate;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    @Entity
    @Table(name = "student")
    public class Student {
        
       @Id
       @GeneratedValue
       private int id;
       @Column(name = "last_name")
       private String lastName;
       @Column(name = "first_name")
       private String firstName;
       private int marks;
       
       public int getId() {
        return id;
       }
       
       public void setId(int id) {
        this.id = id;
       }
       
       public String getLastName() {
          return lastName;
       }
       
       public void setLastName(String lastName) {
          this.lastName = lastName;
       }
       
       public String getFirstName() {
          return firstName;
       }
       
       public void setFirstName(String firstName) {
          this.firstName = firstName;
       }
       
       public int getMarks() {
          return marks;
       }
       
       public void setMarks(int marks) {
          this.marks = marks;
       }
    }
    
    这是一个 POJO 类,表示 student表按照 Hibernate 规范。它具有与学生表的列名对应的属性 id、firstName 和 lastName。接下来让我们创建StudentDAO.java 文件如下 -
    
    package com.jc2182.hibernate;
    import java.util.ArrayList;
    import java.util.List;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import com.googlecode.s2hibernate.struts2.plugin.\
       annotations.SessionTarget;
    import com.googlecode.s2hibernate.struts2.plugin.\
       annotations.TransactionTarget;
    public class StudentDAO {
        
       @SessionTarget
       Session session;
       @TransactionTarget
       Transaction transaction;
       @SuppressWarnings("unchecked")
       public List<Student> getStudents() {
          List<Student> students = new ArrayList<Student>();
          
          try {
             students = session.createQuery("from Student").list();
          } catch(Exception e) {
             e.printStackTrace();
          }
          return students;
       }
       public void addStudent(Student student) {
          session.save(student);
       }
    }
    
    StudentDAO 类是 Student 类的数据访问层。它具有列出所有学生然后保存新学生记录的方法。
  • 动作类

    以下文件 AddStudentAction.java定义我们的动作类。我们这里有两个动作方法——execute() 和 listStudents()。execute() 方法用于添加新的学生记录。我们使用 dao 的 save() 方法来实现这一点。
    另一种方法 listStudents() 用于列出学生。我们使用 dao 的 list 方法来获取所有学生的列表。
    
    package com.jc2182.struts2;
    import java.util.ArrayList;
    import java.util.List;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.jc2182.hibernate.Student;
    import com.jc2182.hibernate.StudentDAO;
    public class AddStudentAction extends ActionSupport implements ModelDriven<Student> {
       Student student  = new Student();
       List<Student> students = new ArrayList<Student>();
       StudentDAO dao = new StudentDAO();
       @Override
      
      public Student getModel() {
          return student;
       }
       public String execute() {
          dao.addStudent(student);
          return "success";
       }
       public String listStudents() {
          students = dao.getStudents();
          return "success";
       }
       public Student getStudent() {
          return student;
       }
       public void setStudent(Student student) {
          this.student = student;
       }
       public List<Student> getStudents() {
          return students;
       }
       public void setStudents(List<Student> students) {
          this.students = students;
       }
        
    }
    
    您会注意到我们正在实现 ModelDriven 接口。当您的操作类处理具体模型类(例如 Student)而不是单个属性(例如 firstName、lastName)时,会使用此方法。ModelAware 接口要求您实现一个方法来返回模型。在我们的例子中,我们返回的是“student”对象。
  • 创建视图文件

    现在让我们创建 student.jsp 查看具有以下内容的文件 -
    
    <%@ page contentType = "text/html; charset = UTF-8"%>
    <%@ taglib prefix = "s" uri = "/struts-tags"%>
    <html>
       <head>
          <title>Hello World</title>
          <s:head />
       </head>
       
       <body>
          <s:form action = "addStudent">
             <s:textfield name = "firstName" label = "First Name"/>
             <s:textfield name = "lastName" label = "Last Name"/>
             <s:textfield name = "marks" label = "Marks"/>
             <s:submit/>
             <hr/>
             
             <table>
                <tr>
                   <td>First Name</td>
                   <td>Last Name</td>
                   <td>Marks</td>
                </tr>
                
                <s:iterator value = "students">   
                   <tr>
                      <td><s:property value = "firstName"/></td>
                      <td><s:property value = "lastName"/></td>
                      <td><s:property value = "marks"/></td>
                     </tr>
                </s:iterator> 
             </table>
          </s:form>
       </body>
    </html>
    
    student.jsp 非常简单。在顶部,我们有一个提交给“addStudent.action”的表单。它接受 firstName、lastName 和标记。由于 addStudent 操作与 ModelAware“AddSudentAction”相关联,因此将自动创建一个包含 firstName、lastName 和标记自动填充值的学生 bean。
    在底部,我们查看学生列表(请参阅 AddStudentAction.java)。我们遍历列表并在表中显示名字、姓氏和标记的值。
  • 支柱配置

    让我们把它放在一起使用 struts.xml
    
    <?xml version = "1.0" Encoding = "UTF-8"?>
    <!DOCTYPE struts PUBLIC
       "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
       "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
       <constant name = "struts.devMode" value = "true" />
       <package name = "myhibernate" extends = "hibernate-default">
          <action name = "addStudent" method = "execute"
             class = "com.jc2182.struts2.AddStudentAction">
             <result name = "success" type = "redirect">
                listStudents
             </result>
          </action>
          <action name = "listStudents" method = "listStudents"
             class = "com.jc2182.struts2.AddStudentAction">
             <result name = "success">/students.jsp</result>
          </action>
       </package>
    </struts>
    
    这里要注意的重要一点是,我们的包“myhibernate”扩展了名为“hibernate-default”的 struts2 默认包。然后我们声明两个动作 - addStudent 和 listStudents。addStudent 调用 AddStudentAction 类上的 execute(),然后在成功时调用 listStudents 操作方法。
    listStudent 操作方法调用 AddStudentAction 类上的 listStudents() 并使用 student.jsp 作为视图。
    现在,右键单击项目名称并单击 Export > WAR File创建一个战争文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动Tomcat服务器并尝试访问URLhttp://localhost:8080/HelloWorldStruts2/student.jsp. 这将产生以下屏幕 -
    Struts 和 Hibernate 结果
    在顶部,我们得到一个表单,用于输入新学生记录的值,底部列出了数据库中的学生。继续添加一个新的学生记录,然后按提交。每次单击提交时,屏幕都会刷新并显示更新的列表。