日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Struts+Spring+Hibernate的技術(shù)實(shí)現(xiàn)

 芳草小集 2006-03-24
 

Struts+Spring+Hibernate的技術(shù)實(shí)現(xiàn)

 

一、三個(gè)框架簡(jiǎn)介

 

Struts

Struts是目前Java Web MVC框架中不爭(zhēng)的王者經(jīng)過(guò)長(zhǎng)達(dá)五年的發(fā)展,Struts已經(jīng)逐漸成長(zhǎng)為一個(gè)穩(wěn)定、成熟的框架,並且占有了MVC框架中最大的市場(chǎng)份額。

 

Spring

Spring是一個(gè)開(kāi)源框架,它是為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而開(kāi)發(fā)的。Spring使使用基本的JavaBeans來(lái)完成以前只可能由EJB完成的事情變得可能了。Spring的用途不僅限於服務(wù)器端的開(kāi)發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring中應(yīng)用對(duì)象被聲明式地組合在一個(gè)XML文件裡Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等),讓開(kāi)發(fā)者更專(zhuān)注於應(yīng)用邏輯。所有的這些特征使開(kāi)發(fā)者能夠編寫(xiě)更干淨(jìng)、更易管理、並且更易於測(cè)試的代碼。

 

Hibernate

Hibernate是高性能的開(kāi)源框架。提供O/R映射功能,通過(guò)XML配置文件能夠?qū)?duì)象映射到數(shù)據(jù)庫(kù)。對(duì)數(shù)據(jù)操作進(jìn)行了封裝,能夠方便簡(jiǎn)潔地解決大多數(shù)的數(shù)據(jù)持久化操作。

 

二、實(shí)現(xiàn)架構(gòu)圖

   

架構(gòu)介紹

FilterWeb過(guò)瀘器,繼承javax.servlet.Filter,用於處理只要客戶(hù)請(qǐng)求就必須初始化或處理的實(shí)例。例如可以在這裡進(jìn)行請(qǐng)求的編碼轉(zhuǎn)換,為了更好地支持中文,更好的方法就是把客戶(hù)端的請(qǐng)入信息轉(zhuǎn)換成UTF-8格式,並存於數(shù)據(jù)庫(kù)中,這種轉(zhuǎn)換就可以在過(guò)瀘器中進(jìn)行處理。

 

ActionServlet:是Struts提供的總控制器,在這裡接收來(lái)自客戶(hù)端的所有請(qǐng)求,並根據(jù)請(qǐng)求參數(shù)和Struts配置文件struts-config.xml決定請(qǐng)求由那個(gè)具體的Action來(lái)處理。

 

ActionStruts提供的Action類(lèi),繼承Strutsorg.apache.struts.action.Action類(lèi)。客戶(hù)的不同請(qǐng)求,可以由不同的Action來(lái)處理(ActionServlet總控制器選擇)。Action用於處理客戶(hù)請(qǐng)求的具體操作,比如調(diào)調(diào)用Service層的方法進(jìn)行數(shù)據(jù)保存或讀取。Action還根據(jù)struts-config.xml配置選擇頁(yè)面的轉(zhuǎn)發(fā)。對(duì)客戶(hù)輸入的信息進(jìn)行驗(yàn)證。

 

ActionForm:Struts提供的Form類(lèi),繼承Strutsorg.apache.struts.action.ActionForm類(lèi)。用於封裝來(lái)自客戶(hù)表單的信息,並可以對(duì)信息進(jìn)行初級(jí)有效性驗(yàn)證。

 

Jsptiles-defs.xmltiles-defs.xmlStrtus提供,用於頁(yè)面的定義,可以定義JSP模板,不同頁(yè)面都可以斷承該模板。Jsp用於表示界面,可以在Jsp中書(shū)寫(xiě)Struts標(biāo)簽由不牽涉任何Java代碼。

 

Service接口:定義Service的接口,給上層調(diào)用。這裡編寫(xiě)上層所需方法的定義。

 

Service接口實(shí)現(xiàn):這裡實(shí)現(xiàn)Service接口方法的具本實(shí)現(xiàn),並實(shí)現(xiàn)商務(wù)邏輯。該類(lèi)為了支持Spring的依賴(lài)注入功能,需要實(shí)現(xiàn)一個(gè)setXxxDAO()的方法,這樣類(lèi)就可以利用注入來(lái)的DAO進(jìn)行數(shù)處理。在這一層利用Spring的事務(wù)管理,對(duì)這層的方法進(jìn)行事務(wù)聲明管理。

 

DAO接口:這裡定義DAO數(shù)據(jù)訪(fǎng)問(wèn)層的接口,給業(yè)務(wù)層Service調(diào)用。

 

DAO接口實(shí)現(xiàn):這裡具體實(shí)現(xiàn)DAO接口的所有方法,只進(jìn)行數(shù)據(jù)的保存、讀取、更新等動(dòng)作,不牽涉事務(wù)。該類(lèi)繼承Springorg.springframework.orm.hibernate3.support.HibernateDaoSupport類(lèi),可以不再理會(huì)HibernateAPI,即可進(jìn)行Hibernate方式的數(shù)據(jù)操作??梢宰尨a更簡(jiǎn)潔,有條理。

 

Spring這是系統(tǒng)的中心部分,這裡在一個(gè)XML配置文件中定義了大部分的系統(tǒng)Bean,並對(duì)它們進(jìn)行集中管理。定義了DAO層、Service層的所有類(lèi)。定義了事務(wù),並且定義了方法的事務(wù)策略。

 

三、各層的具體實(shí)現(xiàn)

1、底層的數(shù)據(jù)訪(fǎng)問(wèn)DAO層實(shí)現(xiàn)

▍■Hibernate的表與對(duì)象映射文件,文件名類(lèi)似xxxx.hbm.xml(xxxx為表名),它由Hibernate工具根據(jù)數(shù)據(jù)庫(kù)的表結(jié)構(gòu)生成而來(lái),一般的結(jié)構(gòu)如下:

 

1 <?xml version="1.0"?>

2 <!DOCTYPE hibernate-mapping PUBLIC

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

4   "http://hibernate./hibernate-mapping-3.0.dtd" >

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

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

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

8 unsaved-value="null">

9          <generator class="native"/>

10      </id>

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

12 </class>   

13 </hibernate-mapping>

 

5行表示持久化類(lèi)所處的包,第6行表示持久化類(lèi)名和代表數(shù)據(jù)庫(kù)的那個(gè)表,第7行表示數(shù)據(jù)表的主鍵及一些屬性(如長(zhǎng)度、字段名、類(lèi)型等),第11行表示表的一個(gè)字段

 

▍■Spring中可以對(duì)Hibernate的表配置文件進(jìn)行加載,而不用Hibernate獨(dú)立的配置文件,這樣就把Hibernate包含在Spring的管理中。把表配置文件加載到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>

以上代碼表示把Hibernate的四個(gè)表配置文件加載到Spring管理中,它們是org/shingwai/website/bean/ProductJPGImage.hbm.xml

org/shingwai/website/bean/Category.hbm.xml

org/shingwai/website/bean/IncInfo.hbm.xml

org/shingwai/website/bean/SwcProduct.hbm.xml

分別代表數(shù)據(jù)表ProductJPGImage、Category、IncInfo、SwcProduct

<property name="hibernateProperties">標(biāo)簽設(shè)定Hibernate的一些屬性參數(shù)

 

▍■DAO接口定義

只是一個(gè)接口類(lèi),裡面定義了一些方法,樣子如下:

public interface IIncInfoDAO {  

        public IncInfo findAll();

}

 

▍■DAO接口實(shí)現(xiàn)類(lèi)

它繼承org.springframework.orm.hibernate3.support.HibernateDaoSupport類(lèi)並實(shí)現(xiàn)了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類(lèi)提供了一個(gè)操作HibernateTemplate,可以實(shí)現(xiàn)Hibernate的大多數(shù)操作而不用理會(huì)什麼時(shí)候Open Session或是什麼時(shí)候Close Session。所有這些都由Spring進(jìn)行處理。只要調(diào)用它的getHibernateTemplate()方法,其它的就交給Spring吧。如上例的查詢(xún)只有一行代碼List list = this.getHibernateTemplate().find(LOAD_ALL);

 

2、業(yè)務(wù)層Service的實(shí)現(xiàn)

▍■Spring配置文件中定義DAO,因?yàn)?/span>Service層需要注入DAO來(lái)進(jìn)行數(shù)據(jù)操作。DAOSpringBean定義如下所示:

<bean id ="incInfoDAO" class="org.shingwai.website.dao.impl.IncInfoHibernateDAO">

     <property name="sessionFactory">

         <ref local="mySessionFactory"/>

     </property>

    </bean>

它注入了由Spring實(shí)現(xiàn)的Hibernate sessionFactory,提供給它的HibernateDaoSupport類(lèi)使用。(mySessionFactory 的定義見(jiàn)上文Spring加載Hibernate表配置文件)。我們?cè)?/span>Service層實(shí)現(xiàn)裡說(shuō)明DAOSpring中的定義是因?yàn)槲覀兊?/span>Service層要使用到它。

 

▍■Service接口

一個(gè)普通的接口類(lèi),樣子如下:

public interface IIncInfoService {       

        public IncInfo findAll();

}

 

▍■Service接口實(shí)現(xiàn),它要實(shí)現(xiàn)一個(gè)setXxxDAO()方法,用於Spring的依賴(lài)注入。代碼樣子如下:

public class IncInfoServiceImpl implements IIncInfoService {       

        private IIncInfoDAO incInfoDAO;

        public void setIncInfoDAO(IIncInfoDAO incInfoDAO){

                this.incInfoDAO=incInfoDAO;           

        }

        public IncInfo findAll() {

                // TODO 這裡可以加入業(yè)務(wù)邏輯

                return incInfoDAO.findAll();

        }

}

 

▍■Spring中定義Service,那麼客戶(hù)端就可以通過(guò)Spring來(lái)調(diào)用Service的方法。

<bean id="incInfoService" class="org.shingwai.website.service.impl.IncInfoServiceImpl">

     <property name="incInfoDAO">

        <ref local="incInfoDAO"/>

     </property>

</bean>

該定義中注入了incInfoDAO。

 

至此已經(jīng)完成了DAO層和Service層的方法和SpringBean定義。

 

 

3、表示層的實(shí)現(xiàn)

表示層使用Struts框架,利用JbuilderEclipse都可以很方便的創(chuàng)建ActionFormAction。表示的其它技術(shù)將不在這裡介紹,這裡只說(shuō)明在Action中如何調(diào)用Servie層的方法。

 

▍■Action中通過(guò)Spring調(diào)用Service的方法,代碼樣例如下:

AbstractApplicationContext appContext=new ClassPathXmlApplicationContext("/applicationContext.xml")

IIncInfoService incInfoService=(IIncInfoService) appContext.getBean("incInfoService");

List list=incInfoService.findAll();

 

applicationContext.xmlSpring的配置文件名,通過(guò)實(shí)例appContext可以得到incInfoService實(shí)例。

 

4、附錄Spring的聲明式事務(wù)定義,樣式如下:

<!-- 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>

   

    <!-- 事務(wù)定義示例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>

 

第一段定義由那個(gè)類(lèi)來(lái)進(jìn)行事務(wù)管理;第二段定義一個(gè)事務(wù)代理模板,並定義事務(wù)策略;第三段定義一個(gè)需要進(jìn)行事務(wù)管理的Bean,它繼承了事務(wù)代理模板,把自己本身的實(shí)現(xiàn)類(lèi)交給代理類(lèi)來(lái)實(shí)現(xiàn)。

 

 

待續(xù)內(nèi)容:<<利用Struts+Spring+Hibernate實(shí)現(xiàn)一個(gè)電子公告板示例>>

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多