Hibernate集成
编辑教程Hibernate集成
Hibernate是一个高性能的对象/关系留存和查询服务,它是根据开源GNU宽通用公共许可证(LGPL)许可的,可以免费下载。
本章将学习如何实现Struts2 与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配置
接下来让创建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.jsrun.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.jsrun.hibernate.Student" />
</session-factory>
</hibernate-configuration>
过一下hibernate配置文件。首先,声明使用MySQL驱动程序。然后声明了jdbc url用于连接到数据库。
接着声明连接的用户名,密码和池大小。还指出希望通过将“show_sql”打开为true来查看日志文件中的SQL。请通过Hibernate教程了解这些属性的含义。
最后,将映射类设置为在本章中创建的cn.jsrun.hibernate.Student。
环境搭建
这个项目需要很多jar文件,以下的是所需的JAR文件的完整列表的屏幕截图:
大多数JAR文件可以作为struts分发的一部分获取。如果你有安装一个应用程序服务器,如glassfish,websphere或jboss,那么你可以从appserver的lib文件夹中获取大多数剩余的jar文件。如果没有,你可以单独下载文件:
- Hibernate的jar文件- Hibernate.org
- Struts的Hibernate插件- Struts hibernate plugin
- JTA文件- JTA file
- Dom4j文件- Dom4j
- SLF4J文件- SLF4J
- log4j文件- log4j
其余的文件,你应该能够从struts2 中分配。
Hibernate类
现在让为hibernate集成创建所需的java类。按照Student.java的内容:
package cn.jsrun.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表。它具有对应于student表列名的属性id,firstName和lastName。接下来让创建StudentDAO.java文件,如下所示:
package cn.jsrun.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类的数据访问层。它有方法来列出所有学生,然后保存一个新的学生记录。
Action类
下面的文件AddStudentAction.java定义了action类。
在这里有两个action方法:execute()和listStudents()。execute()方法用于添加新的学生记录。
使用dao的save()方法来实现这一点。另一种listStudents()方法用于列出学生。使用dao的列表方法来获取所有学生的列表。
package cn.jsrun.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.jsrun.hibernate.Student;
import cn.jsrun.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接口。这是在你的action类处理一个具体的模型类(如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和marks。
因为addStudent action绑定到ModelAware的“AddSudentAction”,所以将自动创建一个学生bean,其值自动填充为firstName,lastName和marks。
在下面部分,浏览学生列表(参见AddStudentAction.java),并在表中显示firstname,lastname和marks的值。
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.jsrun.struts2.AddStudentAction">
<result name="success" type="redirect">
listStudents
</result>
</action>
<action name="listStudents" method="listStudents"
class="cn.jsrun.struts2.AddStudentAction">
<result name="success">/students.jsp</result>
</action>
</package>
</struts>
要注意的要点是,包“myhibernate”扩展了名为“hibernate-default”的struts2默认包。
然后声明两个action: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
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间