Struts 2 简明教程

Struts 2 and Hibernate Integration

Hibernate 是一项高性能对象/关系持久性与查询服务,该服务通过开放源代码 GNU Lesser General Public License (LGPL) 获得许可,并可免费下载。在本章中,我们将了解如何将 Struts 2 集成到 Hibernate 中。如果您不熟悉 Hibernate,则可以查看我们的 Hibernate tutorial

Database Setup

对于本教程,我将使用“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 Configuration

接下来让我们创建 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.tutorialspoint.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.tutorialspoint.hibernate.Student" />
   </session-factory>
</hibernate-configuration>

让我们仔细阅读 Hibernate 配置文件。首先,我们声明了我们使用的是 MySQL 驱动程序。然后我们声明了用于连接到数据库的 jdbc url。然后我们声明了连接的用户名、密码和池大小。我们还表明,通过将“show_sql”切换为 true,我们希望看到日志文件中的 SQL。请仔细阅读 Hibernate 教程以了解这些属性的含义。

最后,我们将映射类设置为 com.tutorialspoint.hibernate.Student,我们将在本章中创建此类。

Envrionment Setup

接下来,您需要为该项目引入许多 jar。附件是所需 JAR 文件的完整列表的屏幕截图−

struts hibernate jars

大多数 JAR 文件可以作为 Struts 分发的一部分获得。如果您已安装 Glassfish、WebSphere 或 JBoss 等应用服务器,则可以从应用服务器的 lib 文件夹中获取剩余 jar 文件。如果没有,则可以单独下载这些文件−

  1. Hibernate jar 文件 − Hibernate.org

  2. Struts Hibernate 插件 − Struts hibernate plugin

  3. JTA 文件 − JTA files

  4. Dom4j files − Dom4j

  5. log4j files − log4j

其余文件,您应该可以从 Struts2 分发中获取。

Hibernate Classes

现在,让我们为 Hibernate 集成创建必要的 Java 类。以下是 Student.java 的内容 −

package com.tutorialspoint.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 类,它根据 Hibernate 规范表示 student 表。它具有与学生表中列名称相对应的 id、firstName 和 lastName 三个属性。接下来,让我们按照如下方式创建 StudentDAO.java 文件 −

package com.tutorialspoint.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 类的 data access layer(数据访问层)。它具有用于列出所有学生以及保存新学生记录的方法。

Action Class

以下文件 AddStudentAction.java 定义了我们的操作类。这里有两种操作方法 - execute() 和 listStudents()。execute() 方法用于添加新的学生记录。我们使用 dao 的 save() 方法实现这一功能。

另一个方法 listStudents() 用于列出学生。我们使用 dao 的 list 方法获取所有学生的列表。

package com.tutorialspoint.struts2;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.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”对象。

Create View Files

现在,让我们使用以下内容创建 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 和 marks。因为 addStudent 操作绑定到 ModelAware “AddSudentAction”,所以会自动创建一个 student bean,其中包含 firstName、lastName 和 marks 的值自动填充。

在底部部分,我们浏览学生列表(见 AddStudentAction.java)。我们遍历列表并在表格中显示名字、姓氏和分数的值。

Struts Configuration

我们使用 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.tutorialspoint.struts2.AddStudentAction">
         <result name = "success" type = "redirect">
            listStudents
         </result>
      </action>

      <action name = "listStudents" method = "listStudents"
         class = "com.tutorialspoint.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 文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动 Tomcat 服务器并尝试访问 URL http://localhost:8080/HelloWorldStruts2/student.jsp 。这将生成以下屏幕 −

struts hibernate result

在顶部部分,我们获取用于输入新学生记录值的一个表单,底部部分列出了数据库中的学生。继续添加一个新学生记录并按提交。每次您单击“提交”时,屏幕将刷新并向您显示一个更新的列表。