<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    WEB2.0開發(fā)

    心態(tài)決定行為,行為決定習(xí)慣,習(xí)慣決定命運

    Struts深度體驗之概述

    Struts是基于Model 2實現(xiàn)的技術(shù)框架,Model 2是經(jīng)典的MVC(Model,View,Control)模型的Web應(yīng)用變體,這個改變主要由于HTTP協(xié)議的無狀態(tài)性引起的。Model 2的目的和MVC一樣,也是利用控制器來分離模型和視圖,達到不同層間松散耦合的效果,提高系統(tǒng)靈活性、復(fù)用性和可維護性。在多數(shù)情況下,你可以將Model 2與MVC等同起來。

      圖 1表示一個基于Java技術(shù)典型的MVC網(wǎng)絡(luò)應(yīng)用,從中可以看出MVC中的各個部分對應(yīng)于J2EE哪些實現(xiàn)技術(shù)。


    圖 1 MVC和J2EE技術(shù)

      在利用Model 2之前,我們把所有的表示邏輯和業(yè)務(wù)邏輯都集中在一起(如我們前兩個專題中的login.jsp),有時也稱這種應(yīng)用模式為Model 1,Model 1的主要缺點就是緊耦合,復(fù)用性差,維護成本高。

      由于Struts就是基于Model2實現(xiàn)的框架,所以它底層的機制也是MVC,我們通過圖 2描述Struts的具體實現(xiàn):


    圖 2 Struts MVC實現(xiàn)

      1.框架初始化

      Struts框架總控制器(ActionServlet)完成所有初始化工作。總控制器是一個Servlet,它通過web.xml配置成自動啟動Servlet,讀取配置文件(struts-config.xml)的配置信息,為不同的Struts模塊初始化相應(yīng)的ModuleConfig對象。配置文件中的Action映射定義都保存在ActionConfig集合中,配置文件中其他配置信息分別保存在ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig等集合中。

      要特別指出的是,初始化動作在Web容器啟動時自動完成,初始化完成后,它將通過URL匹配映射截獲所有以.do結(jié)尾的URL請求。

      2.客戶端發(fā)送一個HTTP請求

      用戶通過提交表單或調(diào)用URL向Web應(yīng)用程序器提交一個請求,請求的數(shù)據(jù)用HTTP協(xié)議上傳給Web服務(wù)器。

      3.總控制器接截獲這個請求并實例化Form Bean

      控制器接收HTTP請求,并從ActionConfig中找出對應(yīng)該請求的Action子類,如果沒有對應(yīng)的Action,控制器直接將請求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁面。如果有對應(yīng)的Action且這個Action有一個相應(yīng)的Action Form,ActionForm被實例化并用HTTP請求的數(shù)據(jù)填充其屬性,然后保存在Servlet Context中(request或session中),這樣它們就可以被其它Action對象或者JSP調(diào)用。

      此外,還可以在ActionForm填充數(shù)據(jù)后還可以調(diào)用validate()進行數(shù)據(jù)有效性自檢,并且可以返回一個包含所有錯誤信息的ActionErrors對象,如果ActionErrors不空,總控制器直接將請求返回到入口頁面。

      4.控制器將請求轉(zhuǎn)交給具體的Action處理

      控制器根據(jù)配置信息將請求切換到具體的Action,這個Form Bean也一并傳給這個Action的execute()方法。

      5.Action完成具體的業(yè)務(wù)邏輯操作

      Action很簡單,一般只包含一個execute方法,它負責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,如果需要,它也可能進行相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個ActionForward對象,控制器通過該ActionForward對象來進行轉(zhuǎn)發(fā)工作。

      6.Action返回目標(biāo)響應(yīng)對象給總控制器

      Action根據(jù)業(yè)務(wù)處理的不同結(jié)果返回一個目標(biāo)響應(yīng)對象給總控制器,這個目標(biāo)響應(yīng)對象對應(yīng)一個具體的JSP頁面或另外一個Action。
     
      7.總控制器將HTTP請求轉(zhuǎn)換到目標(biāo)響應(yīng)對象中。

      總控制器根據(jù)業(yè)務(wù)功能Action返回的目標(biāo)響應(yīng)對象,將HTTP請求轉(zhuǎn)換到這個目標(biāo)響應(yīng)對象中,一般情況下,它是一個具體的JSP頁面。

      8.目標(biāo)響應(yīng)對象將結(jié)果展現(xiàn)給用戶
     
      目標(biāo)響應(yīng)對象(JSP)將結(jié)果頁面展現(xiàn)給用戶。

      客戶端發(fā)送一個HTTP請求,通過Struts框架最后獲得一個HTTP響應(yīng),這一過程非常重要,它是理解Struts框架的重點。圖 2描述了Struts框架的結(jié)構(gòu),而圖 3通過一個活動圖更具體描述接受請求直至返回響應(yīng)的整個過程:


    圖 3 Struts接受并返回響應(yīng)的中間過程
    Struts1.1新增功能

      1、多模塊的支持

      我們知道,在Struts 1.0中,只能在web.xml中為ActionServlet指定一個Struts配置文件(struts-config.xml),這對一個只需一兩個人開發(fā)的小系統(tǒng)當(dāng)然沒有任何問題,但如果一個多人開發(fā)的大中型應(yīng)用程序,問題就產(chǎn)生了。因為許多開發(fā)人員可能同時都需要修改Struts配置文件,這樣肯定會造成一定程度的資源爭奪,可能會出現(xiàn)彼此覆蓋的情況,這樣勢必會影響開發(fā)效率并引起開發(fā)人員的抱怨。

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

      ·多個配置文件

      支持多個配置文件,是指你能夠為ActionServlet同時指定多個xml配置文件,文件之間以逗號分隔,請看下面web.xml中關(guān)于多個struts配置文件的聲明示例:

       代碼清單 1 多個struts配置文件

    1. <servlet>
    2. <servlet-name>action</servlet-name>
    3. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    4. <init-param>
    5. <param-name>config</param-name>
    6. <param-value>
    7. /WEB-INF/struts-config.xml, /WEB-INF/book-struts-config.xml
    8. </param-value>
    9. </init-param>
    10. <load-on-startup>1</load-on-startup>
    11. </servlet>

      通過這種方法,你可以為每一個模塊定義一個配置文件,由于項目一般按模塊劃分工作,這樣就大大地減小了沖突的概率。

      ·獨立的模塊

      但是,多個配置文件存在一個潛在的問題:不同的配置文件之間會產(chǎn)生沖突,因為在ActionServlet初始化的時候多個配置文件還是要合并到一起。比如,在struts-config.xml中配置了一個名為errorDbAccess的<exception>,而在book-struts-config.xml中也配置了一個同樣的<exception>,這樣就產(chǎn)生沖突了。

      為了徹底解決這種沖突,Struts 1.1中引進了模塊(Module)的概念。一個模塊就是一個獨立的子系統(tǒng),對應(yīng)一個獨立的配置文件,ActionServlet將不同模塊的配置文件保存在各自獨立的ModuleConfig對象中的。

      下面是兩個獨立模塊的配置方式:

      代碼清單 2 多模塊配置方式

    1. …
    2. <init-param>
    3. <param-name>config</param-name>
    4. <param-value>/WEB-INF/struts-config.xml</param-value>
    5. </init-param>
    6. <init-param>
    7. <param-name>config/book</param-name>
    8. <param-value>/WEB-INF/book-struts-config.xml</param-value>
    9. </init-param>
    10. …

      通過這種方式,我們配置了兩個模塊,一個模塊名為config,而另一個名為config/book。

      ·動態(tài)ActionForm支持

      ActionForm表示HTTP頁面表單的數(shù)據(jù),可以將其看成視圖頁面數(shù)據(jù)的服務(wù)器映射,它負責(zé)保存視圖中的數(shù)據(jù)供控制器或者其他視圖使用。此外,它還負責(zé)數(shù)據(jù)有效性的驗證,所以Struts 1.1文檔把它比作HTTP和Action之間的防火墻,這足以體現(xiàn)ActionForm在視圖和控制器之間的過濾器作用。

      由于ActionForm對應(yīng)于HTTP頁面表單,所以隨著頁面的增多,你的ActionForm將會急聚增加。動態(tài)ActionForm(DynaActionForm)即為減少ActionForm的數(shù)目被設(shè)計出來,利用它你不必創(chuàng)建一個個具體的ActionForm類,只需要在配置文件中配置出所需的虛擬ActionForm,而由Struts框架通過配置文件動態(tài)創(chuàng)建這個ActionForm。例如,代碼清單 3通過指定<form-bean>的type為"org.apache.struts.action.DynaActionForm"來創(chuàng)建一個動態(tài)的ActionForm--loginForm。

      代碼清單 3 配置一個動態(tài)ActionForm

    1. <form-beans>
    2. <form-bean name="bookForm" type="org.apache.struts.action.DynaActionForm">
    3. <form-property name="bookId" type="java.lang.String"/>
    4. <form-property name="isbn" type="java.lang.String"/>
    5. <form-property name="bookName" type="java.lang.String"/>
    6. <form-property name="author" type="java.lang.String"/>
    7. </form-bean>
    8. </form-beans>

      DynaActionForm將屬性保存在一個Map對象中,同時提供相應(yīng)的get(name)和set(name,value)方法,其中參數(shù)name是要訪問的屬性名,而value是一個Object。例如要訪問DynaActionForm中bookName的值,可以采用String bookName = (String)get("bookName")方法,由于bookName存儲在Map中,所以要進行強制轉(zhuǎn)換。

      由于DynaActionForm通過配置文件產(chǎn)生,并沒有一個實體對象類,如果要對動態(tài)ActionForm對象進行校驗需要使用DynaValidatorForm,它是DynaActionForm的子類,它能夠提供動態(tài)ActionForm和動態(tài)表單輸入驗證的功能。檢驗規(guī)則在validation.xml配置文件中定義,而這些規(guī)則的所對應(yīng)的實現(xiàn)函數(shù)在validator-rules.xml文件中定義。

      ·通過配置方式實現(xiàn)異常處理

      Struts1.1允許以配置方式進行異常處理,配置方式可以避免在Action中通過硬編碼來處理異常,從而提高應(yīng)用程序異常處理的靈活性和可維護性。一般情況下,一個異常處理對象可以通過以下步驟實現(xiàn):

      1.實現(xiàn)org.apache.struts.action.ExceptionHandler的子類,覆蓋execute()方法,在該方法中處理異常并且返回一個ActionForward對象。

      2.在配置文件中配置異常處理對象,你可以配置一個全局的處理類或者單獨為每個Action配置處理類。

      代碼清單 4定義了一個全局的處理類TestExceptionHandler,它被用來處理所有的異常。

      代碼清單 4 一個全局宣告式異常處理的配置

    1. …
    2. <global-exceptions>
    3. <exception
    4. handler="com.superAbc.TestExceptionHandler"
    5. key="error.message"
    6. path="/fail.jsp"
    7. scope="request"
    8. type="java.lang.Exception"/>
    9. </global-exceptions>
    10. …

      type屬性定義了匹配的異常,path定義了異常發(fā)生后轉(zhuǎn)發(fā)的地址,而handler指定在轉(zhuǎn)發(fā)前對異常的特殊處理,如果沒有提供handler,默認的處理類org.apache.struts.action.ExceptionHandler。

    posted on 2006-05-20 14:49 ymx 閱讀(385) 評論(0)  編輯  收藏 所屬分類: Struts

    主站蜘蛛池模板: 亚洲无删减国产精品一区| 韩国亚洲伊人久久综合影院| 毛片免费全部播放一级| 亚洲精品无码久久久久秋霞| 亚洲国产av一区二区三区| 日韩免费人妻AV无码专区蜜桃| 亚洲噜噜噜噜噜影院在线播放| 国产乱子影视频上线免费观看| 国产一级一毛免费黄片| 亚洲精品二三区伊人久久| 亚洲精品无码99在线观看| 免费观看美女用震蛋喷水的视频| 欧洲亚洲综合一区二区三区| 亚洲专区在线视频| 免费一级毛片清高播放| 最近中文字幕高清免费中文字幕mv | 亚洲男人的天堂www| 中国在线观看免费高清完整版| 人体大胆做受免费视频| 亚洲在成人网在线看| 亚洲精品国产自在久久 | caoporn国产精品免费| 亚洲国产成人精品无码区在线网站| 免费大学生国产在线观看p| 67194国产精品免费观看| 日本一区二区三区在线视频观看免费| 久久亚洲国产成人精品性色 | 亚洲人成网www| 亚洲AV无码乱码在线观看| 2021国产精品成人免费视频| 两性色午夜免费视频| 亚洲va中文字幕| 久久精品国产亚洲AV忘忧草18| 国产亚洲精品资源在线26u| 波多野结衣免费视频观看| 青青青免费国产在线视频小草| 最近更新免费中文字幕大全| 男女啪啪免费体验区| 亚洲人成网站色7799| 亚洲成aⅴ人片在线观| 亚洲国产日韩一区高清在线|