鍍金池/ 教程/ Java/ Hibernate 集成
注釋
主題/模板
驗證
有用的資源
Struts 2 注解類型
實例
攔截器
異常處理
表單標簽
結果類型
值棧/OGNL
Spring 集成
數據標簽
環(huán)境配置
配置
類型轉換
動作
Hibernate 集成
本地化
發(fā)送郵件
Ajax 標簽
數據庫訪問
體系結構
文件上傳
Tiles 集成
概述
基本的 MVC 架構
控制標簽

Hibernate 集成

Hibernate 是一個高性能的對象/關系持久性,能夠查詢在開源 GNU Lesser General Public License(LGPL) 下的服務較小,并且是免費下載的。在這一章,我們要學習如何用 Hibernate 集成實現 Struts 2。

數據庫設置

在本教程中,我將使用 “struts2_tutoria” MySQL 數據庫。我使用用戶名 “root”、無密碼來連接到我計算機中的數據庫。首先,你需要運行以下腳本。這個腳本創(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);

Hibernate 配置

接下來讓我們創(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://www.tutorialspoint.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.tutorialspoint.hibernate.Student" />
</session-factory>
</hibernate-configuration> 

讓我們仔細檢查這個 hibernate 配置文件。首先,我們聲明我們使用的是 MySQL 驅動。然后我們?yōu)檫B接到數據庫聲明 jdbc url。接下來我們聲明連接的用戶名,密碼和池的大小。同時我們也表明通過將 "show_sql" 設置為 true,我們會在日志文件中看到這個 SQL。請仔細瀏覽 hibernate 教程來理解這些屬性的含義。最后,我們將 mapping 類設置為 com.tutorialspoint.hibernate.Student,也就是我們在本章中將要創(chuàng)建的。

環(huán)境設置

接下來你需要為這個項目創(chuàng)建許多 jar 文件。附件是所需的 JAR 文件的完整列表截圖:

http://wiki.jikexueyuan.com/project/struts-2/images/struts-hibernate-jars.gif" alt="" />

大多數 JAR 文件可以作為你的 struts 發(fā)行版的一部分獲取。如果你有一個已安裝的應用程序服務器,如 glassfish,websphere 或 jboss,那么你就可以從應用程序服務器的 lib 文件夾中得到大部分剩余的 jar 文件。如果沒有的話,那么你可以分別下載這些文件:

剩余的文件,你應該能夠從你的 struts2 發(fā)行版中得到。

Hibernate 類

現在讓我們?yōu)?hibernate 集成創(chuàng)建必需的 java 類。下面是 Student.java 的內容:

package com.tutorialspoint.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 表中的列名相對應。下面讓我們創(chuàng)建 StudentDAO.java 文件,如下所示:

package com.tutorialspoint.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 類的數據訪問層。它有列出所有 students 和保存一個新的 student 記錄的方法。

Action 類

下述文件 AddStudentAction.java 定義了 action 類。在這里我們同樣有兩個 action 方法 - execute() 和 listStudents()。execute() 方法用來添加新的 student 記錄。我們使用 dao 的 save() 方法來獲取。另一個方法,listStudents() 用來列出 students。我們使用 dao 的 list 方法來得到所有 student 的列表。

package com.tutorialspoint.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.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” 對象。

創(chuàng)建視圖文件

現在讓我們創(chuàng)建 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 非常簡單。在最上面的一節(jié)中,我們有一個要提交到 "addStudent.action" 的表單。它帶有 firstName,lastName 和標記。由于 addStudent 操作與 ModelAware "AddSudentAction" 綁定了,那么就會自動創(chuàng)建一個帶有 firstName,lastName 和自動填充標記的 student bean。

在最下面的一節(jié)中,我們查看了 student 列表(請看 AddStudentAction.java)。我們遍歷該列表,并顯示表中的 first name,last name 和標記的值。

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.tutorialspoint.struts2.AddStudentAction">
         <result name="success" type="redirect">
               listStudents
         </result>
      </action>
      <action name="listStudents" method="listStudents"
         class="com.tutorialspoint.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 文件來創(chuàng)建一個 War 文件。然后在 Tomcat 的 web 應用程序目錄中部署這個 WAR 文件。最后,啟動 Tomcat 服務器并嘗試訪問 URL http://localhost:8080/HelloWorldStruts2/student.jsp. 這將顯示如下所示的畫面:

http://wiki.jikexueyuan.com/project/struts-2/images/struts_hibernate_result.gif" alt="" />

在最上面的一節(jié)中,我們得到了一個表單,能夠為新的 student 記錄輸入值,在最下面的一節(jié)中列出了數據庫中的 students。請繼續(xù)添加新的 student 記錄并按下提交。每次你按下提交按鈕后,屏幕會刷新并顯示更新的列表。

上一篇:Struts 2 注解類型下一篇:動作