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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    Struts framework 的工作原理和組件

    對于 Struts 如何控制、處理客戶請求,讓我們通過對 struts 的四個核心組件介紹來具體說明。這幾個組件就是: ActionServlet 。 Action Classes , Action Mapping (此處包括 ActionForward ), ActionFrom Bean

    Struts ActionServlet 控制器對象

    ?????? ActionServlet 繼承自 javax.servlet.http.HttpServlet , 其在 Struts framework 中扮演的角色是中心控制器。 它提供一個中心位置來處理全部的終端請求。 控制器 ActionServlet 主要負責將 HTTP 的客戶請求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當?shù)奶幚砥鳌?/span>

    ?????? 按照 Servelt 的標準 所有得 Servlet 必須在 web 配置文件 web.xml 聲明。同樣 , ActoinServlet 必須在 Web Application 配置文件 web.xml 中描述 , 有關(guān)配置信息如下。

    <servlet>

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

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

    </servlet>

    全部的請求 URI *.do 的模式存在并映射到這個 servlet , 其配置如下

    <servlet-mapping>

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

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

    </servlet-mapping>

    一個該模式的請求 URI 符合如下格式:

    ????????????? http://www.my_site_name.com/mycontext/actionName.do

    ?

    中心控制器為所有的表示層請求提供了一個集中的訪問點。這個控制器提供的抽象概念減輕了開發(fā)者建立公共應用系統(tǒng)服務的困難,如管理視圖、會話及表單數(shù)據(jù)。它也提供一個通用機制如錯誤及異常處理,導航,國際化,數(shù)據(jù)驗證,數(shù)據(jù)轉(zhuǎn)換等。

    ?

    當用戶向服務器端提交請求的時候,實際上信息是首先發(fā)送到控制器 ActionServlet ,一旦控制器獲得了請求,其就會將請求信息傳交給一些輔助類( help classes )處理。這些輔助類知道如何去處理與請求信息所對應的業(yè)務操作。在 Struts 中,這個輔助類就是 org.apache.struts.action.Action 。通常開發(fā)者需要自己繼承 Aciton 類,從而實現(xiàn)自己的 Action 實例。

    Struts Action Classes

    ?????? ActionServlet 全部提交的請求都被控制器委托到 RequestProcessor 對象。 RequestProcessor 使用 struts-config.xml 文件檢查請求 URI 找到動作 Action 標示符。

    一個 Action 類的角色,就像客戶請求動作和業(yè)務邏輯處理之間的一個適配器( Adaptor ),其功能就是將請求與業(yè)務邏輯分開。這樣的分離,使得客戶請求和 Action 類之間可以有多個點對點的映射。而且 Action 類通常還提供了其它的輔助功能,比如:認證( authorization )、日志( logging )和數(shù)據(jù)驗證( validation )。

    public ActionForward execute(ActionMapping ? mapping,

    ???????????????????????????? ActionForm ? form,

    ????? ???????????????????????javax.servlet.ServletRequest ? request,

    ???????????????????????????? javax.servlet.ServletResponse ? response)

    ????????????????????? throws java.io.IOException,javax.servlet.ServletException

    ?

    ?????? Action 最為常用的是 execute ()方法。(注意,以前的 perform 方法在 struts1.1 中已經(jīng)不再支持),還有一個 execute ()方法,請參考 apidoc ,在此不在說明。

    ?????? Controller 收到客戶的請求的時候,在將請求轉(zhuǎn)移到一個 Action 實例時,如果這個實例不存在,控制器會首先創(chuàng)建,然后會調(diào)用這個 Action 實例的 execute ()方法。 Struts Framework 為應用系統(tǒng)中的每一個 Action 類只創(chuàng)建一個實例。因為所有的用戶都使用這一個實例,所以你必須確定你的 Action 類運行在一個多線程的環(huán)境中。下圖顯示了一個 execute ()方法如何被訪問:

    Action 實例的 execute() 方法

    ??????

    注意,客戶自己繼承的 Action 子類,必須重寫 execute ()方法,因為 Action 類在默認情況下是返回 null 的。

    Struts Action Mapping

    上面講到了一個客戶請求是如何被控制器轉(zhuǎn)發(fā)和處理的,但是,控制器如何知道什么樣的信息轉(zhuǎn)發(fā)到什么樣的 Action 類呢?這就需要一些與動作和請求信息相對應的映射配置說明。在 struts 中,這些配置映射信息是存儲在特定的 XML 文件(比如 struts-config.xml )。 ?

    這些配置信息在系統(tǒng)啟動的時候被讀入內(nèi)存,供 struts framework 在運行期間使用。 在內(nèi)存中,每一個 <action> 元素都與 org.apache.struts.action.ActionMapping 類的一個實例對應。下表就顯示了一個登陸的配置映射。

    <action-mappings>

    ? <action? path="/logonAction"

    ?????????? type="com.test.LogonAction"

    ?????????? name="LogonForm"

    ?????????? scope="request"

    ?????????? input="logoncheck.jsp"

    validate="false">

    <forward name="welcome" path="/welcome.jsp"/>

    <forward name="failure" path="/logon_failure.jsp "/>

    </action>

    </action-mappings>

    ?

    ?

    <form-beans>

    ? <form-bean? name="LoginForm"

    type="com.test.LoginForm"/>

    </form-beans>

    上面的配置表示:當可以通過 /logonAction.do (此處假設(shè)配置的控制器映射為 *.do )提交請求信息的時候,控制器將信息委托 com.test.LogonAction 處理。調(diào)用 LogonAction 實例的 execute() 方法。同時將 Mapping 實例和所對應的 LogonForm Bean 信息傳入。其中 name=LogonForm ,使用的 form-bean 元素所聲明的 ActionForm Bean 。有關(guān) form-bean 的申明如下顯示。

    使用 ActionForward 導航

    元素 <forward> 則表示了當 Action 實例的 execute() 方法運行完畢或,控制器根據(jù) Mapping 可將響應信息轉(zhuǎn)到適當?shù)牡胤?。如上面現(xiàn)實,如果客戶登陸成功,則調(diào)用 welcome forward ,將成功信息返回到 /welcome.jsp 頁面。在你的 execute() 方法的結(jié)尾可以使用下面的實例代碼而返回 welcome forward 。當然你的 welcome forward 必須在 action 元素屬性中定義,正如上面所聲明的那樣。

    return (mapping.findForward("welcome"));

    ?

    ?????? ActionForward 對象是配置對象。這些配置對象擁有獨一無二的標識以允許它們按照有意義的名稱如 “success” “failure” 等來檢索。 ActionForward 對象封裝了向前進的 URL 路徑且被請求處理器用于識別目標視圖。 ActionForward 對象建立自 <forward> 元素位于 struts-config.xml 。下面是一個 Struts <forward> 元素例子,屬于 <action> 元素范圍。

    <action path="/editCustomerProfile"

    type="packageName.EditCustomerProfileAction"

    name="customerProfileForm" scope="request">

    <forward name="success" path="/MainMenu.jsp"/>

    <forward name="failure" path="/CustomerService.jsp"/>

    </action>

    ?????? 基于執(zhí)行請求處理器的 execute(…) 方法的結(jié)果,當傳遞一個值匹配指定于 <forward> 元素中 name 屬性的值的時候,下一個視圖可以在 execute(…) 方法中被開發(fā)者用方便的方法 org.apache.struts.action.ActionMapping.findForward(…) 選擇。 ActionMapping.findForward(…) 方法既從它的本地范圍又從全局范圍提供一個 ActionForward 對象,該對象返回至 RequestProcessor RequestDispatcher.forward(…) response.sendRedirect(…) 調(diào)用下一個視圖。當 <forward> 元素有 redirect=“false” 屬性或 redirect 屬性不存在的時候, RequestDispatcher.forward(…) 被執(zhí)行;當 redirect=“true” 是,將調(diào)用 sendRedirect(…) 方法。下例舉例說明了 redirect 屬性的用法:

    ?????? ? <forward name="success" path="/Catalog.jsp" redirect="true"/>

    如果 redirect=true, URL 建立如 /contextPath/path 因為 HttpServletResponse.sendRedirect(…) 中解釋 URL 采用 ”/” 開頭相對于 servlet 容器根目錄。

    如果 redirect=false, URI 建立如 /path 因為 ServletContext.getRequestDisptacher(…) 采用虛擬目錄相關(guān) URL 。

    ?

    在此稍稍說一下有關(guān) global-forwards 的概念。其在配置文件中描述了整個應用系統(tǒng)可以使用的 ActionForward ,而不是僅僅是一個特定的 Action

    ? ?<global-forwards>

    ??? <forward name="logout" path="/logout.do"/>

    <forward name="error"? path="/error.jsp"/>

    ? </global-forwards>

    ?

    Struts ActionForm Bean 捕獲表單數(shù)據(jù)

    在上面講解 ActionServlet Action Classes Action Mapping 的時候,我們都提到了 ActionForm Bean 的概念。一個應用系統(tǒng)的消息轉(zhuǎn)移(或者說狀態(tài)轉(zhuǎn)移)的非持久性數(shù)據(jù)存儲,是由 ActionForm Bean 的負責保持的。

    ?????? ActionForm 派生的對象用于保存請求對象的參數(shù),因此它們和用戶緊密聯(lián)系。

    ?????? 一個 ActionForm 類被 RequestProcessor 建立。這是發(fā)生在已完成向前進到一個 URL ,該 URL 為映射到控制器 servlet 而不是 JSP 和相應的動作映射指定的表單屬性的。在這個情況下,如果沒有在指定的活動范圍內(nèi)找到, RequestProcessor 將嘗試尋找可能導致創(chuàng)建一個新 ActionForm 對象的表單 bean 。該 ActionForm 對象在指定的活動范圍內(nèi)被用 <action> 元素的 name 屬性找到;

    RequestProcessor 將隨后重新安排表單屬性,用請求時參數(shù)填充表單,隨即調(diào)用表單對象的 validate(…) 方法以履行服務器端用戶輸入驗證。僅當 ActionMapping 對象中 validate 屬性被設(shè)為 true 時, validate(…) 方法被調(diào)用;這就是默認的行為。 request.getParameterValues(parameterName) 被用于得到一個 String[] 對象,它用來表單填充;驗證的結(jié)果應該是一個 ActionErrors 對象,用 org.apache.struts.taglib.html.ErrorsTag 來顯示驗證錯誤給用戶。 ActionForm 也可以被用于為當前用戶保存即將被一個視圖引用的中間模型狀態(tài)。

    當一個表單對象被 RequestProcessor 找到,它被傳遞到請求處理器的 execute(…) 方法。一個 ActionForm 對象也可以被請求處理器建立。表單對象建立目的是提供中間模型狀態(tài)給使用請求范圍 JSP ;這將確保對象不會在有效性過期后仍然存在。默認的,所有的表單都被保存為會話范圍。會話中表單對象脫離有效性的存在可能導致浪費內(nèi)存,同樣的,請求處理器必須跟蹤保存在會話中的表單對象的生命周期。一個好的捕獲表單數(shù)據(jù)的實踐是為橫跨多用戶交互的相關(guān)表單用一個單獨的表單 bean 。表單 bean 也可以在反饋的時候用來儲存能夠被自定義標簽改變的中間模型狀態(tài)。在視圖中標簽用法避免結(jié)合 Java 代碼,因此要成一個好的任務劃分, web 生產(chǎn)組主要處理標志,而應用開發(fā)組主要處理 Java 代碼。標簽因素退出訪問中間模型狀態(tài)的邏輯;當訪問嵌套的對象或當通過聚集列舉時這個邏輯可能很復雜。

    注意:在 struts1.1 中, ActionForm 的校驗功能,逐漸被剝離出來(當然依然可以使用)。使用了 validator framework 對整個應用系統(tǒng)的表單數(shù)據(jù)驗證進行統(tǒng)一管理。相信信息請參考: http://home.earthlink.net/~dwinterfeldt

    ActionForm 的使用中, Struts 提倡使用到值對象( Value Object )。這樣將客戶或開發(fā)人員,對數(shù)據(jù)狀態(tài)與對象狀態(tài)能夠更加清晰的理解和使用。

    對于每一個客戶請求, Struts framework 在處理 ActionForm 的時候,一般需要經(jīng)歷如下幾個步驟:

    (1)檢查 Action 的映射,確定 Action 中已經(jīng)配置了對 ActionForm 的映射

    ?????? (2)根據(jù) name 屬性,查找 form bean 的配置信息

    ?????? (3)檢查 Action formbean 的使用范圍,確定在此范圍下,是否已經(jīng)有此 form bean 的實例。

    ?????? (4)假如當前范圍下,已經(jīng)存在了此 form bean 的實例,而是對當前請求來說,是同一種類型的話,那么就重用。

    ?????? (5)否則,就重新構(gòu)建一個 form bean 的實例

    ?????? (6) form bean reset() 方法備調(diào)用

    ?????? (7)調(diào)用對應的 setter 方法,對狀態(tài)屬性賦值

    ?????? (8)如果 validatede 的屬性北設(shè)置為 true ,那么就調(diào)用 form bean validate() 方法。

    9 )如果 validate ()方法沒有返回任何錯誤,控制器將 ActionForm 作為參數(shù),傳給 Action 實例的 execute ()方法并執(zhí)行。

    ?

    注意:直接從 ActionFrom 類繼承的 reset() validate() 方法,并不能實現(xiàn)什么處理功能,所以有必要自己重新覆蓋。

    Struts 的其他組件

    ?????? Struts framework 本身提供了很多可擴展的組件或 sub framework ,方便的開發(fā)人員在其構(gòu)架上構(gòu)建 web 層的應用系統(tǒng)。比如 upload,collections ,logging 等等。讓我們來看看兩個比較重要的組件: validationg framework struts taglib 。有關(guān)其他組件請參考 Struts 用戶手冊( http://jakarta.apache.org/struts/userGuide )。

    ??????

    Validation Framework for Struts

    struts1.1 中,新增了 validation framework 。增加了對 form 數(shù)據(jù)提交的驗證。將原本需要在 ActionFrom Bean validate ()進行的驗證通過配置文件的描述進行驗證。

    有關(guān)其詳細信息,請參考 http://home.earthlink.net/~dwinterfeldt 。個人建議對于小型應用系統(tǒng)可以采用這種配置方式,但是對于應用系統(tǒng)中有大量 web 層表單應用的系統(tǒng),并且業(yè)務需求變動比較大的,使用 validation framework 可能會加重開發(fā)難度、系統(tǒng)維護難度??梢越梃b validation framework Javascript Validator Tag 。

    ?

    Struts TagLib

    ?????? struts 提供了一組可擴展的自定義標簽庫( TagLib ),可以簡化創(chuàng)建用戶界面的過程。目前包括: Bean Tags , HTML Tags Logic Tags Nested Tags Template Tags  這幾個 Taglib 。有關(guān) Struts Taglib 的結(jié)構(gòu)和使用,可以參考前面有關(guān) Cutomer Tag Lib 的介紹,有關(guān)起詳細資料,請參考

    BeanUtils

    ?????? 這個組件的全稱是 Bean Introspection Utilites 。是屬于 Jakarta Commons 項目組的。主要是幫助構(gòu)建 javabean 的屬性操作的( getter,setter ),已經(jīng)提供一種動態(tài)定義和訪問 bean 的屬性。有關(guān)詳細信息,請參考。

    http://jakarta.apache.org/commons/beanutils.html

    ?????? 如果各位對這方面有很興趣,可以參考一些有關(guān) java 反射( Reflectio )方面的資料。

    Collections

    ?????? 這個組件主要是提供了一些集合或列表對象 , 在原有的 java collections framework 的基礎(chǔ)上進行了擴展。詳細資料請參考:

    http://jakarta.apache.org/commons/collections.html 以及

    http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13

    Digester

    ?????? 這個組件翻譯成中文的意思是 匯編 。其主要功能是根據(jù) xml 配置文件,初始化系統(tǒng)的一些 java 類對象。 Digester 幫助你指定 XML java 對象之間映射模型,而且允許客戶話定制映射規(guī)則( rules )。詳細資料請參考

    http://jakarta.apache.org/commons/digester.html

    ?

    ?



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=323752

    posted on 2006-12-20 16:07 蘆葦 閱讀(613) 評論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 亚洲综合色婷婷在线观看| 国产精品无码一区二区三区免费| 一级一级毛片免费播放| 国产99久久亚洲综合精品| 亚洲成熟丰满熟妇高潮XXXXX| 国产亚洲国产bv网站在线| 亚洲综合小说久久另类区| 久久精品国产亚洲AV电影| 久久亚洲精品国产精品| 亚洲图片激情小说| 亚洲一区电影在线观看| ASS亚洲熟妇毛茸茸PICS| 国产99在线|亚洲| 亚洲日韩国产二区无码| 亚洲精品无码av中文字幕| 亚洲爆乳少妇无码激情| 色欲aⅴ亚洲情无码AV| 免费高清A级毛片在线播放| 又黄又大的激情视频在线观看免费视频社区在线| 久久亚洲欧美国产精品| 深夜A级毛片视频免费| 一级毛片成人免费看a| 国产一级高青免费| 日韩电影免费观看| 亚洲视频免费在线看| 无码专区永久免费AV网站| 免费无码又爽又刺激高潮| 亚洲A∨精品一区二区三区| 亚洲精品无码av天堂| 亚洲成色在线综合网站| 久久久久亚洲AV无码专区首JN| 亚洲AV综合色区无码二区偷拍| 亚洲狠狠婷婷综合久久| 特色特黄a毛片高清免费观看| 你是我的城池营垒免费看| 91香蕉在线观看免费高清| 影音先锋在线免费观看| 亚洲精品国产自在久久 | 99免费精品视频| 91视频免费网址| 破了亲妺妺的处免费视频国产|