-1

私は最近休止状態にあり、struts2 + Hibernate + Springを統合するアプリケーションを開発しようとしていました..休止状態セッションファクトリを初期化するには2つの方法があります.1つは、その時点でstruts2のフィルターディスパッチャをロードするときですたとえば、以下に示すように、休止状態のセッション ファクトリをロードする必要があります。

Web.xml...

<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
  <filter>
    <filter-name>controller</filter-name>
    <filter-class>mypack.Struts2Dispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>controller</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping></web-app>

Struts2Dispatcher ファイル..

import javax.servlet.*;
import org.apache.struts2.dispatcher.FilterDispatcher;
import org.hibernate.HibernateException;

public class Struts2Dispatcher extends FilterDispatcher
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        super.init(filterConfig);
        try
        {
            HibernateUtil.createSessionFactory();
            System.out.print("-------application initializing successfully-----");
        }
        catch (HibernateException e)
        {
            throw new ServletException(e);
        }
    }
}

そしてユーティリティを休止状態にします..

package mypack;

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

public class HibernateUtil
{
    private static SessionFactory sessionFactory;
    public static void createSessionFactory()
    {
        sessionFactory = new Configuration().configure().buildSessionFactory();
    }
    public static Session getSession()
    {
        return sessionFactory.openSession();
    }
}

設定ファイル..

<?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">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="connection.username">system</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.password">manager</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
         <property name="show_sql">true</property>
         <mapping resource="Employee.hbm.xml"/> 
    </session-factory>

</hibernate-configuration>

マッピングファイル..

<!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping>
          <class name="mypack.Employee">
          <id name="eid" column="emp_id" type="int">
          <generator class="increment"/></id>
          <property name="name" column="emp_name"/>
          <property name="job"/>
          <property name="salary" type="int"/>
          </class>
          </hibernate-mapping>

アプリケーションの context.xml ファイル

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="MyIOCObject" class="mypack.LoginAction"/>

</beans>

struts.xml ファイル..

<struts>    
<package name="pack" extends="struts-default">
<action name="login" class="MyIOCObject" method="insert">
<result name="success">/welcome.jsp</result>
<result name="failure">/relogin.jsp</result>
</action>
</package>
</struts>    

ログイン アクション Java クラス

package mypack;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class LoginAction 
{
     private String name,job;
     private int salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String insert()
    {
      try
      {
        Session ses=HibernateUtil.getSession();
        Employee emp=new Employee(name,job,salary);
        Transaction tx=ses.beginTransaction();
        ses.save(emp);
        tx.commit();
        ses.close();
        return "success";
      }catch(Exception e)
      {
          System.out.println(e);
          return "failure";
      }
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

}

主な従業員ポジョ

package mypack;

public class Employee
{
      private int eid,salary;
      private String name,job;

    public Employee() 
    {
        super();
    }

    public Employee(String name, String job,int salary)
    {
        super();
        this.salary = salary;
        this.name = name;
        this.job = job;
    }

    public int getEid() {
        return eid;
    }
    public void setEid(int eid) {
        this.eid = eid;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }

}

主なテストプログラム..

package mypack;

import java.util.Scanner;

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

public class TestProgram
{

    public static void main(String[] args)
    {
          try
          {
              Configuration cfg=new Configuration();
              cfg.configure();
              SessionFactory sesfac=cfg.buildSessionFactory();
              Session ses=sesfac.openSession();
              System.out.println("Session created , fetching objects...");
              Scanner in=new Scanner(System.in);
              System.out.println("Enter Employee id :- ");
              int id=in.nextInt();
              Employee e=(Employee)ses.load(Employee.class,id);
              System.out.println("Following Object is fetched");
              System.out.println(e.getEid()+"\t"+e.getName()+"\t"+e.getSalary()+"\t"+e.getJob());
              ses.close();

          }catch (Exception e)
          {
              System.out.println(e);   
          }
    }

}

そして、私が議論していた他のアプローチは、統合するための別のアプローチのリンクにあります。どのアプローチが最適かを教えてください。これら2つよりも優れたアプローチはありますか..?

概念を理解できるように、更新されたコードを投稿してください。アドバイスしてください..!!

4

1 に答える 1

1

これが私にとってうまくいくものです(Struts2、JPA / Hibernate、およびGuiceを使用):

  • EntityManagerFactoryorSessionFactoryServletContextListener;で作成および破棄します。これを行うために Struts2 フィルターをサブクラス化しないでください (また、StrutsPrepareAndExecuteFilter古い非推奨の代わりに新しいものを使用することを検討してくださいFilterDispatcher)
  • 各リクエストが独自の作業単位を持つように、インターセプターでEntityManagers またはs を作成および破棄します。Sessionこれらの作業単位はスレッド セーフではなく、リクエスト間で共有すべきではないため、これはベスト プラクティスです。
  • インターセプターをスタックの早い段階に配置して、データベースへのアクセスを必要とする他のインターセプターがその後に来るようにします。これはOpen Session in Viewパターンを採用しており、ビューがレンダリングされているとき (アクションが処理された後) に、遅延ロードされたプロパティがフェッチ可能であることを確認します。

最後に、Struts2、Hibernate、および Spring について、それらをすべて積み上げようとする前に、まずもう少しよく理解することをお勧めします。

于 2012-07-31T18:29:11.033 に答える