Hibernate 如何和 Struts 2 集成?

文章导读
Previous Quiz Next Struts 2 是一个由 Apache 提供的免费开源 web framework,可以从 https://struts.apache.org/releases.html 下载。
📋 目录
  1. 创建 UI 页面
  2. 创建数据库表
  3. 创建 Hibernate 配置文件
  4. 创建映射配置文件
  5. 创建 Struts 2 配置文件
  6. 创建 WEB.XML 文件
  7. 创建 Java 类
  8. 应用程序流程
  9. 部署 Web 应用程序的步骤
  10. 输出
A A

Hibernate - Struts 2 集成



Previous
Quiz
Next

Struts 2 是一个由 Apache 提供的免费开源 web framework,可以从 https://struts.apache.org/releases.html 下载。

在本教程中,我们将使用 Struts 和 Hibernate 构建一个 web 应用程序。您需要 Struts 2 和 Hibernate 的 jar 文件。将这些 jar 文件放入您的 CLASSPATH 中。

这是一个简单的应用程序,包含 2 个 jsp 文件:index.jspshowResults.jsp。用户输入 Student ID 并点击“Search”按钮。showResults.jsp 将根据 Student ID 显示学生信息。

创建 UI 页面

让我们为这个 web 应用程序创建以下 jsp 页面。

index.jsp

<form action="DisplayResults" method="post">
   <center>Student id:<input type="text" name="StudentId"/><br><br/>
   <input type="submit" value="Search"/></center>
</form>

showResults.jsp

<%
String as = request.getParameter("StudentId");
System.out.println("StudentId: " + as);

if(as.equals("")){
   out.print("Sorry, you have not entered Student Id");
}
int idr = Integer.parseInt(as);
Student st1 = StudentDAO.getStudent(idr);
%>
<body>
   <table border="1" align="center">
      <thead><tr><td>StudentID</td><td>First Name</td><td>Last Name</td><td>Dept<td></tr></thead>
      <tr><td><%= st1.getStudentid() %></td><td><%= st1.getfName()%></td><td><%= st1.getlName() %></td><td><%= st1.getDept() %></td></tr>
   </table>
</body>

创建数据库表

让我们使用以下 SQL 查询创建一个 Students 表并插入数据 −

create table students( 
   StudentID int, 
   LastName varchar(255), 
   FirstName varchar(255), 
   Address varchar(255), 
   Dept varchar(255), 
   primary key(StudentID)
);

insert into students values
(1000, 'Agarwal', 'Bonny', '12 Southern Ave', 'Mathematics')
(1001, 'Pandey', 'Amit', ' 8 Ganesh Chandra Rd. ', 'Physics')
(1002, 'Kumar', 'Kalyan', '42 Brick Rd., Alipur', 'English');

创建 Hibernate 配置文件

现在为数据库和其他详细信息创建一个 hibernate 配置文件。

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <property name="hbm2ddl.auto">update</property>
      <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
      <property name="connection.url">jdbc:mysql://localhost/</property>
      <property name="connection.username">root</property>
      <property name="connection.password">guest123</property>
      <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
      <mapping resource="student.hbm.xml"/>
   </session-factory>
</hibernate-configuration>

创建映射配置文件

现在创建一个映射文件,指示 Hibernate 如何将 Student 对象映射到数据库表。

student.hbm.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name="com..webhibernate.Student" table="students">
      <id name="studentid">
         <generator class="increment"></generator>
      </id>
      <property name="firstName" column="firstname"></property>
      <property name="lastName" column="lastname"></property>
      <property name="dept" column="dept"></property>
   </class>
</hibernate-mapping>

创建 Struts 2 配置文件

现在为 Struts 创建一个配置文件,指示 Struts 如何映射 Struts action。

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation  
//DTD Struts Configuration 2.1//EN"   
"http://struts.apache.org/dtds/struts-2.1.dtd">  
<struts>
   <action name="DisplayResults" class="Student" >  
      <result name="success">showResults.jsp</result>  
   </action>
</struts>

创建 WEB.XML 文件

现在在 WEB-INF 文件夹下创建一个 web.xml 部署描述符。

web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5"   SYSTEM web-app_2_5.dtd >
   <welcome-file-list>  
      <welcome-file>index.jsp</welcome-file>  
   </welcome-file-list>  
   <filter>  
      <filter-name>studentFilter</filter-name>  
      <filter-class>  
         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
      </filter-class>  
   </filter>  
   <filter-mapping>  
      <filter-name>studentFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
   </filter-mapping>  
</web-app>

创建 Java 类

现在让我们创建 Student 类和一个 DAO 类,用于持久化 Student 对象。Student 类同时作为 Struts 的 Action class 类和 Hibernate 的 persistent class。

Student.java

package com..webhibernate;

public class Student {

   private int studentid;
   private String firstName;
   private String lastName;
   private String dept;

   public Student() {}

   public Student(int i) {
      this.studentid = i;
   }

   public String execute() {
      return "success";
   }

   public Student getStudentForId(int j) {
      Student s1 = StudentDAO.getStudent(studentid);
      return s1;
   }

   public int getStudentid() {
      return studentid;
   }
   public void setStudentid(int studID) {
      studentid = studID;
   }
   public String getFirstName() {
      return firstName;
   }
   public void setFirstName(String fName) {
      this.firstName = fName;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName(String lName) {
      this.lastName = lName;
   }
   public String getDept() {
      return dept;
   }
   public void setDept(String dept) {
      this.dept = dept;
   }
}

StudentDAO.java

package com..webhibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;  
import org.hibernate.Transaction;  
import org.hibernate.query.Query;
import org.hibernate.boot.Metadata;  
import org.hibernate.boot.MetadataSources;  
import org.hibernate.boot.registry.StandardServiceRegistry;  
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;  
import java.util.List;
import java.util.Iterator;

public class StudentDAO {

   public static Student getStudent(int i) {
      StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();  
      Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build();  

      SessionFactory factory=meta.getSessionFactoryBuilder().build();  
      Session session=factory.openSession();  
      Transaction tx = session.beginTransaction();

      String hql = " from Student where studentid = :student_id ";
      Query<?> query = session.createQuery(hql, Student.class);
      query.setParameter("student_id", i);

      System.out.println("student_id: " + i);
      List<Student> k = (List<Student>) query.getResultList();
      System.out.println("List size: " + k.size());
      tx.commit();
      session.close();
      Student st = new Student(1);
      for (Iterator<?> iterator = k.iterator(); iterator.hasNext();){
         st = (Student) iterator.next();
      }
      return st; 
   }
}

应用程序流程

  1. 用户在 index.jsp 中输入 Student ID

  2. index.jsp 中,表单被指定处理 'DisplayResults' action。'DisplayResults'struts.xml 中映射到 Student.java,这是 Action class。Student.javaexecute() 方法被调用,返回 "success"

  3. 返回 "success" 后,按照 struts.xml 中的声明,控制权传递到 "showResults.jsp"

部署 Web 应用程序的步骤

我们使用 Tomcat 来部署这个 web application。一旦安装了 Tomcat,我们假设 TOMCAT_HOME 环境变量代表 Tomcat 安装目录。

  • TOMCAT_HOME/webapps 目录下创建一个名为 WebHibernate 的目录。

  • 在这个目录(TOMCAT_HOME/webapps)下,放置 index.jspshowResults.jsp

  • 在同一目录 (TOMCAT_HOME/webapps)中创建一个 WEB-INF 目录。

  • WEB-INF 下复制 web.xml

  • WEB-INF 下创建一个 lib 目录,并放置所有依赖项。

  • WEB-INF/classes/com//webhibernate/ 下创建目录结构,并放置 Student.classStudentDAO.class

  • 启动 Tomcat

输出

打开浏览器,输入 URL: http://localhost:8080/WebHibernate 。你的 index 页面将如下所示:

Student Id in Web Application

为 Student Id 输入 1000。结果页面将如下所示:

Student Details in Web Application