Struts 模型組件

模型代表應(yīng)用的業(yè)務(wù)數(shù)據(jù)和邏輯。Struts框架并沒有為設(shè)計(jì)和創(chuàng)建模型組件提供現(xiàn)成的框架。不過,Struts允許使用其他模型框架來處理應(yīng)用的業(yè)務(wù)領(lǐng)域,如EJB(Enterprise JavaBean)JDO(Java Data Object),以及常規(guī)的JavaBeanORM(Object-Relation Mapping)。

 

1 模型在MVC中的地位

模型是應(yīng)用中最重要的一部分,它包含了業(yè)務(wù)實(shí)體和業(yè)務(wù)規(guī)則,負(fù)責(zé)訪問和更新持久化數(shù)據(jù)。應(yīng)該把所有的模型組件放在系統(tǒng)中的同一個(gè)位置,這有利于維護(hù)數(shù)據(jù)的完整性,減少數(shù)據(jù)冗余,提高可重用性。

模型應(yīng)該和視圖以及控制器之間保持獨(dú)立。在分層的的框架結(jié)構(gòu)中,位于上層的視圖和控制器依賴于下層模型的實(shí)現(xiàn),而上層模型不應(yīng)該依賴于上層的視圖和控制器的實(shí)現(xiàn)。Struts應(yīng)用的各個(gè)層次之間的依賴關(guān)系:

 

從上到下,依賴關(guān)系加強(qiáng);從下到上,依賴關(guān)系減弱。

視圖層

控制層

模型層

持久化層

網(wǎng)絡(luò)層

 

如果在模型組件中通過Javaimport語句引入了視圖和控制器組件,這就違反了以上原則。下層組件訪問上層組件會(huì)使應(yīng)用的維護(hù)、重用和擴(kuò)展變得困難。

 

 

2 模型的概念和類型。

在科學(xué)和工程技術(shù)領(lǐng)域,模型是一個(gè)很有用途的概念,它可以用來模擬一個(gè)真實(shí)的系統(tǒng)。建立模型最主要的目的是幫助理解、描述或模擬真實(shí)世界中目標(biāo)系統(tǒng)的運(yùn)轉(zhuǎn)機(jī)制。

在軟件開發(fā)領(lǐng)域,模型用來表示真實(shí)世界的實(shí)體。在軟件開發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)建不同類型的模型。在分析階段,需要?jiǎng)?chuàng)建概念模型。在設(shè)計(jì)階段,需要?jiǎng)?chuàng)建設(shè)計(jì)模型??梢圆捎妹嫦?qū)ο蠼UZ言UML來描述模型。

 

2.1 概念模型

    在建立模型之前,首先要對(duì)問題域進(jìn)行詳細(xì)的分析,確定用例,接下來就可以根據(jù)用例來創(chuàng)建概念模型。概念模型用來模擬問題域中的真實(shí)實(shí)體。概念模型描述了每個(gè)實(shí)體的概念和屬性,以及實(shí)體之間的關(guān)系。但在這個(gè)階段并不描述實(shí)體的行為。

    創(chuàng)建概念模型的目的是幫助更好地理解問題域,識(shí)別系統(tǒng)中的實(shí)體,這些實(shí)體在設(shè)計(jì)階段很有可能變成類。

    概念模型清楚地顯示了問題域中的實(shí)體。不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,他們可以很容易地提出概念模型中存在的問題,幫助系統(tǒng)分析人員及早對(duì)模型進(jìn)行修改。在軟件設(shè)計(jì)與開發(fā)周期中,模型的變更需求提出得越晚,所耗費(fèi)的開發(fā)成本就越大。

 

2.2 設(shè)計(jì)模型

    概念模型是在軟件分析階段創(chuàng)建的,它幫助開發(fā)人員對(duì)應(yīng)的需求獲得清晰精確的理解。在軟件設(shè)計(jì)階段,需要在概念模型的基礎(chǔ)上創(chuàng)建設(shè)計(jì)模型??梢杂?/span>UML類框圖,活動(dòng)圖以及狀態(tài)圖來描述設(shè)計(jì)模型。

    根據(jù)UML語言,類直接存在四種關(guān)系。

    1 關(guān)聯(lián)(Association)

        關(guān)聯(lián)指的是類之間的引用關(guān)系。

    2 依賴(Dependency)

        依賴指的是類之間的訪問關(guān)系。

    3 累積(Aggregation)

        累積指的是整體與個(gè)體之間的關(guān)系,可以把累積看作一種強(qiáng)關(guān)聯(lián)關(guān)系。

    4 一般化(Generalization)

        一般化指的是類之間的繼承元素。

 

 

3 業(yè)務(wù)對(duì)象(BO)

業(yè)務(wù)對(duì)象,即Business Object(BO),是對(duì)真實(shí)世界的實(shí)體的軟件抽象。它可以代表業(yè)務(wù)領(lǐng)域中的人、地點(diǎn)、事物或概念。

   業(yè)務(wù)對(duì)象包括狀態(tài)和行為。

判斷一個(gè)類是否可以成為業(yè)務(wù)對(duì)象的一個(gè)重要標(biāo)準(zhǔn),是看這個(gè)類是否同時(shí)擁有狀態(tài)和行為。

 

3.1 業(yè)務(wù)對(duì)象的特征和類型

    如果一個(gè)類可以作為業(yè)務(wù)對(duì)象,它應(yīng)具有以下特征:

    · 包含狀態(tài)和行為

    · 代表業(yè)務(wù)領(lǐng)域的人、地點(diǎn)、事物或概念

    · 可以重用

    業(yè)務(wù)對(duì)象可分為三種類型:

    · 實(shí)體業(yè)務(wù)對(duì)象

    · 過程業(yè)務(wù)對(duì)象

    · 事件業(yè)務(wù)對(duì)象

     實(shí)體業(yè)務(wù)對(duì)象要算是最為人們所熟悉的。實(shí)體對(duì)象可以代表人、地點(diǎn)、事物或概念。通常,可以把業(yè)務(wù)領(lǐng)域中的名詞,例如客戶、訂單、商品等作為實(shí)體業(yè)務(wù)對(duì)象。在J2EE應(yīng)用中,這些名詞可以作為實(shí)體Bean。對(duì)于更普通的Web應(yīng)用,這些名詞可以作為包含狀態(tài)和行為的JavaBean

     過程業(yè)務(wù)對(duì)象代表應(yīng)用種的業(yè)務(wù)過程或流程,它們通常依賴于實(shí)體業(yè)務(wù)對(duì)象??梢园褬I(yè)務(wù)領(lǐng)域中的動(dòng)詞。例如客戶發(fā)出訂單、登入應(yīng)用等作為過程業(yè)務(wù)對(duì)象。在J2EE應(yīng)用中,它們通常作為會(huì)話Bean或者消息驅(qū)動(dòng)Bean。在非J2EE應(yīng)用中,他們可作為常規(guī)的JavaBean,具有管理和控制應(yīng)用的行為。過程業(yè)務(wù)對(duì)象也可以擁有狀態(tài),例如在J2EE應(yīng)用中,會(huì)話Bean可分為有狀態(tài)和無狀態(tài)兩種。

     事件業(yè)務(wù)對(duì)象代表應(yīng)用中的一些時(shí)間(如異常、警告或超時(shí))。這些時(shí)間通常由系統(tǒng)中的某種行為處罰。例如,在Java Swing應(yīng)用中,當(dāng)客戶按下一個(gè)按鈕,就會(huì)有一個(gè)事件業(yè)務(wù)對(duì)象產(chǎn)生,以便通知框架調(diào)用相關(guān)的時(shí)間處理器來處理事件。

 

3.2 業(yè)務(wù)對(duì)象的重要性

    在 應(yīng)用中使用業(yè)務(wù)對(duì)象有許多好處,最重要的一點(diǎn)就是業(yè)務(wù)對(duì)象提供了通用的術(shù)語和概念,不管是技術(shù)人員還是非技術(shù)人員都可以共享并理解他們。它們可以直觀地代 表真實(shí)世界中的概念,開發(fā)小組的所有成員都能理解他們。如果正對(duì)同一個(gè)業(yè)務(wù)領(lǐng)域需要開發(fā)出多個(gè)應(yīng)用,那么這些應(yīng)用可以共享這些業(yè)務(wù)對(duì)象。業(yè)務(wù)對(duì)象的可重用 特性可以提高應(yīng)用開發(fā)速度。減少冗余。

    此外,業(yè)務(wù)對(duì)象可以隱藏實(shí)現(xiàn)細(xì)節(jié),對(duì)外只保露接口。例如,如果業(yè)務(wù)對(duì)象的某個(gè)方法需要傳入java.util.ArrayList類型的參數(shù),那么應(yīng)該把參數(shù)定義為java.util.List接口類型。這樣,假定這個(gè)方法的實(shí)現(xiàn)發(fā)生改變,用LinkedList取代ArrayList來實(shí)現(xiàn)原有的功能,這種概念不會(huì)對(duì)方法調(diào)用者造成任何英雄。

    在充分了解到業(yè)務(wù)對(duì)象在應(yīng)用中的重要性后,接下來需要關(guān)心的問題是,這些業(yè)務(wù)對(duì)象的狀態(tài)從何而來,當(dāng)應(yīng)用中指運(yùn)行時(shí),這些狀態(tài)被存放到什么地方。這就涉及到了對(duì)象的持久化問題。

 

 

4 業(yè)務(wù)對(duì)象的持久化

通常,持久化意味著通過手工或其他方式輸入到應(yīng)用中的數(shù)據(jù),能夠在應(yīng)用結(jié)束運(yùn)行后依然存在。即使應(yīng)用運(yùn)行結(jié)束或者計(jì)算機(jī)關(guān)閉后,這些信息依然存在。不管是大、中或、小型的應(yīng)用,都需要數(shù)據(jù)的持久化。

 

4.1 對(duì)業(yè)務(wù)對(duì)象進(jìn)行持久化的作用。

當(dāng)應(yīng)用中的業(yè)務(wù)對(duì)象在內(nèi)存中創(chuàng)建后,它們不可能永遠(yuǎn)存在。最后,他們要么從內(nèi)存中清楚,要么被持久化到數(shù)據(jù)存儲(chǔ)庫中。內(nèi)存無法永久保存數(shù)據(jù),因此必需對(duì)業(yè)務(wù)對(duì)象進(jìn)行持久化。否則,如果對(duì)象沒有被持久化,用戶在應(yīng)用運(yùn)行時(shí)發(fā)出的訂單信息將在應(yīng)用結(jié)束運(yùn)行后隨之小時(shí)。

關(guān)系型數(shù)據(jù)庫被廣泛用來存儲(chǔ)數(shù)據(jù)。關(guān)系型數(shù)據(jù)庫中存放的是關(guān)系型數(shù)據(jù),它是非面向?qū)ο蟮?。把業(yè)務(wù)對(duì)象映射到非面向?qū)ο蟮臄?shù)據(jù)庫中,存在著阻抗不匹配(impedance mismatch),因此對(duì)象由狀態(tài)和行為組成,而關(guān)系型數(shù)據(jù)庫則由表組成,對(duì)象之間的各種關(guān)系和關(guān)系型數(shù)據(jù)庫中表之間的關(guān)系并不一一對(duì)象。例如對(duì)象之間的繼承關(guān)系就不能直接映射到關(guān)系型數(shù)據(jù)庫中。

4.2 數(shù)據(jù)訪問對(duì)象(DAO)設(shè)計(jì)模式

面向?qū)ο蟮拈_發(fā)方法是當(dāng)今的主流,但是同時(shí)不得不使用關(guān)系型數(shù)據(jù)庫,在企業(yè)級(jí)應(yīng)用開發(fā)的環(huán)境中,對(duì)象-關(guān)系的映射(Object-Relation Mapping,簡稱ORM)是一種耗時(shí)的工作。圍繞對(duì)象-關(guān)系的映射和持久化數(shù)據(jù)的訪問,在軟件領(lǐng)域中發(fā)展起來了一種數(shù)據(jù)訪問對(duì)象(Data Access Object,簡稱DAO)設(shè)計(jì)模式。

DAO模式提供了訪問關(guān)系型數(shù)據(jù)庫系統(tǒng)所需的所有操作的接口,其中包括創(chuàng)建數(shù)據(jù)庫、定義表、字段和索引,建立表間的關(guān)系,更新和查詢數(shù)據(jù)庫等。DAO模式將底層數(shù)據(jù)訪問操作與高層業(yè)務(wù)邏輯分離開,對(duì)上層提供面向?qū)ο蟮臄?shù)據(jù)訪問接口。在DAO的實(shí)現(xiàn)中,可以采用XML語言來配置對(duì)象和關(guān)系型數(shù)據(jù)之間的映射。

對(duì)于Java應(yīng)用,可以直接通過JDBC編程來訪問數(shù)據(jù)庫。JDBC可以說是訪問持久數(shù)據(jù)層最原始、最直接的方法。在企業(yè)級(jí)應(yīng)用開發(fā)中,可以通過JDBC編程,來開發(fā)自己的DAO API,把數(shù)據(jù)庫訪問操作封裝起來,供業(yè)務(wù)曾同一調(diào)用。

如果數(shù)據(jù)模型非常復(fù)雜,那么直接通過JDBC編程來實(shí)現(xiàn)持久化框架需要有專業(yè)的知識(shí)。對(duì)于企業(yè)應(yīng)用的開發(fā)人員,花費(fèi)大量時(shí)間從頭開發(fā)自己的持久性框架不是很可行。通常,可以直接采用第三方提供的持久化框架,如ORM軟件產(chǎn)品。許多ORM框架都采用DAO設(shè)計(jì)模式來實(shí)現(xiàn),為模型層提供了訪問關(guān)系型數(shù)據(jù)庫的API。

4.3 常用的ORM軟件

有許多ORM軟件可供選擇。有些是商業(yè)化的,有些是免費(fèi)的。

TopLink

http://otn.oracle.com/products/ias/toplink/content.html

Torque

http://jakarta.apache.org/turbine/torque/index.html

ObjectRelationalBridge

http://db.apache.org/ojb

FronierSuite

http://www.objectfrontier.com

Castor

http://castor.exolab.org

FreeFORM

http://www.chimu.com/projects/form/

Expresso

http://www.jcorporate.com

JRelationalFramework

http://jrf.sourceforge.net

VBSF

http://www.objectmatter.com

Jgrinder

http://sourceforget.net/projects/jgrinder/

Hibernate

http://www.hibernate.org

 

       不管是使用商業(yè)化產(chǎn)品,還是非商業(yè)化產(chǎn)品,都應(yīng)該確保選用的ORM框架沒有“滲透”到應(yīng)用中,應(yīng)用的上層組件應(yīng)該和ORM框架保持獨(dú)立。有些ORM框架要求在業(yè)務(wù)對(duì)象中印入它們的類和接口,這會(huì)帶來一個(gè)問題,如果日后想改用其他的ORM框架,就必需修改業(yè)務(wù)對(duì)象。

 

5 小結(jié)

這篇文檔介紹了模型的實(shí)現(xiàn)方法。Struts框架并沒有在模型層提供線程可用的組件。模型的實(shí)現(xiàn)應(yīng)該和Struts應(yīng)用的控制層以及視圖層保持獨(dú)立。

模型采用業(yè)務(wù)對(duì)象來描述狀態(tài)和行為,為了使業(yè)務(wù)對(duì)象持久化,需要把業(yè)務(wù)對(duì)象映射到關(guān)系型數(shù)據(jù)庫。

模型向客戶程序提供了業(yè)務(wù)代理接口,業(yè)務(wù)代理接口直接訪問持久化框架,處理實(shí)際的業(yè)務(wù)邏輯。Struts應(yīng)用的Action類可以使用這個(gè)業(yè)務(wù)代理接口,而不必直接和持久化框架交互。這種做法有助于削弱上層Web應(yīng)用和持久化框架之間的關(guān)系,提高持久化框架的相對(duì)獨(dú)立性。

 

 

閱讀材料:《精通Struts:基于MVCJava Web設(shè)計(jì)與開發(fā)》




                                      
2005年05月12日 1:20 AM