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.