讓我們開(kāi)始看看struts的核心,這也是MVC框架的核心。Struts用the Service to Worker模式[Core]實(shí)現(xiàn)了MVC模式.
控制器對(duì)象
控制器實(shí)現(xiàn)了ActionServlet類。它集中處理所有客戶端的請(qǐng)求。它清晰的劃分了控制層的作用,處理視圖和導(dǎo)航管理,保留模型處理和操作給請(qǐng)求處理器(Command objects[Gof])處理。發(fā)布文檔中定義了所有輸入請(qǐng)求映射到中央控制器的描述,如下:
所有URIs請(qǐng)求以do結(jié)尾的都映射到servlet中,如下:
匹配該模式的表單請(qǐng)求如下所示:
http://www.my_site_name.com/mycontext/actionName.do
映象前綴叫做擴(kuò)展映象,然而,你也可以定義路徑映象用/*結(jié)尾,如下
對(duì)應(yīng)請(qǐng)求:http://www.my_site_name.com/mycontext/do/action_Name
通過(guò)配置文件可以不用改變程序代碼就可以改變映射的方式;這個(gè)映射方案也涉及到Mulitplexed Resource Mapping。對(duì)于所有表現(xiàn)層請(qǐng)求,控制器提供了一個(gè)集中處理點(diǎn)。控制器委托請(qǐng)求處理器處理每一個(gè)請(qǐng)求。請(qǐng)求處理器分配請(qǐng)求到相關(guān)的form bean處理表單校驗(yàn),處理模型。控制器和請(qǐng)求處理器的聯(lián)合構(gòu)成了控制器處理機(jī)制的核心。由控制器提供的這種抽象減輕了開(kāi)發(fā)人員創(chuàng)建公共應(yīng)用程序服務(wù)比如管理視圖,sessions,表單數(shù)據(jù)的勞動(dòng)。開(kāi)發(fā)人員可以遵循標(biāo)準(zhǔn)的機(jī)制處理例如:錯(cuò)誤異常處理,導(dǎo)航,國(guó)際化,數(shù)據(jù)驗(yàn)證,數(shù)據(jù)轉(zhuǎn)換等。
在Struts1.1中,struts的配置通過(guò)控制器的init方法加載。配置文件控制框架的行為;包括使用ActionMapping配置對(duì)象映射URIs 到請(qǐng)求處理器,配置消息資源,通過(guò)插件處理外部資源等。實(shí)際上ActionServlet委托所有輸入請(qǐng)求給RequestProcessor,由它實(shí)際處理所有請(qǐng)求。
分配器對(duì)象
RequestProcessor把請(qǐng)求處理器和關(guān)聯(lián)的form bean聯(lián)合提供分派和處理客戶請(qǐng)求的功能。form bean的錯(cuò)誤創(chuàng)建,拋出異常和請(qǐng)求處理器都由RequestProcessor處理,并影響RequestProcessor的視圖管理函數(shù)。form beans協(xié)助RequestProcessor存儲(chǔ)表單數(shù)據(jù),或者傳遞視圖需要的模型數(shù)據(jù)。通過(guò)struts-config.xml的
ActionMapping的命令模式(譯注:本節(jié)翻譯從簡(jiǎn),因?yàn)樯婕暗骄唧w語(yǔ)法。)
struts通過(guò)xml語(yǔ)法指定URI和servlet的映射。這個(gè)實(shí)現(xiàn)和GOf的命令模式非常相似。
模型和RequestHandlers的交互
Action的子類用來(lái)適配請(qǐng)求和模型。一個(gè)Action的子類也叫request handler,根據(jù)具體請(qǐng)求創(chuàng)建。一個(gè)action由RequestProcessor最先解釋,并返回一個(gè)相關(guān)的request handler。對(duì)應(yīng)每個(gè)請(qǐng)求創(chuàng)建的action的父類由分配器對(duì)象創(chuàng)建。request handler實(shí)現(xiàn)了命令模式。一個(gè)客戶端請(qǐng)求在URI中封裝了想要的行為,路徑信息由分配器(RequestProcessor)提取并創(chuàng)建一個(gè)相關(guān)的請(qǐng)求處理對(duì)象實(shí)例。命令模式解耦請(qǐng)求處理和UI。
基本的Action類提供了公用的函數(shù)處理框架相關(guān)的資源和方法,保存子類execute方法執(zhí)行時(shí)檢測(cè)到的錯(cuò)誤。這些錯(cuò)誤通過(guò)使用在用ErrorsTag顯示錯(cuò)誤一節(jié)介紹的定制的org.apache.struts.taglib.html.ErrorsTag顯示在html表單中。request handler的execute方法應(yīng)該包含控制流程處理請(qǐng)求參數(shù)和相關(guān)聯(lián)的ActionForm,它應(yīng)該封裝模型交互語(yǔ)法,提供基于模型操作結(jié)果的下一個(gè)視圖。Request handlers由RequestProcessor在第一次創(chuàng)建時(shí)緩存,給其它請(qǐng)求使用;因此request handlers不能夠包含用戶特殊的狀態(tài)信息;而且當(dāng)需要串行處理時(shí),request handlers必須加上同步機(jī)制處理資源。
對(duì)于分布式應(yīng)用來(lái)說(shuō),一個(gè)action類包含和EJB組件中的業(yè)務(wù)邏輯交互的控制邏輯,類似于業(yè)務(wù)委托對(duì)象。業(yè)務(wù)委托使得request handlers不用直接處理復(fù)雜的分布式組件。因?yàn)樘幚矸?wù)端組件的邏輯被嵌入到業(yè)務(wù)委托中,所以業(yè)務(wù)委托設(shè)計(jì)模式使request handlers 和服務(wù)端組件松耦合。一個(gè)request handler由開(kāi)發(fā)人員在表示層編寫(xiě),然而一個(gè)業(yè)務(wù)委托通常由開(kāi)發(fā)人員在創(chuàng)建業(yè)務(wù)層服務(wù)時(shí)編寫(xiě)。對(duì)于小的非分布式應(yīng)用,action類可以包含業(yè)務(wù)邏輯。當(dāng)不需要分布式處理和業(yè)務(wù)邏輯嵌入到request handlers中時(shí),數(shù)據(jù)處理對(duì)象[Core]可以被用來(lái)提取數(shù)據(jù)處理的實(shí)現(xiàn);它提供了request handlers和數(shù)據(jù)處理層松耦合,因此保證表示層不用實(shí)現(xiàn)中間層的變化。action的基類提供了方便的方法,請(qǐng)參考http://jakarta.apache.org/struts/api/index.html.的API文檔
用ActionForward導(dǎo)航
ActionForward對(duì)象是配置對(duì)象。這些配置對(duì)象都有基于有意義名稱比如'success','failure'等的唯一標(biāo)識(shí)符保證可以被找到。request handlers使用封裝了URL路徑的ActionForward對(duì)象識(shí)別目的視圖。ActionForward對(duì)象根據(jù)struts-config.xml的