Hibernate是一個高性能的對象/關系留存和查詢服務,它是根據(jù)開源GNU寬通用公共許可證(LGPL)許可的,可以免費下載。在這一章。 我們將學習如何實現(xiàn)Struts2 與Hibernate的集成。如果你不熟悉Hibernate,可以查看我們的Hibernate教程。
對于本教程,我們將使用“struts2_tutorial”MySQL數(shù)據(jù)庫,使用用戶名“root”連接到機器上的這個數(shù)據(jù)庫,不設密碼。首先,你需要運行以下腳本。此腳本創(chuàng)建一個名為student的新表,并在此表中創(chuàng)建少量記錄:
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);
接下來讓我們創(chuàng)建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://m.o2fo.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="cn.w3cschool.hibernate.Student" /> </session-factory> </hibernate-configuration>
讓我們過一下hibernate配置文件。首先,我們聲明使用MySQL驅(qū)動程序。然后我們聲明了jdbc url用于連接到數(shù)據(jù)庫。接著我們聲明連接的用戶名,密碼和池大小。我們還指出希望通過將“show_sql”打開為true來查看日志文件中的SQL。請通過Hibernate教程了解這些屬性的含義。最后,我們將映射類設置為在本章中創(chuàng)建的cn.w3cschool.hibernate.Student。
這個項目需要很多jar文件,以下的是所需的JAR文件的完整列表的屏幕截圖:
大多數(shù)JAR文件可以作為struts分發(fā)的一部分獲取。如果你有安裝一個應用程序服務器,如glassfish,websphere或jboss,那么你可以從appserver的lib文件夾中獲取大多數(shù)剩余的jar文件。如果沒有,你可以單獨下載文件:
Hibernate的jar文件- Hibernate.org
Struts的Hibernate插件- Struts hibernate plugin
JTA文件- JTA file
Dom4j文件- Dom4j
SLF4J文件- SLF4J
log4j文件- log4j
其余的文件,你應該能夠從struts2 中分配。
現(xiàn)在讓我們?yōu)閔ibernate集成創(chuàng)建所需的java類。按照Student.java的內(nèi)容:
package cn.w3cschool.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類,根據(jù)Hibernate規(guī)范表示的student表。它具有對應于student表列名的屬性id,firstName和lastName。接下來讓我們創(chuàng)建StudentDAO.java文件,如下所示:
package cn.w3cschool.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類的數(shù)據(jù)訪問層。它有方法來列出所有學生,然后保存一個新的學生記錄。
下面的文件AddStudentAction.java定義了我們的action類。我們在這里有兩個action方法:execute()和listStudents()。execute()方法用于添加新的學生記錄。我們使用dao的save()方法來實現(xiàn)這一點。另一種listStudents()方法用于列出學生。我們使用dao的列表方法來獲取所有學生的列表。
package cn.w3cschool.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.w3cschool.hibernate.Student;
import cn.w3cschool.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;
}
}
你會注意到我們正在實現(xiàn)ModelDriven接口。這是在你的action類處理一個具體的模型類(如Student)而不是個別的屬性(如firstName,lastName)時使用。ModelAware接口需要你實現(xiàn)一個方法來返回模型。在我們的例子中,我們返回“student”對象。
現(xiàn)在創(chuàng)建包含以下內(nèi)容的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”,所以將自動創(chuàng)建一個學生bean,其值自動填充為firstName,lastName和marks。
讓我們使用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.w3cschool.struts2.AddStudentAction"> <result name="success" type="redirect"> listStudents </result> </action> <action name="listStudents" method="listStudents" class="cn.w3cschool.struts2.AddStudentAction"> <result name="success">/students.jsp</result> </action> </package> </struts>要注意的要點是,我們的包“myhibernate”擴展了名為“hibernate-default”的struts2默認包。然后我們聲明兩個action:addStudent和listStudents。addStudent調(diào)用AddStudentAction類的execute(),然后在成功時調(diào)用listStudents方法。listStudent方法調(diào)用AddStudentAction類上的listStudents(),并使用student.jsp作為視圖。現(xiàn)在,右鍵單擊項目名稱,然后單擊“Export”> “WAR File”以創(chuàng)建WAR文件。然后在Tomcat的webapps目錄中部署WAR文件。最后,啟動Tomcat服務器并嘗試訪問URL http://localhost:8080/HelloWorldStruts2/student.jsp,將顯示以下界面:
在上面部分,我們得到一個表單,輸入新學生記錄的值,下面部分列出數(shù)據(jù)庫中的學生。繼續(xù)添加一個新的學生記錄,然后按提交。屏幕將刷新,并在每次單擊提交時向你顯示更新了的列表。
更多建議: