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