位置:首頁 > Java技術 > Struts2教學 > Struts2和Hibernate集成

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中。

<?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.gitbook.net/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.yiibai.hibernate.Student" />
</session-factory>
</hibernate-configuration> 

讓我們通過hibernate的配置文件。首先,我們正在使用的MySQL驅動程序。然後,我們聲明 JDBC URL連接到數據庫。然後,聲明連接的用戶名,密碼以及池的大小。我們也表示,我們希望“show_sql”轉向真正看到SQL的日誌文件中。請經過Hibernate教學,了解這些屬性是什麼意思。最後,我們設置了的映射類com.yiibai.hibernate.Student,我們將本章中創建。

環境設置:

接下來,這個項目需要一大堆的jar文件。附所需的JAR文件的完整列表的截圖:

Struts and Hibernate Jars

大部分的JAR文件可以作為Struts的分布的一部分。如果有一個如GlassFish應用服務器,WebSphere或JBoss安裝,那麼可以得到的大部分jar文件從應用服務器的lib文件夾。如果冇有,可以單獨下載的文件:

其餘的文件,應該能夠從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"%>
<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”。這需要在名字,姓氏和備注。因為addStudent 動作,自動綁到ModelAware的“AddSudentAction”,將創建一個學生bean的名字,姓氏和標記自動填充的值。

在底部,我們去通過的學生名單(見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.yiibai.struts2.AddStudentAction">
         <result name="success" type="redirect">
               listStudents
         </result>
      </action>

      <action name="listStudents" method="listStudents"
         class="com.yiibai.struts2.AddStudentAction">
         <result name="success">/students.jsp</result>
      </action>

</package>

</struts>

這裡要注意的最重要的事情是,我們包函“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。這會給你以下畫麵: 

Struts and Hibernate Result

在上麵的部分,我們得到的一種形式,進入一個新的學生記錄和底部列出了學生在數據庫中的值。繼續並添加一個新的學生記錄,按提交。屏幕將刷新並顯示您的更新列表。