Struts+Spring+Hibernateのテクノロジー実装


一、三つのフレームワークの概要
 
Struts:
Strutsは現在のJava Web MVCの枠組みの中で争わない王者である.5年間にわたる発展を経て、Strutsは安定した成熟した枠組みに成長し、MVCの枠組みの中で最大の市場シェアを占めている.
 
Spring:
Springは、企業のアプリケーション開発の複雑さを解決するために開発されたオープンソースフレームワークです.Springは基本的なJavaBeansを使って以前はEJBでしかできなかったことを完成させることが可能になった.Springの用途はサーバ側の開発に限らない.単純性、テスト性、および緩和結合の観点から、どのJavaアプリケーションもSpringから利益を得ることができます.Springに適用されるオブジェクトは、XMLファイルに宣言的に結合されます.Springは、多くの基礎機能(トランザクション管理、持続的なフレームワーク統合など)を提供し、開発者がアプリケーションロジックに集中できるようにしています.これらのすべての特徴により、開発者は、よりきれいで、管理しやすく、テストしやすいコードを作成することができます.
 
Hibernate:
Hibernateは高性能のオープンソースフレームワークです.XMLプロファイルでデータベースにオブジェクトをマッピングできるO/Rマッピング機能を提供します.データ操作をカプセル化し,多くのデータ持続化操作を容易かつ簡潔に解決できる.
 
二、実現アーキテクチャ図
   
スキーマの紹介
Filter:Webフィルタはjavax.servlet.Filterを継承し、お客様の要求があれば初期化または処理しなければならないインスタンスを処理します.例えば、ここで要求された符号化変換を行うことができ、中国語をよりよくサポートするために、クライアントの入力情報をUTF-8フォーマットに変換し、データベースに併存することがより良い方法であり、この変換はフィルタで処理することができる.
 
ActionServicelet:Strutsが提供する総コントローラで、ここでクライアントからのすべての要求を受信し、要求パラメータとStrutsプロファイルstruts-config.xmlに基づいてその具体的なActionによって要求を処理することを決定します.
 
Action:Strutsによって提供されるActionクラスで、Strutsのorg.apache.struts.action.Actionクラスを継承します.お客様の異なる要求は、異なるアクションによって処理できます(ActionServicelet総コントローラによって選択されます).Actionは、サービス層を呼び出す方法など、顧客要求の具体的な操作を処理するために使用され、データの保存または読み取りを行う.Actionはstruts-config.xml構成に従って選択ページの転送も行う.お客様が入力した情報を検証します.
 
ActionForm::Strutsが提供するFormクラスで、Strutsのorg.apache.struts.action.ActionFormクラスを継承します.顧客フォームからの情報をカプセル化し、情報の初級的な有効性検証を行うことができます.
 
Jspとtiles-defs.xml:tiles-defs.xmlはStrtusによって提供され、ページの定義に使用され、JSPテンプレートを定義することができ、異なるページでこのテンプレートを切断することができます.Jspはインタフェースを表すために使用され、JavaコードにかかわらずJspにStrutsラベルを書くことができます.
 
Serviceインタフェース:サービスのインタフェースを定義し、上位レベルに呼び出します.ここでは,上位層に必要なメソッドの定義を記述する.
 
サービスインタフェース実装:ここではサービスインタフェースメソッドの具本実装を実現し、ビジネスロジックを実現する.このクラスはSpringの依存注入機能をサポートするためにsetXxxDAO()を実現する方法が必要であり,これによりクラスは注入されたDAOを用いて数処理を行うことができる.このレベルでSpringのトランザクション管理を利用して、このレベルのメソッドをトランザクション宣言管理します.
 
DAOインタフェース:ここではDAOデータアクセス層のインタフェースを定義し、ビジネス層サービスに呼び出します.
 
DAOインタフェース実装:ここでは、DAOインタフェースのすべての方法を具体的に実装し、データの保存、読み取り、更新などの動作のみを行い、トランザクションに関与しない.このクラスはSpringのorg.springframework.orm.hibernate 3.support.HibernateDaoSupportクラスを継承し、HibernateのAPIを無視してHibernate方式のデータ操作を行うことができる.コードをより簡潔にし、筋道を立てることができます.
 
Spring:これはシステムの中心部分です.ここでは、XMLプロファイルでシステムBeanの大部分を定義し、集中的に管理します.DAOレイヤ、サービスレイヤのすべてのクラスを定義します.トランザクションを定義し、メソッドのトランザクションポリシーを定義します.
 
三、各層の具体的な実現
1、下位層のデータアクセスDAO層実現
      Hibernateのテーブルとオブジェクトマッピングファイルです.ファイル名はxxxx.hbm.xml(xxxxはテーブル名)に似ています.Hibernateツールによってデータベースのテーブル構造に基づいて生成されます.一般的な構造は次のとおりです.
 
 
 
 
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD//EN"

 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="org.shingwai.website.bean">

<class name="IncInfo" table="IncInfo">

<id column="incName" length="250" name="IncName" type="string"

unsaved-value="null">

 <generator class="native"/>

</id>

 <property name="IncDesp" column="incDesp"type="string" not-null="false"/>

</class>    

</hibernate-mapping>


  
5行目は永続化クラスが置かれているパッケージ、6行目は永続化クラス名とデータベースを表すテーブル、7行目はデータテーブルのプライマリ・キーと長さ、フィールド名、タイプなどの属性、11行目はテーブルのフィールドを表します
 
      Springでは、Hibernateの独立したプロファイルではなくHibernateのテーブルプロファイルをロードすることで、Springの管理にHibernateを含めることができます.表プロファイルをSpringにロードする様子は、次のコードがSpringプロファイルクリップです.
<bean id="mySessionFactory"

        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <property name="dataSource">

            <ref local="dataSource" />

        </property>

        <property name="mappingResources">

            <list>

                <value>org/shingwai/website/bean/ProductJPGImage.hbm.xml</value>

                <value>org/shingwai/website/bean/Category.hbm.xml</value>

                <value>org/shingwai/website/bean/IncInfo.hbm.xml</value>

                <value>org/shingwai/website/bean/SwcProduct.hbm.xml</value>

            </list>

        </property>

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

                <prop key="hibernate.show_sql">true</prop>

                <prop key="hibernate.jdbc.fetch_size">25</prop>

                <prop key="hibernate.jdbc.batch_size">50</prop>

            </props>

        </property>

    </bean>


 
 
 
 
以上のコードは、org/shingwai/website/bean/ProductJPGImage.hbm.xmlであるHibernateの4つのテーブルプロファイルをSpring管理にロードすることを示しています.
org/shingwai/website/bean/Category.hbm.xml
org/shingwai/website/bean/IncInfo.hbm.xml
org/shingwai/website/bean/SwcProduct.hbm.xml
データテーブルProductJPGImage、Category、IncInfo、SwcProductをそれぞれ表します
ラベルHibernateのプロパティパラメータの一部を設定
 
      DAOインタフェース定義
インタフェースクラスにすぎません.いくつかの方法が定義されています.次のようになります.
public interface IIncInfoDAO {  
        public IncInfo findAll();
}
 
      DAOインタフェース実装クラス
org.springframework.orm.hibernate 3.support.HibernateDaoSupportクラスを継承し、DAOインタフェースを実現しました.
 
public class IncInfoHibernateDAO extends HibernateDaoSupport implements IIncInfoDAO {

        private static final String LOAD_ALL ="from IncInfo inc ";

        public IncInfo findAll() {

                List list = this.getHibernateTemplate().find(LOAD_ALL);

                if (list.size()==0)        {

                        return null;

                }else {

                        return (IncInfo)list.get(0);

                }

        }

}

 
 
HibernateDaoSupportクラスは、Hibernateを操作するTemplateを提供し、Hibernateのほとんどの操作をいつOpen Sessionを開くか、いつClose Sessionを開くかを気にすることなく実現することができます.これらはすべてSpringによって処理されます.getHibernateTemplate()メソッドを呼び出すだけで、他はSpringに渡しましょう.上記の例のクエリは、コードリストリストリストリスト=this.getHibernateTemplate().find(LOAD_ALL);
 
2、業務層サービスの実現
        SpringプロファイルでDAOを定義します.なぜなら、サービス層はデータ操作のためにDAOを注入する必要があるからです.SpringでのDAOのBean定義は次のとおりです.
 
<bean id ="incInfoDAO" class="org.shingwai.website.dao.impl.IncInfoHibernateDAO">

     <property name="sessionFactory">

         <ref local="mySessionFactory"/>

     </property>

    </bean>


 
 
Springによって実装されたHibernate sessionFactoryを注入し、HibernateDaoSupportクラスに提供します.(mySessionFactory の定義は、前述のSpringロードHibernateテーブルプロファイルを参照してください).SpringでのDAOの定義は、サービス層がそれを使用するためであることをサービス層実装で説明します.
 
      サービスインタフェース
一般的なインタフェースクラスです.次のようになります.
 
public interface IIncInfoService {        

        public IncInfo findAll();

}


 
       Springの依存注入に使用するsetXxDAO()メソッドを実装するServiceインタフェース実装.コードの形式は次のとおりです.
public class IncInfoServiceImpl implements IIncInfoService {        

        private IIncInfoDAO incInfoDAO;

        public void setIncInfoDAO(IIncInfoDAO incInfoDAO){

                this.incInfoDAO=incInfoDAO;            

        }

        public IncInfo findAll() {

                // TODO           

                return incInfoDAO.findAll();

        }

}


  
 
       SpringでServiceを定義すると、クライアントはSpringでServiceのメソッドを呼び出すことができます.
 
<bean id="incInfoService" class="org.shingwai.website.service.impl.IncInfoServiceImpl">

     <property name="incInfoDAO">

        <ref local="incInfoDAO"/>

     </property>

</bean>


 
 
この定義にはincInfoDAOが注入されている.
 
これでDAO層とサービス層の方法とSpringのBean定義が完了しました.
 
 
3、表示層の実現
表示レイヤはStrutsフレームワークを使用し、JbuilderやEclipseでActionForm,Actionを簡単に作成できます.表示される他の技術は、ここでは説明しないが、ここでは、Actionでサービス層を呼び出す方法についてのみ説明する.
 
      ActionでSpringでServiceを呼び出す方法です.コードの例は次のとおりです.
AbstractApplicationContext appContext=new ClassPathXmlApplicationContext("/applicationContext.xml")
IIncInfoService incInfoService=(IIncInfoService) appContext.getBean("incInfoService");
List list=incInfoService.findAll();
 
アプリケーションContext.xmlはSpringのプロファイル名であり、インスタンスappContextによってincInfoServiceインスタンスを得ることができます.
 
4、付録Springの宣言式事務定義.スタイルは以下の通りである.
 
<!-- transactionManager -->

    <bean id="transactionManager"

        class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory">

            <ref local="mySessionFactory" />

        </property>

    </bean>

    

    <!-- baseTxProxy -->

    <bean id="baseTxProxy"     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    lazy-init="true" abstract="true">

        <property name="transactionManager">

            <ref bean="transactionManager" />

        </property>

        <property name="transactionAttributes">

            <props>

                <prop key="*">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    

    <!--       bean  -->

        <bean id="bookService" parent="baseTxProxy">

        <property name="target">

            <bean class="com.spring.test.tran.BookService">

                <property name="bookdao">

                    <ref local="bookDAO" />

                </property>

            </bean>

        </property>

    </bean>


 
 
第1段の定義はそのクラスによってトランザクション管理を行う.第2セグメントは、トランザクションエージェントテンプレートを定義し、トランザクションポリシーを定義します.第3セグメントでは、トランザクション管理が必要なBeanを定義します.トランザクションエージェントテンプレートを継承し、自分の実装クラスをエージェントクラスに渡して実装します.