Struts 2和Hibernate集成 Struts 2和Tile集成 Hibernate是一种高性能的对象/关系持久性和查询服务,它在开源GNU较宽松通用公共许可证(LGPL)下许可并可免费下载。在这一章当中。我们将学习如何实现与Hibernate的Struts 2集成。如果你不熟悉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.CodingDict.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.CodingDict.hibernate.Student" /> </session-factory> </hibernate-configuration> 让我们通过休眠配置文件。首先,我们声明我们正在使用MySQL驱动程序。然后我们声明了连接到数据库的jdbc url。然后我们宣布连接的用户名,密码和池大小。我们还表示,我们希望通过打开“show_sql”为true来查看日志文件中的SQL。请通过hibernate教程来了解这些属性的含义。 最后,我们将映射类设置为我们将在本章中创建的com.CodingDict.hibernate.Student。 环境设置 接下来,你需要一大堆这个项目的罐子。附件是所需JAR文件完整列表的屏幕截图 - 大多数JAR文件都可以作为struts发行版的一部分获得。如果您安装了诸如glassfish,websphere或jboss等应用程序服务器,则可以从应用服务器的lib文件夹中获取大部分剩余的jar文件。如果不是,你可以单独下载文件 Hibernate jar文件 - http://hibernate.org/ Struts hibernate插件 - https://code.google.com/p/full-hibernate-plugin-for-struts2/downloads/list JTA文件 - https://www.oracle.com/technetwork/java/javaee/jta/index.html Dom4j文件 - http://dom4j.sourceforge.net/ log4j文件 - https://logging.apache.org/log4j/1.2/ 其余的文件,你应该能够从你的Struts2发行版中获得。 休眠类 现在让我们为hibernate集成创建必需的java类。以下是 Student.java 的内容- package com.CodingDict.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规范来表示 学生 表。它具有与学生表的列名相对应的属性id,firstName和lastName。接下来让我们创建 StudentDAO.java 文件,如下所示 package com.CodingDict.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的列表方法来获取所有学生的列表。 package com.CodingDict.struts2; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.CodingDict.hibernate.Student; import com.CodingDict.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 class="table table-bordered"> <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”绑定,因此将自动创建student 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 = "com.CodingDict.struts2.AddStudentAction"> <result name = "success" type = "redirect"> listStudents </result> </action> <action name = "listStudents" method = "listStudents" class = "com.CodingDict.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作为视图。 现在,右键单击项目名称,然后单击 导出 > WAR文件创建一个 WAR 文件。然后将这个WAR部署到Tomcat的webapps目录中。最后,启动Tomcat服务器并尝试访问URL http:// localhost:8080 / HelloWorldStruts2 / student.jsp 。这将产生以下屏幕 - 在最上面的部分,我们得到一个表格来输入新学生记录的值,最下面的部分列出数据库中的学生。继续添加新的学生记录并按提交。每次点击提交时,屏幕将刷新并显示更新列表。 Struts 2和Tile集成