Struts2和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的配置文件hibernate.cfg.xml中。
om.mysql.jdbc.Driver <property name="hibernate.connection.url"> jdbc:mysql://www.yiibai.com/struts\_tutorial <property name="hibernate.connection.username">root <property name="hibernate.connection.password"> <property name="hibernate.connection.pool_size">10 <property name="show_sql">true <property name="dialect"> org.hibernate.dialect.MySQLDialect <property name="hibernate.hbm2ddl.auto">update <mapping class="com.yiibai.hibernate.Student" />
讓我們通過hibernate的配置文件。首先,我們正在使用的MySQL驅動程序。然後,我們聲明 JDBC URL連接到數據庫。然後,聲明連接的用戶名,密碼以及池的大小。我們也表示,我們希望「show_sql」轉向真正看到SQL的日誌文件中。請經過Hibernate教程,瞭解這些屬性是什麼意思。最後,我們設置了的映射類com.yiibai.hibernate.Student,我們將本章中創建。
環境設置:
接下來,這個項目需要一大堆的jar文件。附所需的JAR文件的完整列表的截圖:
大部分的JAR文件可以作爲Struts的分佈的一部分。如果有一個如GlassFish應用服務器,WebSphere或JBoss安裝,那麼可以得到的大部分jar文件從應用服務器的lib文件夾。如果沒有,可以單獨下載的文件:
Hibernate jar files - Hibernate.org
Struts hibernate plugin - Struts hibernate plugin
JTA files- JTA files
Dom4j files - Dom4j
SLF4J files - SLF4J
log4j files - log4j
其餘的文件,應該能夠從struts2的分發得到。
Hibernate 類:
現在讓我們來創建Hibernate集成所需的Java類。以下內容Student.java:
package com.yiibai.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.yiibai.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類,學生類是數據訪問層。它有一些方法來列出所有學生,然後保存一個新的學生記錄。
動作類:
以下文件AddStudentAction.java定義我們的動作類。我們這裏有兩個動作方法 - execute() 和 listStudents()。 execute()方法是用來添加新的學生記錄。使用DAO的save()方法來實現這一目標。另一種方法,listStudents()用來列出學生。我們使用DAO的的列表方法得到所有學生的名單。
package com.yiibai.struts2; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.yiibai.hibernate.Student; import com.yiibai.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接口你會注意到,這是用來當你的操作類處理一個具體的模型類(如學生),而不是個人屬性(如名字,姓氏)。的ModelAware接口需要實現的方法,以返回到模型。在我們的例子中,我們返回「學生」對象。
創建視圖文件:
現在讓我們創建student.jsp視圖文件包含以下內容:
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%>
First Name | Last Name | Marks |
<s:property value="firstName"/> | <s:property value="lastName"/> | <s:property value="marks"/> |
非常簡單student.jsp。在上面的部分,我們有一個形式提交到「addStudent.action」。這需要在名字,姓氏和備註。因爲addStudent 動作,自動綁到ModelAware的「AddSudentAction」,將創建一個學生bean的名字,姓氏和標記自動填充的值。
在底部,我們去通過的學生名單(見AddStudentAction.java)。我們遍歷列表和顯示的值在表中的姓氏,名稱和備註。
Struts 配置:
讓我們把它放在一起使用struts.xml:
這裏要注意的最重要的事情是,我們包函「myhibernate」擴展Struts2默認包稱爲「hibernate-default」。然後我們聲明兩個動作 - addStudent和listStudents。 addStudent調用execute()上AddStudentAction類,然後,它調用listStudents操作方法successs。
listStudent動作方法調用listStudents()上AddStudentAction類作爲視圖,並使用student.jsp
現在右擊項目名稱,並單擊Export > WAR 文件創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/student.jsp。這會給你以下畫面:
在上面的部分,我們得到的一種形式,進入一個新的學生記錄和底部列出了學生在數據庫中的值。繼續並添加一個新的學生記錄,按提交。屏幕將刷新並顯示您的更新列表。