Hibernate(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.xnip.cn/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 = "cn.xnip.hibernate.Student" />
</session-factory>
</hibernate-configuration>
我们来看看hibernate配置文件。 首先,我们声明我们正在使用MySQL驱动程序。 然后我们声明了jdbc url用于连接数据库。 然后我们声明了连接的用户名,密码和池大小。 我们还指出,我们希望通过将“show_sql”设置为true来查看日志文件中的SQL。 请仔细阅读hibernate教程,了解这些属性的含义。
最后,我们将映射类设置为cn.xnip.hibernate.Student,我们将在本章中创建它。
环境设置
接下来,你需要为这个项目提供大量的罐子。 附件是所需JAR文件的完整列表的屏幕截图 -

大多数JAR文件都可以作为struts发行版的一部分获得。 如果您安装了诸如glassfish,websphere或jboss之类的应用程序服务器,那么您可以从appserver的lib文件夹中获取大部分剩余的jar文件。 如果没有,您可以单独下载文件 -
Hibernate jar文件 - Hibernate.org
Struts hibernate插件 - Struts hibernate插件
JTA文件 - JTA文件
Dom4j文件 - Dom4j
log4j文件 - log4j
其余的文件,你应该能够从你的Struts2发行版中获得。
Hibernate类
现在让我们为hibernate集成创建所需的java类。 以下是Student.java的内容 -
package cn.xnip.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,它们对应于student表的列名。 接下来让我们创建StudentDAO.java文件,如下所示 -
package cn.xnip.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 cn.xnip.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.xnip.hibernate.Student;
import cn.xnip.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.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”绑定,因此将自动创建一个学生bean,其中firstName,lastName和marks的值已自动填充。
在底部,我们将浏览学生列表(请参阅AddStudentAction.java)。 我们遍历列表并显示表中名字,姓氏和标记的值。
Struts配置
让我们使用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 = "cn.xnip.struts2.AddStudentAction">
<result name = "success" type = "redirect">
listStudents
</result>
</action>
<action name = "listStudents" method = "listStudents"
class = "cn.xnip.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目录中部署此WAR。 最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/student.jsp 。 这将产生以下屏幕 -

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