Struts2 Hibernate集成

2022-07-08 11:43 更新

Hibernate是一個高性能的對象/關系留存和查詢服務,它是根據(jù)開源GNU寬通用公共許可證(LGPL)許可的,可以免費下載。在這一章。 我們將學習如何實現(xiàn)Struts2 與Hibernate的集成。如果你不熟悉Hibernate,可以查看我們的Hibernate教程

數(shù)據(jù)庫設置

對于本教程,我們將使用“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);

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://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。

環(huán)境搭建

這個項目需要很多jar文件,以下的是所需的JAR文件的完整列表的屏幕截圖:

Struts和Hibernate的jar

大多數(shù)JAR文件可以作為struts分發(fā)的一部分獲取。如果你有安裝一個應用程序服務器,如glassfish,websphere或jboss,那么你可以從appserver的lib文件夾中獲取大多數(shù)剩余的jar文件。如果沒有,你可以單獨下載文件:

其余的文件,你應該能夠從struts2 中分配。

Hibernate類

現(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ù)訪問層。它有方法來列出所有學生,然后保存一個新的學生記錄。

Action類

下面的文件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”對象。

創(chuàng)建視圖文件

現(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。
在下面部分,我們?yōu)g覽學生列表(參見AddStudentAction.java),并在表中顯示firstname,lastname和marks的值。

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="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,將顯示以下界面:
Struts和Hibernate的集成

在上面部分,我們得到一個表單,輸入新學生記錄的值,下面部分列出數(shù)據(jù)庫中的學生。繼續(xù)添加一個新的學生記錄,然后按提交。屏幕將刷新,并在每次單擊提交時向你顯示更新了的列表。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號