本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0

          處理流程

          1、在struts2中所有的請(qǐng)求由org.apache.struts2.dispatcher.FilterDispatcher傳遞過(guò)來(lái)。從請(qǐng)求的服務(wù)名解析出對(duì)應(yīng)的action名稱(chēng),并遍歷HttpServletRequest、HttpSession、ServletContext 中的數(shù)據(jù),并將其復(fù)制到Webwork的Map實(shí)現(xiàn)中,至此之后,所有數(shù)據(jù)操作均在此Map結(jié)構(gòu)中進(jìn)行,從而將內(nèi)部結(jié)構(gòu)與Servlet API相分離

          2、以上述信息作為參數(shù),調(diào)用ActionProxyFactory創(chuàng)建對(duì)應(yīng)的ActionProxy實(shí)例。ActionProxyFactory 將根據(jù)Xwork 配置文件(xwork.xml)中的設(shè)定,創(chuàng)建ActionProxy實(shí)例,ActionProxy中包含了Action的配置信息(包括Action名稱(chēng),對(duì)應(yīng)實(shí)現(xiàn)類(lèi)等等)。

          3、ActionProxy創(chuàng)建對(duì)應(yīng)的Action實(shí)例,并根據(jù)配置進(jìn)行一系列的處理程序。包括執(zhí)行相應(yīng)的預(yù)處理程序(如通過(guò)Interceptor 將Map 中的請(qǐng)求數(shù)據(jù)轉(zhuǎn)換為Action所需要的Java 輸入數(shù)據(jù)對(duì)象等),以及對(duì)Action 運(yùn)行結(jié)果進(jìn)行后處理。ActionInvocation 是這一過(guò)程的調(diào)度者。而com.opensymphony.xwork.
          DefaultActionInvocation 則是XWork 中對(duì)ActionInvocation 接口的標(biāo)準(zhǔn)實(shí)現(xiàn),如
          果有精力可以對(duì)此類(lèi)進(jìn)行仔細(xì)研讀,掌握了這里面的玄機(jī),相信XWork的引擎就不再神秘。

          一段配置文件件及期解析

          ???????? < action? name ="login" ?class ="one.LoginAction" >
          ????????????
          < result? name ="success" ?type ="dispatcher" >
          ????????????????
          < param? name ="location" > /main.jsp </ param >
          ????????????
          </ result >
          ????????????
          < result? name ="loginfail" ?type ="dispatcher" >
          ????????????????
          < param? name ="location" > /login.jsp </ param >
          ????????????
          </ result >
          ????????????
          < interceptor-ref? name ="params" ? /> ? <!-- ??參數(shù)攔截? -->
          ????????????
          < interceptor-ref? name ="model-driven" /> <!-- ?模型驅(qū)動(dòng)? -->
          ????????
          </ action >
          include
          通過(guò)include 節(jié)點(diǎn),我們可以將其他配置文件導(dǎo)入到默認(rèn)配置文件xwork.xml 中。從而實(shí)現(xiàn)良好的配置劃分。這里我們導(dǎo)入了Webwork 提供的默認(rèn)配置webwork-default.xml(位于webwork.jar 的根路徑)。

          package
          XWork中,可以通過(guò)package對(duì)action進(jìn)行分組。類(lèi)似Java 中package和class的
          關(guān)系。為可能出現(xiàn)的同名Action提供了命名空間上的隔離。
          同時(shí),package還支持繼承關(guān)系。在這里的定義中,我們可以看到:
          extends="webwork-default""webwork-default"是webwork-default.xml文件中定義的package,這里通過(guò)繼承,"default" package 自動(dòng)擁有"webwork-default" package 中的所有定義關(guān)系。這個(gè)特性為我們的配置帶來(lái)了極大便利。在實(shí)際開(kāi)發(fā)過(guò)程中,我們可以根據(jù)自身的應(yīng)用特點(diǎn),定義相應(yīng)的package模板,并在各個(gè)項(xiàng)目中加以重用,無(wú)需再在重復(fù)繁瑣的配置過(guò)程中消耗精力和時(shí)間。此外,我們還可以在Package節(jié)點(diǎn)中指定namespace,將我們的action分為若干個(gè)邏輯區(qū)間。如:<package name="default" namespace="/user"extends="webwork-default">就將此package中的action定義劃歸為/user 區(qū)間,之后在頁(yè)面調(diào)用action的時(shí)候,我們需要用/user/login.action 作為form action 的屬性值。其中的/user/就指定了此action的namespace,通過(guò)這樣的機(jī)制,我們可以將系統(tǒng)內(nèi)的action進(jìn)行邏輯分類(lèi),從而使得各模塊之間的劃分更加清晰。
          action
          Action配置節(jié)點(diǎn),這里可以設(shè)定Action的名稱(chēng)和對(duì)應(yīng)實(shí)現(xiàn)類(lèi)。
          result
          通過(guò)result 節(jié)點(diǎn),可以定義Action 返回語(yǔ)義,即根據(jù)返回值,決定處理模式以及響應(yīng)界面。這里,返回值"success"(Action 調(diào)用返回值為String 類(lèi)型)對(duì)應(yīng)的處理模式為"dispatcher"。
          可選的處理模式還有:
          1. dispatcher
          本系統(tǒng)頁(yè)面間轉(zhuǎn)向。類(lèi)似forward。
          2. redirect
          瀏覽器跳轉(zhuǎn)。可轉(zhuǎn)向其他系統(tǒng)頁(yè)面。
          3. chain
          將處理結(jié)果轉(zhuǎn)交給另外一個(gè)Action處理,以實(shí)現(xiàn)Action的鏈?zhǔn)教幚怼?br />4. velocity
          將指定的velocity模板作為結(jié)果呈現(xiàn)界面。
          5. xslt
          將指定的XSLT 作為結(jié)果呈現(xiàn)界面。
          隨后的param節(jié)點(diǎn)則設(shè)定了相匹配的資源名稱(chēng)。
          interceptor-ref
          設(shè)定了施加于此Action的攔截器(interceptor)。關(guān)于攔截器,請(qǐng)參見(jiàn)稍后的“XWork攔截器體系”部分。interceptor-ref定義的是一個(gè)攔截器的應(yīng)用,具體的攔截器設(shè)定,實(shí)際上是繼承于webwork-default package,我們可以在webwork-default.xml 中找到對(duì)應(yīng)的"params"和"model-driven"攔截器設(shè)置:
          關(guān)于攔截器可以參考struts-default時(shí)的定義總之它就是把請(qǐng)求封裝成對(duì)象,或把對(duì)象封裝成。通常我們?cè)?lt;package>節(jié)點(diǎn)里包含這段代碼,避免重復(fù)定義攔截.
          <interceptors>
          ??
          <interceptor-stack?name="modelParamsStack">
          ????
          <interceptor-ref?name="params"?/>
          ????
          <interceptor-ref?name="model-driven"?/>
          ??
          </interceptor-stack>
          </interceptors>
          然后在不同的Action節(jié)里點(diǎn)引用,方法如
          <interceptor-ref?name="modelParamsStack"?/>

          Webwork 中的Model對(duì)象,扮演著承上啟下的角色,它既是Action的輸入?yún)?shù),又包含了Action處理的結(jié)果數(shù)據(jù)。換句話(huà)說(shuō),輸入的Http請(qǐng)求參數(shù),將被存儲(chǔ)在Model對(duì)象傳遞給Action進(jìn)行處理,Action處理完畢之后,也將結(jié)果數(shù)據(jù)放置到Model 對(duì)象中,之后,Model 對(duì)象與返回界面融合生成最后的反饋?lái)?yè)面。也正由于此,筆者建議在實(shí)際開(kāi)發(fā)中采用Model-Driven 模式,而非Property-Driven 模式(見(jiàn)稍后“Action驅(qū)動(dòng)模式”部分),這將使得業(yè)務(wù)邏輯更加清晰可讀。

          ActionContext為Action提供了與容器交互的途徑。對(duì)于Web 應(yīng)用而言,與容器的交互大多集中在Session、Parameter,通過(guò)ActionContext我們?cè)诖a中實(shí)現(xiàn)與Servlet API無(wú)關(guān)的容器交互。此外, 為了提供與Web 容器直接交互的可能。WebWork 還提供了一個(gè)ServletActionContext實(shí)現(xiàn)。它擴(kuò)展了ActionContext,提供了直接面向Servlet API的容器訪問(wèn)機(jī)制。

          我們可以直接通過(guò)ServletActionContext.getRequest 得到當(dāng)前HttpServletRequest 對(duì)象的引用,從而直接與Web 容器交互。
          posted on 2007-03-21 14:59 有貓相伴的日子 閱讀(1262) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): j2ee
          本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 天门市| 舒城县| 腾冲县| 安国市| 新平| 武平县| 新巴尔虎右旗| 安顺市| 临安市| 铜山县| 梅州市| 通许县| 常德市| 金坛市| 清苑县| 贵南县| 达尔| 万源市| 孝感市| 五大连池市| 孝义市| 玛曲县| 新郑市| 南投市| 德化县| 大理市| 逊克县| 竹山县| 基隆市| 浙江省| 临泽县| 万载县| 会同县| 晋州市| 东丰县| 安阳市| 监利县| 三台县| 茂名市| 浏阳市| 临朐县|