Integracja Struts 2 i Hibernate
Hibernate to wysokowydajna usługa Object / Relational trwałości i zapytań, która jest licencjonowana na podstawie licencji GNU Lesser General Public License (LGPL) i można ją pobrać bezpłatnie. W tym rozdziale. dowiemy się, jak osiągnąć integrację Struts 2 z Hibernate. Jeśli nie znasz Hibernacji, możesz zapoznać się z naszym samouczkiem Hibernacja .
Konfiguracja bazy danych
W tym samouczku będę używał bazy danych MySQL „struts2_tutorial”. Łączę się z tą bazą danych na moim komputerze przy użyciu nazwy użytkownika „root” i bez hasła. Przede wszystkim musisz uruchomić następujący skrypt. Ten skrypt tworzy nową tabelę o nazwiestudent i tworzy kilka rekordów w tej tabeli -
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);
Konfiguracja hibernacji
Następnie stwórzmy plik hibernate.cfg.xml, który jest plikiem konfiguracyjnym hibernacji.
<?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>
Przejdźmy przez plik konfiguracyjny hibernacji. Najpierw zadeklarowaliśmy, że używamy sterownika MySQL. Następnie zadeklarowaliśmy URL jdbc do połączenia z bazą danych. Następnie zadeklarowaliśmy nazwę użytkownika, hasło i rozmiar puli połączenia. Wskazaliśmy również, że chcielibyśmy zobaczyć SQL w pliku dziennika, ustawiając „show_sql” na true. Przejdź przez samouczek hibernacji, aby zrozumieć, co oznaczają te właściwości.
Na koniec ustawiamy klasę mapowania na com.tutorialspoint.hibernate.Student, którą utworzymy w tym rozdziale.
Konfiguracja środowiska
Następnie do tego projektu potrzebujesz całej masy słoików. W załączeniu zrzut ekranu przedstawiający pełną listę wymaganych plików JAR -
Większość plików JAR można pobrać jako część dystrybucji Struts. Jeśli masz zainstalowany serwer aplikacji, taki jak glassfish, websphere lub jboss, możesz pobrać większość pozostałych plików jar z folderu lib serwera appserver. Jeśli nie, możesz pobrać pliki pojedynczo -
Pliki jar Hibernate - Hibernate.org
Wtyczka hibernacji Struts - wtyczka hibernacji Struts
Pliki JTA - pliki JTA
Pliki Dom4j - Dom4j
pliki log4j - log4j
Resztę plików powinieneś móc pobrać z dystrybucji Struts2.
Klasy hibernacji
Utwórzmy teraz wymagane klasy Java do integracji w trybie hibernacji. Poniżej znajduje się treść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;
}
}
To jest klasa POJO, która reprezentuje studenttabela zgodnie ze specyfikacją Hibernate. Ma właściwości id, firstName i lastName, które odpowiadają nazwom kolumn tabeli uczniów. Następnie stwórzmyStudentDAO.java plik w następujący sposób -
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);
}
}
Klasa StudentDAO jest warstwą dostępu do danych dla klasy Student. Ma metody na wyświetlenie wszystkich uczniów, a następnie zapisanie nowego rekordu ucznia.
Klasa akcji
Poniższy plik AddStudentAction.javadefiniuje naszą klasę działania. Mamy tutaj dwie metody akcji - execute () i listStudents (). Metoda execute () służy do dodawania nowego rekordu ucznia. W tym celu używamy metody save () dao.
Druga metoda, listStudents (), służy do tworzenia listy studentów. Używamy metody listy dao, aby uzyskać listę wszystkich uczniów.
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;
}
}
Zauważysz, że wdrażamy interfejs ModelDriven. Jest to używane, gdy klasa akcji ma do czynienia z konkretną klasą modelu (taką jak Student), a nie z indywidualnymi właściwościami (takimi jak firstName, lastName). Interfejs ModelAware wymaga zaimplementowania metody zwracania modelu. W naszym przypadku zwracamy obiekt „student”.
Utwórz pliki widoku
Utwórzmy teraz plik student.jsp wyświetl plik z następującą zawartością -
<%@ 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>
Plik student.jsp jest dość prosty. W górnej sekcji mamy formularz, który przesyła się do „addStudent.action”. Przyjmuje firstName, lastName i marks. Ponieważ akcja addStudent jest powiązana z ModelAware „AddSudentAction”, automatycznie zostanie utworzony komponent bean ucznia z wartościami firstName, lastName i automatycznie wypełnionymi znacznikami.
W dolnej części przeglądamy listę uczniów (zobacz AddStudentAction.java). Iterujemy po liście i wyświetlamy wartości imienia, nazwiska i znaków w tabeli.
Konfiguracja rozpórki
Połączmy to wszystko za pomocą 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>
Należy tu zauważyć, że nasz pakiet „myhibernate” rozszerza domyślny pakiet struts2 o nazwie „hibernate-default”. Następnie deklarujemy dwie akcje - addStudent i listStudents. addStudent wywołuje metodę execute () na klasie AddStudentAction, a następnie po sukcesie wywołuje metodę akcji listStudents.
Metoda akcji listStudent wywołuje metodę listStudents () w klasie AddStudentAction i używa pliku student.jsp jako widoku.
Teraz kliknij prawym przyciskiem myszy nazwę projektu i kliknij Export > WAR Fileaby utworzyć plik wojny. Następnie wdróż tę WAR w katalogu webapps serwera Tomcat. Na koniec uruchom serwer Tomcat i spróbuj uzyskać dostęp do adresu URLhttp://localhost:8080/HelloWorldStruts2/student.jsp. Spowoduje to wyświetlenie następującego ekranu -
W górnej sekcji otrzymujemy formularz do wpisania wartości dla nowego rekordu ucznia, a dolna sekcja zawiera listę uczniów w bazie danych. Śmiało, dodaj nowy rekord ucznia i naciśnij Prześlij. Ekran odświeży się i wyświetli zaktualizowaną listę za każdym razem, gdy klikniesz Prześlij.