国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

深入Struts 1.1

2019-11-17 06:33:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

王和全(ok_winnerboy@sina.com)
2003年 8 月

作為基于MVC模式的Web應(yīng)用最經(jīng)典框架,Struts已經(jīng)正式推出了1.1版本,該版本在以往版本的基礎(chǔ)上,提供了許多激動(dòng)人心的新功能。本文就將帶你走進(jìn)Struts 1.1去深入地了解這些功能。

說(shuō)明:希望本文的讀者能有一定的Struts使用基礎(chǔ)。

1、Model 2

Struts是基于Model 2之上的,而Model 2是經(jīng)典的MVC(模型-視圖-控制器)模型的Web應(yīng)用變體,這個(gè)改變主要是由于網(wǎng)絡(luò)應(yīng)用的特性--HTTP協(xié)議的無(wú)狀態(tài)性引起的。Model 2的目的和MVC一樣,也是利用控制器來(lái)分離模型和視圖,達(dá)到一種層間松散耦合的效果,提高系統(tǒng)靈活性、復(fù)用性和可維護(hù)性。在多數(shù)情況下,你可以將Model 2與MVC等同起來(lái)。

下圖表示一個(gè)基于java技術(shù)的典型網(wǎng)絡(luò)應(yīng)用,從中可以看出Model 2中的各個(gè)部分是如何對(duì)應(yīng)于Java中各種現(xiàn)有技術(shù)的。

在利用Model 2之前,我們是把所有的表示邏輯和業(yè)務(wù)邏輯都集中在一起(比如大雜燴似的jsp),有時(shí)也稱這種應(yīng)用模式為Model 1,Model 1的主要缺點(diǎn)就是緊耦合,復(fù)用性差以及維護(hù)成本高。

2、Struts 1.1 和Model 2

既然Struts 1.1是基于Model 2之上,那它的底層機(jī)制也就是MVC,下面是Struts 1.1中的MVC實(shí)現(xiàn)示意圖:


圖解說(shuō)明:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖)

首先,控制器(ActionServlet)進(jìn)行初始化工作,讀取配置文件(struts-config.xml),為不同的Struts模塊初始化相應(yīng)的ModuleConfig對(duì)象。比如配置文件中的Action映射定義都保存在ActionConfig集合中。相應(yīng)地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。

提示:模塊是在Struts 1.1中新提出的概念,在稍后的內(nèi)容中我們將具體介紹,你現(xiàn)在可以簡(jiǎn)單地把模塊看作是一個(gè)子系統(tǒng),它們共同組成整個(gè)應(yīng)用,同時(shí)又各自獨(dú)立。Struts 1.1中所有的處理都是在特定模塊環(huán)境中進(jìn)行的。模塊的提出主要是為了解決Struts 1.0中單配置文件的問(wèn)題。

控制器接收HTTP請(qǐng)求,并從ActionConfig中找出對(duì)應(yīng)于該請(qǐng)求的Action子類,假如沒(méi)有對(duì)應(yīng)的Action,控制器直接將請(qǐng)求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁(yè)面。否則控制器將請(qǐng)求分發(fā)至具體Action類進(jìn)行處理。

在控制器調(diào)用具體Action的execute方法之前,ActionForm對(duì)象將利用HTTP請(qǐng)求中的參數(shù)來(lái)填充自己(可選步驟,需要在配置文件中指定)。具體的ActionForm對(duì)象應(yīng)該是ActionForm的子類對(duì)象,它其實(shí)就是一個(gè)JavaBean。此外,還可以在ActionForm類中調(diào)用validate方法來(lái)檢查請(qǐng)求參數(shù)的合法性,并且可以返回一個(gè)包含所有錯(cuò)誤信息的ActionErrors對(duì)象。假如執(zhí)行成功,ActionForm自動(dòng)將這些參數(shù)信息以JavaBean(一般稱之為form bean)的方式保存在Servlet Context中,這樣它們就可以被其它Action對(duì)象或者JSP調(diào)用。

Struts將這些ActionForm的配置信息都放在FormBeanConfig集合中,通過(guò)它們Struts能夠知道針對(duì)某個(gè)客戶請(qǐng)求是否需要?jiǎng)?chuàng)建相應(yīng)的ActionForm實(shí)例。

Action很簡(jiǎn)單,一般只包含一個(gè)execute方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,假如需要,它也進(jìn)行相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個(gè)ActionForward對(duì)象,控制器通過(guò)該ActionForward對(duì)象來(lái)進(jìn)行轉(zhuǎn)發(fā)工作。我們主張將獲取數(shù)據(jù)和執(zhí)行業(yè)務(wù)邏輯的功能放到具體的JavaBean當(dāng)中,而Action只負(fù)責(zé)完成與控制有關(guān)的功能。遵循該原則,所以在上圖中我將Action對(duì)象歸為控制器部分。

提示:其實(shí)在Struts 1.1中,ActionMapping的作用完全可以由ActionConfig來(lái)替代,只不過(guò)由于它是公共API的一部分以及兼容性的問(wèn)題得以保留。ActionMapping通過(guò)繼續(xù)ActionConfig來(lái)獲得與其一致的功能,你可以等同地看待它們。同理,其它例如ActionForward與ForwardConfig的關(guān)系也是如此。

下圖給出了客戶端從發(fā)出請(qǐng)求到獲得響應(yīng)整個(gè)過(guò)程的圖解說(shuō)明。

下面我們就來(lái)具體地討論一下其中的每個(gè)部分,在這之前,先來(lái)了解一下模塊的概念。

3、模塊

我們知道,在Struts 1.0中,我們只能在web.xml中為ActionServlet指定一個(gè)配置文件,這對(duì)于我們這些網(wǎng)上的教學(xué)例子來(lái)說(shuō)當(dāng)然沒(méi)什么問(wèn)題,但是在實(shí)際的應(yīng)用開(kāi)發(fā)過(guò)程中,可能會(huì)有些麻煩。因?yàn)樵S多開(kāi)發(fā)人員都可能同時(shí)需要修改配置文件,但是配置文件只能同時(shí)被一個(gè)人修改,這樣肯定會(huì)造成一定程度上的資源爭(zhēng)奪,勢(shì)必會(huì)影響開(kāi)發(fā)效率和引起開(kāi)發(fā)人員的抱怨。

在Struts 1.1中,為了解決這個(gè)并行開(kāi)發(fā)的問(wèn)題,提出了兩種解決方案:

  1. 多個(gè)配置文件的支持
  2. 模塊的支持

支持多個(gè)配置文件,是指你能夠?yàn)锳ctionServlet同時(shí)指定多個(gè)xml配置文件,文件之間以逗號(hào)分隔,比如Struts提供的MailReader演示例子中就采用該種方法。

  <!-- Action Servlet Configuration -->  <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, /WEB-INF/struts-config-registration.xml</param-value> </init-param>  <load-on-startup>1</load-on-startup>  </servlet>

這種方法可以很好地解決修改沖突的問(wèn)題,不同的開(kāi)發(fā)人員可以在不同的配置文件中設(shè)置自己的Action、ActionForm等等(當(dāng)然不是說(shuō)每個(gè)開(kāi)發(fā)人員都需要自己的配置文件,可以按照系統(tǒng)的功能模塊進(jìn)行劃分)。但是,這里還是存在一個(gè)潛在的問(wèn)題,就是可能不同的配置文件之間會(huì)產(chǎn)生沖突,因?yàn)樵贏ctionServlet初始化的時(shí)候這幾個(gè)文件最終還是需要合并到一起的。比如,在struts-config.xml中配置了一個(gè)名為sUCcess的<forward>,而在struts-config-registration.xml中也配置了一個(gè)同樣的<forward>,那么執(zhí)行起來(lái)就會(huì)產(chǎn)生沖突。

為了徹底解決這種沖突,Struts 1.1中引進(jìn)了模塊(Module)的概念。一個(gè)模塊就是一個(gè)獨(dú)立的子系統(tǒng),你可以在其中進(jìn)行任意所需的配置,同時(shí)又不必?fù)?dān)心和其它的配置文件產(chǎn)生沖突。因?yàn)榍懊嫖覀冎v過(guò),ActionServlet是將不同的模塊信息保存在不同的ModuleConfig對(duì)象中的。要使用模塊的功能,需要進(jìn)行以下的預(yù)備工作:

1、為每個(gè)模塊預(yù)備一個(gè)配置文件

2、配置web.xml文件,通知控制器

決定采用多個(gè)模塊以后,你需要將這些信息告訴控制器,這需要在web.xml文件進(jìn)行配置。下面是一個(gè)典型的多模塊配置:

<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param> <param-name>config/customer</param-name>  <param-value>/WEB-INF/struts-config-customer.xml</param-value></init-param><init-param>  <param-name>config/order</param-name> <param-value>/WEB-INF/struts-config-order.xml</param-value></init-param>

要配置多個(gè)模塊,你需要在原有的一個(gè)<init-param>(在Struts 1.1中將其對(duì)應(yīng)的模塊稱為缺省模塊)的基礎(chǔ)之上,增加模塊對(duì)應(yīng)的<init-param>。其中<param-name>表示為config/XXX的形式,其中XXX為對(duì)應(yīng)的模塊名,<param-value>中還是指定模塊對(duì)應(yīng)的配置文件。上面這個(gè)例子說(shuō)明該應(yīng)用有三個(gè)模塊,分別是缺省模塊、customer和order,它們分別對(duì)應(yīng)不同的配置文件。

3、預(yù)備各個(gè)模塊所需的ActionForm、Action和JSP等資源

但是要注重的是,模塊的出現(xiàn)也同時(shí)帶來(lái)了一個(gè)問(wèn)題,即如何在不同模塊間進(jìn)行轉(zhuǎn)發(fā)?有兩種方法可以實(shí)現(xiàn)模塊間的轉(zhuǎn)發(fā),一種就是在<forward>(全局或者本地)中定義,另外一種就是利用org.apache.struts.actions.SwitchAction。

下面就是一個(gè)全局的例子:

    ...     <struts-config> ...  <global-forwards>  <forward name="toModuleB"   contextRelative="true"     path="/moduleB/index.do"   redirect="true"/>    ...  </global-forwards>   ...       </struts-config>

可以看出,只需要在原有的path屬性前加上模塊名,同時(shí)將contextRelative屬性置為true即可。此外,你也可以在<action>中定義一個(gè)類似的本地<forward>。

  <action-mappings> <!-- Action mapping for PRofile form --> <action path="/login"  type="com.ncu.test.LoginAction"   name="loginForm"      scope="request"       input="tile.userLogin" validate="true">      <forward name="success" contextRelative="true" path="/moduleA/login.do"/>  </action>   </action-mappings>

假如你已經(jīng)處在其他模塊,需要轉(zhuǎn)回到缺省模塊,那應(yīng)該類似下面這樣定義,即模塊名為空。

<forward name="success" contextRelative="true" path="/login.do"/>

此外,你也可以使用org.apache.struts.actions.SwitchAction,例如:

    ...    <action-mappings>  <action path="/toModule"  type="org.apache.struts.actions.SwitchAction"/>   ...        </action-mappings>      ...

4、ActionServlet

我們首先來(lái)了解MVC中的控制器。在Struts 1.1中缺省采用ActionServlet類來(lái)充當(dāng)控制器。當(dāng)然假如ActionServlet不能滿足你的需求,你也可以通過(guò)繼續(xù)它來(lái)實(shí)現(xiàn)自己的類。這可以在/WEB-INF/web.xml中來(lái)具體指定。

要把握ActionServlet,就必須了解它所扮演的角色。首先,ActionServlet表示MVC結(jié)構(gòu)中的控制器部分,它需要完成控制器所需的前端控制及轉(zhuǎn)發(fā)請(qǐng)求等職責(zé)。其次,ActionServlet被實(shí)現(xiàn)為一個(gè)專門處理HTTP請(qǐng)求的Servlet,它同時(shí)具有servlet的特點(diǎn)。在Struts 1.1中它主要完成以下功能:


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘阴县| 仙桃市| 内乡县| 古蔺县| 喀喇| 镇平县| 鹿邑县| 太仓市| 徐水县| 城固县| 凤阳县| 称多县| 周口市| 惠水县| 马公市| 灵寿县| 阿巴嘎旗| 江西省| 应城市| 湛江市| 徐州市| 红安县| 庆安县| 建德市| 山阳县| 仁化县| 上虞市| 个旧市| 大冶市| 墨玉县| 金溪县| 志丹县| 龙井市| 石棉县| 斗六市| 房山区| 抚顺市| 安泽县| 托克逊县| 潼关县| 桃源县|