Struts 2のHibernate統合の例

それをダウンロードする - Struts2-Hibernate-Integration-Example.zip

Struts2には、Hibernateフレームワークを統合するための公式のプラグインはありません。ただし、次の手順で対処できます。

  1. カスタム ServletContextListener を登録してください.

  2. ServletContextListener クラスで、** Hibernateを初期化します

サーブレットのコンテキスト** に格納します。

  1. アクションクラスでは、 Hibernateセッションをサーブレットコンテキスト から取得し、

通常どおりHibernateタスクを実行します。

関係を参照してください:

Struts 2 <-- (Servlet Context) ---> Hibernate <-----> Database

このチュートリアルでは、 Struts 2 で開発された単純な顧客モジュール(追加機能とリスト機能)を示し、 Hibernate でデータベース操作を実行します。統合部分は上記のメカニズムを使用しています(サーブレットコンテキストでHibernateセッションを格納して取得します)。

この回避策は、古典的なリンク://struts/struts-hibernate-integration-example/[Struts 1.xとHibernate integration]と非常によく似ていますが、古典的なStruts 1.xはStrutsのプラグインを使用しています。一方、Struts 2は汎用サーブレット・リスナーを使用しています。

1.プロジェクトの構造

この完全なプロジェクトフォルダ構造を参照してください。

Struts 2 Hibernateインテグレーションの例、title = "Struts2-Hibernate-Integration-Example"、width = 268、height = 479

2. MySQLテーブルスクリプト

デモ用の顧客テーブルを作成します。ここにSQLテーブルスクリプトがあります。

DROP TABLE IF EXISTS `mkyong`.`customer`;
CREATE TABLE  `mkyong`.`customer` (
  `CUSTOMER__ID` bigint(20) unsigned NOT NULL AUTO__INCREMENT,
  `NAME` varchar(45) NOT NULL,
  `ADDRESS` varchar(255) NOT NULL,
  `CREATED__DATE` datetime NOT NULL,
  PRIMARY KEY (`CUSTOMER__ID`)
) ENGINE=InnoDB AUTO__INCREMENT=17 DEFAULT CHARSET=utf8;

3.依存関係

Struts2、Hibernate、およびMySQLの依存関係ライブラリを入手してください。

…​.//…​ <!-- Struts 2 -→ <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.1.8</version> </dependency>

<!-- MySQL database driver -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>
<!-- Hibernate core -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate</artifactId>
    <version>3.2.7.ga</version>
</dependency>
<!-- Hibernate core library dependency start -->
<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency>
<!-- Hibernate core library dependency end -->
<!-- Hibernate query library dependency start -->
<dependency>
    <groupId>antlr</groupId>
    <artifactId>antlr</artifactId>
    <version>2.7.7</version>
</dependency>
<!-- Hibernate query library dependency end -->//...
===  4.休止状態のスタッフ

Hibernateのモデルと構成のもの。

**  Customer.java **   - 顧客テーブル用のクラスを作成します。

package com.mkyong.customer.model;

import java.util.Date;

public class Customer implements java.io.Serializable {

private Long customerId;
private String name;
private String address;
private Date createdDate;
   //getter and setter methods
}
**  Customer.hbm.xml **   - 顧客用のHibernateマッピングファイル。

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mkyong.customer.model.Customer" table="customer" catalog="mkyong">

        <id name="customerId" type="java.lang.Long">
            <column name="CUSTOMER__ID"/>
            <generator class="identity"/>
        </id>
        <property name="name" type="string">
            <column name="NAME" length="45" not-null="true"/>
        </property>
        <property name="address" type="string">
            <column name="ADDRESS" not-null="true"/>
        </property>
        <property name="createdDate" type="timestamp">
            <column name="CREATED__DATE" length="19" not-null="true"/>
        </property>
    </class>
</hibernate-mapping>
**  hibernate.cfg.xml **   -  Hibernateデータベース設定ファイル。

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.bytecode.use reflection optimizer">false</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show sql">true</property> <property name="format sql">true</property> <property name="use sql comments">false</property> <mapping resource="com/mkyong/customer/hibernate/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>

===  5. Hibernate ServletContextListener

**  ServletContextListener ** を作成し、**  Hibernateセッションを初期化してサーブレットコンテキスト** に格納します。

**  HibernateListener .java **

package com.mkyong.listener;

import java.net.URL;

import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;

import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;

public class HibernateListener implements ServletContextListener{

private Configuration config;
private SessionFactory factory;
private String path = "/hibernate.cfg.xml";
private static Class clazz = HibernateListener.class;
public static final String KEY__NAME = clazz.getName();
public void contextDestroyed(ServletContextEvent event) {
 //    }
public void contextInitialized(ServletContextEvent event) {
try {
       URL url = HibernateListener.class.getResource(path);
       config = new Configuration().configure(url);
       factory = config.buildSessionFactory();
           //save the Hibernate session factory into serlvet context
            event.getServletContext().setAttribute(KEY__NAME, factory);
      } catch (Exception e) {
             System.out.println(e.getMessage());
       }
    }
}
web.xmlファイルにリスナーを登録します。 **  web.xml **

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app 2 3.dtd" >

<web-app> <display-name>Struts 2 Web Application</display-name>

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/** </url-pattern>
</filter-mapping>
<listener>
  <listener-class>
    com.mkyong.listener.HibernateListener
  </listener-class>
</listener>

</web-app>

===  6.アクション

Actionクラスでは、** サーブレットコンテキスト** からHibernateセッションを取得し、通常どおりにHibernateタスクを実行します。

**  CustomerAction.java **

package com.mkyong.customer.action;

import java.util.ArrayList; import java.util.Date; import java.util.List;

import org.apache.struts2.ServletActionContext; import org.hibernate.Session; import org.hibernate.SessionFactory;

import com.mkyong.customer.model.Customer; import com.mkyong.listener.HibernateListener; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;

public class CustomerAction extends ActionSupport implements ModelDriven{

Customer customer = new Customer();
List<Customer> customerList = new ArrayList<Customer>();
public String execute() throws Exception {
    return SUCCESS;
}
public Object getModel() {
    return customer;
}
public List<Customer> getCustomerList() {
    return customerList;
}
public void setCustomerList(List<Customer> customerList) {
    this.customerList = customerList;
}
//save customer
 public String addCustomer() throws Exception{
//get hibernate session from the servlet context
 SessionFactory sessionFactory =
      (SessionFactory) ServletActionContext.getServletContext()
              .getAttribute(HibernateListener.KEY__NAME);
Session session = sessionFactory.openSession();
//save it
 customer.setCreatedDate(new Date());
session.beginTransaction();
session.save(customer);
session.getTransaction().commit();
//reload the customer list
 customerList = null;
 customerList = session.createQuery("from Customer").list();
return SUCCESS;
}
//list all customers
 public String listCustomer() throws Exception{
//get hibernate session from the servlet context
 SessionFactory sessionFactory =
      (SessionFactory) ServletActionContext.getServletContext()
              .getAttribute(HibernateListener.KEY__NAME);
Session session = sessionFactory.openSession();
customerList = session.createQuery("from Customer").list();
return SUCCESS;
    }
}
===  7. JSPページ

JSPページを使用して、顧客を追加して一覧表示します。

**  customer.jsp **

<%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> </head>

<body> <h1>Struts 2 + Hibernate integration example</h1>

<h2>Add Customer</h2> <s:form action="addCustomerAction" > <s:textfield name="name" label="Name" value=""/> <s:textarea name="address" label="Address" value="" cols="50" rows="5"/> <s:submit/> </s:form>

<h2>All Customers</h2>

<s:if test="customerList.size() > 0"> <table border="1px" cellpadding="8px"> <tr> <th>Customer Id</th> <th>Name</th> <th>Address</th> <th>Created Date</th> </tr> <s:iterator value="customerList" status="userStatus"> <tr> <td><s:property value="customerId"/></td> <td><s:property value="name"/></td> <td><s:property value="address"/></td> <td><s:date name="createdDate" format="dd/MM/yyyy"/></td> </tr> </s:iterator> </table> </s:if> <br/> <br/>

</body> </html>

===  8. 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="default" namespace="/" extends="struts-default">
<action name="addCustomerAction"
class="com.mkyong.customer.action.CustomerAction" method="addCustomer" >
   <result name="success">pages/customer.jsp</result>
</action>
<action name="listCustomerAction"
class="com.mkyong.customer.action.CustomerAction" method="listCustomer" >
    <result name="success">pages/customer.jsp</result>
</action>
  </package>
</struts>
===  9.デモ

顧客モジュールにアクセスする:

__http://localhost:8080/Struts2Example/listCustomerAction.action__

image://wp-content/uploads/2010/07/Struts2-Hibernate-AddCustomer.jpg[Struts 2 Hibernate Add Customer、title = "Struts2-Hibernate-AddCustomer"、width = 640、height = 400]

名前と住所の欄に記入し、送信ボタンを押すと、挿入された顧客の詳細がすぐに一覧表示されます。

image://wp-content/uploads/2010/07/Struts2-Hibernate-ListCustomer.jpg[Struts2 Hibernate List Customer、title = "Struts2-Hibernate-ListCustomer"、width = 638、height = 480]

=== リファレンス

.  link://struts2/struts-2-hibernate-integration-with-full-hibernate-plugin/[Struts

2完全なHibernate PluginとのHibernate統合
。 http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html[ServletContextListener

ドキュメンテーション]。リンク://struts/struts-hibernate-integration-example/[Struts Hibernate

統合例]

link://tag/hibernate/[hibernate]link://タグ/integration/[integration]link://tag/struts2/[struts2]