當前訪問本站: hits

          yjhmily

          堅持走自己的路……

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            100 Posts :: 8 Stories :: 353 Comments :: 0 Trackbacks


          框架(Framework)是可重用的,半完成的應用程序,可以用來產(chǎn)生專門的定制程序。?



          您 只要細心地研究真實的應用程序,就會發(fā)現(xiàn)程序大致上由兩類性質(zhì)不同的組件組成,一類與程序要處理的具體事務密切相關(guān),我們不妨把它們叫做業(yè)務組件;另一類 是應用服務。比如說:一個稅務征管系統(tǒng)和一個圖書管理系統(tǒng)會在處理它們的業(yè)務方面存在很大的差異,這些直接處理業(yè)務的組件由于業(yè)務性質(zhì)的不同不大可能在不 同的系統(tǒng)中重用,而另一些組件如決定程序流向的控制、輸入的校驗、錯誤處理及標簽庫等這些只與程序相關(guān)的組件在不同的系統(tǒng)中可以很好地得到重用。人們自然 會想要是把這些在不同應用程序中有共性的一些東西抽取出來,做成一個半成品程序,這樣的半成品就是所謂的程序框架,再做一個新的東西時就不必白手起家,而 是可以在這個基礎(chǔ)上開始搭建。實際上,有些大型軟件企業(yè)選擇自己搭建這樣的框架。但大多數(shù)中小型軟件企業(yè)或者其他組織,沒有條件自己建立框架。?



          Struts作為一個開放原代碼的應用框架,在最近幾年得到了飛速的發(fā)展,在JSP?Web應用開發(fā)中應用得非常廣泛,有的文獻上說它已經(jīng)成為JSP?Web應用框架的事實上的標準。那么,究竟什么是Struts呢??



          要 回答這個問題還得從JSP?Web應用的兩種基本的結(jié)構(gòu)模式:Model?1和Model?2說起,為了給讀者一些實實在在的幫助,并力圖讓學習曲線變得 平坦一些,我想采用實例驅(qū)動的方法來逐步深入地回答有關(guān)問題,因為,學一門技術(shù)的最好方法莫過于在實踐中學習、在實踐中體會,逐步加深對其精神實質(zhì)的理解 和把握,而不是一上來就引入一大堆新概念讓大家覺得無所適從,或者死記硬背一大堆概念而面對一個真正的實際需求束手無策。正如,一個人即使在書本上學成了 游泳博士,只要他不下水,我想他也是不大可能真正會游泳的。?



          Model?1結(jié)構(gòu)如圖1所示:?





          圖1?



          mode1?1 是一個以JSP文件為中心的模式,在這種模式中JSP頁面不僅負責表現(xiàn)邏輯,也負責控制邏輯。專業(yè)書籍上稱之為邏輯耦合在頁面中,這種處理方式,對一些規(guī) 模很小的項目如:一個簡單的留言簿,也沒什么太大的壞處,實際上,人們開始接觸一些對自己來說是新的東西的時候,比如,用JSP訪問數(shù)據(jù)庫時,往往喜歡別 人能提供一個包含這一切的單個JSP頁面,因為這樣在一個頁面上他就可以把握全局,便于理解。但是,用Model?1模式開發(fā)大型時,程序流向由一些互相 能夠感知的頁面決定,當頁面很多時要清楚地把握其流向?qū)⑹呛軓碗s的事情,當您修改一頁時可能會影響相關(guān)的很多頁面,大有牽一發(fā)而動全身的感覺,使得程序的 修改與維護變得異常困難;還有一個問題就是程序邏輯開發(fā)與頁面設(shè)計糾纏在一起,既不便于分工合作也不利于代碼的重用,這樣的程序其健壯性和可伸縮性都不 好。?



          Grady?Booch等人在UML用戶指南一書中,強調(diào)建模的重要性時,打了一個制作狗窩、私人住宅、和大廈的形象比喻來說明人們處理不同規(guī)模的事物時應該采用的合理方法一樣,人們對不同規(guī)模的應用程序也應該采用不同的模式。?



          為了克服Model?1的缺陷,人們引入了Model?2,如圖2所示:





          圖2?



          它 引入了\"控制器\"這個概念,控制器一般由servlet來擔任,客戶端的請求不再直接送給一個處理業(yè)務邏輯的JSP頁面,而是送給這個控制器,再由控 制器根據(jù)具體的請求調(diào)用不同的事務邏輯,并將處理結(jié)果返回到合適的頁面。因此,這個servlet控制器為應用程序提供了一個進行前-后端處理的中樞。一 方面為輸入數(shù)據(jù)的驗證、身份認證、日志及實現(xiàn)國際化編程提供了一個合適的切入點;另一方面也提供了將業(yè)務邏輯從JSP文件剝離的可能。業(yè)務邏輯從JSP頁 面分離后,JSP文件蛻變成一個單純完成顯示任務的東西,這就是常說的View。而獨立出來的事務邏輯變成人們常說的Model,再加上控制器 Control本身,就構(gòu)成了MVC模式。實踐證明,MVC模式為大型程序的開發(fā)及維護提供了巨大的便利。?



          其實, MVC開始并不是為Web應用程序提出的模式,傳統(tǒng)的MVC要求M將其狀態(tài)變化通報給V,但由于Web瀏覽器工作在典型的拉模式而非推模式,很難做到這一 點。因此有些人又將用于Web應用的MVC稱之為MVC2。正如上面所提到的MVC是一種模式,當然可以有各種不同的具體實現(xiàn),包括您自己就可以實現(xiàn)一個 體現(xiàn)MVC思想的程序框架,Struts就是一種具體實現(xiàn)MVC2的程序框架。它的大致結(jié)構(gòu)如圖三所示



          圖三?



          圖 三基本勾勒出了一個基于Struts的應用程序的結(jié)構(gòu),從左到右,分別是其表示層(view)、控制層(controller)、和模型層 (Model)。其表示層使用Struts標簽庫構(gòu)建。來自客戶的所有需要通過框架的請求統(tǒng)一由叫ActionServlet的servlet接收 (ActionServlet?Struts已經(jīng)為我們寫好了,只要您應用沒有什么特別的要求,它基本上都能滿足您的要求),根據(jù)接收的請求參數(shù)和 Struts配置(struts-config.xml)中ActionMapping,將請求送給合適的Action去處理,解決由誰做的問題,它們共 同構(gòu)成Struts的控制器。Action則是Struts應用中真正干活的組件,開發(fā)人員一般都要在這里耗費大量的時間,它解決的是做什么的問題,它通 過調(diào)用需要的業(yè)務組件(模型)來完成應用的業(yè)務,業(yè)務組件解決的是如何做的問題,并將執(zhí)行的結(jié)果返回一個代表所需的描繪響應的JSP(或Action)的 ActionForward對象給ActionServlet以將響應呈現(xiàn)給客戶。?



          過程如圖四所示:?



          這 里要特別說明一下的是:就是Action這個類,上面已經(jīng)說到了它是Struts中真正干活的地方,也是值得我們高度關(guān)注的地方。可是,關(guān)于它到底是屬于 控制層還是屬于模型層,存在兩種不同的意見,一種認為它屬于模型層,如:《JSP?Web編程指南》;另一些則認為它屬于控制層如: 《Programming?Jakarta?Struts》、《Mastering?Jakarta?Struts》和 《Struts?Kick?Start》等認為它是控制器的一部分,還有其他一些書如《Struts?in?Action》也建議要避免將業(yè)務邏輯放在 Action類中,也就是說,圖3中Action后的括號中的內(nèi)容應該從中移出,但實際中確有一些系統(tǒng)將比較簡單的且不打算重用的業(yè)務邏輯放在 Action中,所以在圖中還是這樣表示。顯然,將業(yè)務對象從Action分離出來后有利于它的重用,同時也增強了應用程序的健壯性和設(shè)計的靈活性。因 此,它實際上可以看作是Controller與Model的適配器,如果硬要把它歸于那一部分,筆者更傾向于后一種看法,即它是Controller的一 部分,換句話說,它不應該包含過多的業(yè)務邏輯,而應該只是簡單地收集業(yè)務方法所需要的數(shù)據(jù)并傳遞給業(yè)務對象。實際上,它的主要職責是:



          校驗前提條件或者聲明



          調(diào)用需要的業(yè)務邏輯方法



          檢測或處理其他錯誤



          路由控制到相關(guān)視圖?



          上 面這樣簡單的描述,初學者可能會感到有些難以接受,下面舉個比較具體的例子來進一步幫助我們理解。如:假設(shè),我們做的是個電子商務程序,現(xiàn)在程序要完成的 操作任務是提交定單并返回定單號給客戶,這就是關(guān)于做什么的問題,應該由Action類完成,但具體怎么獲得數(shù)據(jù)庫連接,插入定單數(shù)據(jù)到數(shù)據(jù)庫表中,又怎 么從數(shù)據(jù)庫表中取得這個定單號(一般是自增數(shù)據(jù)列的數(shù)據(jù)),這一系列復雜的問題,這都是解決怎么做的問題,則應該由一個(假設(shè)名為orderBo)業(yè)務對 象即Model來完成。orderBo可能用一個返回整型值的名為submitOrder的方法來做這件事,Action則是先校驗定單數(shù)據(jù)是否正確,以 免常說的垃圾進垃圾出;如果正確則簡單地調(diào)用orderBo的submitOrder方法來得到定單號;它還要處理在調(diào)用過程中可能出現(xiàn)任何錯誤;最后根 據(jù)不同的情況返回不同的結(jié)果給客戶。?



          二、為什么要使用Struts框架?



          既然本文的 開始就說了,自己可以建這種框架,為什么要使用Struts呢?我想下面列舉的這些理由是顯而易見的:首先,它是建立在MVC這種公認的好的模式上的, Struts在M、V和C上都有涉及,但它主要是提供一個好的控制器和一套定制的標簽庫上,也就是說它的著力點在C和V上,因此,它天生就有MVC所帶來 的一系列優(yōu)點,如:結(jié)構(gòu)層次分明,高可重用性,增加了程序的健壯性和可伸縮性,便于開發(fā)與設(shè)計分工,提供集中統(tǒng)一的權(quán)限控制、校驗、國際化、日志等等;其 次,它是個開源項目得到了包括它的發(fā)明者Craig?R.McClanahan在內(nèi)的一些程序大師和高手持續(xù)而細心的呵護,并且經(jīng)受了實戰(zhàn)的檢驗,使其功 能越來越強大,體系也日臻完善;最后,是它對其他技術(shù)和框架顯示出很好的融合性。如,現(xiàn)在,它已經(jīng)與tiles融為一體,可以展望,它很快就會與JSF等 融會在一起。當然,和其他任何技術(shù)一樣,它也不是十全十美的,如:它對類和一些屬性、參數(shù)的命名顯得有些隨意,給使用帶來一些不便;還有如Action類 execute方法的只能接收一個ActionForm參數(shù)等。但瑕不掩瑜,這些沒有影響它被廣泛使用。?



          三、Struts的安裝與基本配置?



          我們主要針對Struts1.1版本進行講解,這里假定讀者已經(jīng)配置好java運行環(huán)境和相應的Web容器,本文例子所使用的是j2sdk和Tomcat4.1.27。下面,將采用類似于step?by?step的方式介紹其基礎(chǔ)部分。?



          安裝Struts

          到http://jakarta.apache.org/?下載Struts的安裝文件,本文例子使用的是1.1版。?



          接下來您要進行如下幾個步驟來完成安裝:

          1、解壓下載的安裝文件到您的本地硬盤

          2、生成一個新的Web應用,假設(shè)我們生成的應用程序的根目錄在/Webapps/mystruts目錄。在server.xml文件中為該應用新建一個別名如/mystruts

          3、從第1步解壓的文件中拷貝下列jar文件到/Webapps/mystruts/WEB-INF/lib目錄,主要文件有如下一些.

          quote:

          struts.jar

          commons-beanutils.jar

          commons-collections.jar

          commons-dbcp.jar

          commons-digester.jar

          commons-logging.jar

          commons-pool.jar

          commons-services.jar

          commons-validator.jar





          4、創(chuàng)建一個web.xml文件,這是一個基于servlet的Web應用程序都需要的部署描述文件,一個Struts?Web應用,在本質(zhì)上也是一個基于servlet的Web應用,它也不能例外。?



          Struts有兩個組件要在該文件中進行配置,它們是:ActionServlet和標簽庫。下面是一個配置清單:

          quote:



          <?xml?version=\"1.0\"?encoding=\"UTF-8\"?>

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

          ??<servlet>

          ????<servlet-name>action</servlet-name>

          ????<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

          ????<init-param>

          ??????<param-name>config</param-name>

          ??????<param-value>/WEB-INF/struts-config.xml</param-value>

          ????</init-param>

          ????<init-param>

          ??????<param-name>debug</param-name>

          ??????<param-value>2</param-value>

          ????</init-param>

          ????<load-on-startup>2</load-on-startup>

          ??</servlet>

          ??<servlet-mapping>

          ????<servlet-name>action</servlet-name>

          ????<url-pattern>*.do</url-pattern>

          ??</servlet-mapping>

          ??<taglib>

          ????<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

          ????<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

          ??</taglib>

          ??<taglib>

          ????<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>

          ????<taglib-location>/WEB-INF/struts-html.tld</taglib-location>

          ??</taglib>

          ??<taglib>

          ????<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>

          ????<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

          ??</taglib>

          </web-app>





          上面我們在web.xml中完成了對servlet和標簽庫的基本配置,而更多的框架組件要在struts-config.xml中進行配置:?



          5、 創(chuàng)建一個基本的struts-config.xml文件,并把它放在/Webapps/mystruts/WEB-INF/目錄中,該文件是基于 Struts應用程序的配置描述文件,它將MVC結(jié)構(gòu)中的各組件結(jié)合在一起,開發(fā)的過程中會不斷對它進行充實和更改。在Struts1.0時,一個應用只 能有一個這樣的文件,給分工開發(fā)帶來了一些不便,在Struts1.1時,可以有多個這樣的文件,將上述缺點克服了。需在該文件中配置的組件有:data -sources?

          quote:



          global-execptions

          form-beans

          global-forwards

          action-mappings

          controller

          message-resources

          plug-in





          配置清單如下:?

          quote:



          <?xml?version=\"1.0\"?encoding=\"UTF-8\"?>

          <!DOCTYPE?struts-config?PUBLIC?\"-//Apache?Software?Foundation//DTD?Struts?Configuration?1.1

          //EN\"?\"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd\">

          <struts-config>

          ??<message-resources?parameter=\"ApplicationResources\"?/>

          </struts-config>

          ?







          到 此為止,我們已經(jīng)具備了完成一個最簡單Struts應用的所需的各種組件。前面已經(jīng)提到,在開發(fā)過程中我們會不斷充實和修改上面兩個配置描述文件。下面我 們將實際做一個非常簡單的應用程序來體驗一下Struts應用開發(fā)的真實過程,以期對其有一個真實的認識。在完成基礎(chǔ)部分的介紹后,筆者會給出一些在實際 開發(fā)中經(jīng)常用到而又讓初學者感到有些難度的實例。最后,會介紹Struts與其他框架的關(guān)系及結(jié)合它們生成應用程序的例子。?


          原文鏈接:http://www.javaeye.com/topic/41033
          本文作者:羅會波?當陽市國稅局信息中心?lhbf@sina.com與他聯(lián)系 <script type='text' src='../../../js/ad_atl.js' /></script>
          posted on 2006-12-27 16:05 kangxm 閱讀(1060) 評論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)載篇
          主站蜘蛛池模板: 延安市| 四子王旗| 天台县| 和顺县| 大同县| 沁阳市| 合水县| 泰宁县| 出国| 玛多县| 永胜县| 镶黄旗| 通江县| 永宁县| 德安县| 日喀则市| 彭泽县| 星子县| 永新县| 江陵县| 电白县| 仁怀市| 武安市| 搜索| 侯马市| 右玉县| 容城县| 香港 | 顺昌县| 原平市| 涞源县| 柳林县| 景泰县| 华坪县| 长寿区| 嘉荫县| 沿河| 浦江县| 奇台县| 观塘区| 南安市|