Struts 2 และ Hibernate Integration

Hibernate เป็นบริการการคงอยู่และการสืบค้นของ Object / Relational ที่มีประสิทธิภาพสูงซึ่งได้รับอนุญาตภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNU Lesser General Public License (LGPL) แบบโอเพนซอร์สและดาวน์โหลดได้ฟรี ในบทนี้. เราจะเรียนรู้วิธีการบรรลุการรวม Struts 2 กับ Hibernate หากคุณไม่คุ้นเคยกับไฮเบอร์เนตคุณสามารถตรวจสอบบทแนะนำไฮเบอร์เนตของเราได้

การตั้งค่าฐานข้อมูล

สำหรับบทช่วยสอนนี้ฉันจะใช้ฐานข้อมูล MySQL "struts2_tutorial" ฉันเชื่อมต่อกับฐานข้อมูลนี้บนเครื่องของฉันโดยใช้ชื่อผู้ใช้ "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.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>

ให้เราไปที่ไฟล์กำหนดค่าไฮเบอร์เนต อันดับแรกเราประกาศว่าเรากำลังใช้ไดรเวอร์ MySQL จากนั้นเราประกาศ jdbc url สำหรับเชื่อมต่อกับฐานข้อมูล จากนั้นเราก็ประกาศชื่อผู้ใช้รหัสผ่านและขนาดพูลของการเชื่อมต่อ นอกจากนี้เรายังระบุด้วยว่าเราต้องการเห็น SQL ในไฟล์บันทึกโดยเปิด "show_sql" เป็น true โปรดอ่านบทแนะนำการจำศีลเพื่อทำความเข้าใจว่าคุณสมบัติเหล่านี้หมายถึงอะไร

สุดท้ายเราตั้งค่าคลาสการทำแผนที่เป็น com.tutorialspoint.hibernate.Student ซึ่งเราจะสร้างในบทนี้

การตั้งค่าสภาพแวดล้อม

ถัดไปคุณต้องมีขวดจำนวนมากสำหรับโครงการนี้ สิ่งที่แนบมาเป็นภาพหน้าจอของรายการไฟล์ JAR ทั้งหมดที่จำเป็น -

ไฟล์ JAR ส่วนใหญ่สามารถรับได้โดยเป็นส่วนหนึ่งของการกระจายสตรัทของคุณ หากคุณมีแอปพลิเคชันเซิร์ฟเวอร์เช่น glassfish, websphere หรือ jboss ติดตั้งคุณสามารถรับไฟล์ jar ที่เหลือส่วนใหญ่ได้จากโฟลเดอร์ lib ของ appserver หากไม่สามารถดาวน์โหลดไฟล์ทีละไฟล์ -

  • ไฟล์ Hibernate jar - Hibernate.org

  • Struts hibernate plugin - ปลั๊กอินStruts hibernate

  • ไฟล์ JTA - ไฟล์ JTA

  • ไฟล์Dom4j - Dom4j

  • ไฟล์log4j - log4j

ไฟล์ที่เหลือคุณควรจะได้รับจากการแจกจ่าย Struts2 ของคุณ

ไฮเบอร์เนตคลาส

ตอนนี้ให้เราสร้างคลาส 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 ที่แสดงถึงไฟล์ studentตารางตามข้อกำหนดไฮเบอร์เนต มี id คุณสมบัติ firstName และ lastName ซึ่งสอดคล้องกับชื่อคอลัมน์ของตารางนักเรียน ต่อไปให้เราสร้าง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 เป็นชั้นการเข้าถึงข้อมูลสำหรับชั้นนักเรียน มีวิธีการในการแสดงรายชื่อนักเรียนทั้งหมดแล้วบันทึกข้อมูลนักเรียนใหม่

คลาสแอ็คชั่น

ไฟล์ต่อไปนี้ AddStudentAction.javaกำหนดคลาสการกระทำของเรา เรามีวิธีดำเนินการสองวิธีที่นี่ - execute () และ listStudents () เมธอด execute () ใช้เพื่อเพิ่มเรกคอร์ดนักเรียนใหม่ เราใช้วิธีบันทึกของ dao () เพื่อให้บรรลุสิ่งนี้

วิธีอื่น listStudents () ใช้เพื่อแสดงรายชื่อนักเรียน เราใช้วิธี dao's list เพื่อรับรายชื่อนักเรียนทั้งหมด

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 สิ่งนี้ใช้เมื่อคลาสการดำเนินการของคุณกำลังจัดการกับคลาสโมเดลที่เป็นรูปธรรม (เช่น Student) ซึ่งตรงข้ามกับคุณสมบัติแต่ละรายการ (เช่น firstName, lastName) อินเทอร์เฟซ 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" ใช้ใน firstName, lastName และเครื่องหมาย เนื่องจากแอ็คชัน addStudent เชื่อมโยงกับ ModelAware "AddSudentAction" โดยอัตโนมัติ student bean จะถูกสร้างขึ้นพร้อมกับค่าสำหรับ firstName, lastName และทำเครื่องหมายที่เติมอัตโนมัติ

ในส่วนด้านล่างเราจะดูรายชื่อนักเรียน (ดู 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.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" ของเราขยายแพ็คเกจเริ่มต้น struts2 ที่เรียกว่า "hibernate-default" จากนั้นเราจะประกาศสองการกระทำ - addStudent และ listStudents addStudent เรียก execute () บนคลาส AddStudentAction จากนั้นเมื่อสำเร็จจะเรียกเมธอดการดำเนินการ listStudents

วิธีการดำเนินการ listStudent เรียก listStudents () บนคลาส AddStudentAction และใช้ student.jsp เป็นมุมมอง

ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเร็กทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/student.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -

ในส่วนบนสุดเราจะได้รับแบบฟอร์มเพื่อป้อนค่าสำหรับระเบียนนักเรียนใหม่และส่วนด้านล่างจะแสดงรายชื่อนักเรียนในฐานข้อมูล เพิ่มระเบียนนักเรียนใหม่แล้วกดส่ง หน้าจอจะรีเฟรชและแสดงรายการที่อัปเดตทุกครั้งที่คุณคลิกส่ง