jeffy

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            70 Posts :: 1 Stories :: 14 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          相冊(cè)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          WebWork項(xiàng)目建立在XWork項(xiàng)目上。入口Servlet是WebWork項(xiàng)目中定義的ServletDispatcher,而Action在XWork項(xiàng)目中定義。
          XWork Action接口的execute()方法沒(méi)有參數(shù),不像Struts Action那樣接受request, response參數(shù),所以XWork Action能夠脫離Web環(huán)境被直接調(diào)用,便于單元測(cè)試。
          這里引入了一個(gè)問(wèn)題。沒(méi)有了request參數(shù),那么XWork Action如何獲得request parameters作為輸入數(shù)據(jù)?又通過(guò)什么橋梁(Struts用request.setAttribute)把結(jié)果數(shù)據(jù)傳送到View層?
          在Web Work中,只能通過(guò)Action本身的getter, setter屬性來(lái)傳送輸入?yún)?shù)和輸出結(jié)果。
          比如,我們有這樣一個(gè)實(shí)現(xiàn)了XWork Action接口的類(lèi),


          YourAction implements Action{
          int productId = null;
          String productName = null;
          public void setProductId(int productId){this.productId = productId;}
          public String getProductName(){return productName;}
          public String execute(){
          productName = findNameById(productId);
          return “success”;
          }
          }
          這個(gè)類(lèi)里面的productId將接受request輸入?yún)?shù),productName是輸出到頁(yè)面顯示的結(jié)果。
          比如,這樣的請(qǐng)求,http://yourhost/yourapp/MyAction.action?productId=1
          Web Work會(huì)把1填到Y(jié)ourAction的productId里面,然后執(zhí)行execute()方法,JSP里的語(yǔ)句<ww:property value=“productName”>會(huì)把YourAction的productName顯示在頁(yè)面上。

          如果一個(gè)Web Framework采用了這種屏蔽Action的request, response參數(shù)的設(shè)計(jì)方式,一般也同時(shí)會(huì)采用這種Action和輸入輸出數(shù)據(jù)結(jié)合成一體的解決方式。類(lèi)似的情形也存在于Tapestry和Maverick中,后面會(huì)講到。

          當(dāng)WebWork ServletDispatcher接收到HTTP Request的時(shí)候,首先把所有相關(guān)的信息(包括request, response, session, servlet config, servelt context, 所有request參數(shù))等存放到AcationContext中,然后根據(jù)Interceptor配置信息,生成一個(gè)YourAction的動(dòng)態(tài)代理類(lèi)對(duì)象。實(shí)際上運(yùn)行的正是這個(gè)代理對(duì)象,如同Servlet Filter的工作機(jī)制一般,所有注入的Interceptor方法會(huì)先于Actio方法運(yùn)行。

          我們來(lái)看一下Action和Interceptor的地位:Action沒(méi)有參數(shù),無(wú)法獲得ActionContext;而Interceptor接受的ActionInvoication參數(shù)擁有包括ActionContext在內(nèi)的所有重要信息。
          這種權(quán)力分配的不平等,注定了Action的作用非常有限,只限于調(diào)用商業(yè)邏輯,然后返回一個(gè)成功與否標(biāo)志。所有與外部Web世界打交道、協(xié)調(diào)內(nèi)部工作流程的重?fù)?dān),都責(zé)無(wú)旁貸地落在Interceptor的肩上。
          我們可以設(shè)想一個(gè)極端的例子。我們聲明一批不做任何事情的空Action,我們只是需要它們的空殼類(lèi)名;我們制作一批對(duì)應(yīng)的Interceptor,所有的轉(zhuǎn)發(fā)控制、商業(yè)邏輯都在Interceptor上實(shí)現(xiàn),然后把Interceptor都注入到對(duì)應(yīng)的空Action。這在理論上是完全可行的。
          在Web海洋的包圍中,Action可少,Interceptor不可少。Action是一個(gè)孤島,如果沒(méi)有外來(lái)盟友Interceptor的協(xié)助,只能在自己的小范圍內(nèi)獨(dú)立作戰(zhàn)(比如Unit Test),而對(duì)整體大局的作戰(zhàn)目標(biāo)無(wú)法產(chǎn)生影響。
          下面我們來(lái)看一下Action是如何在Interceptor的全程監(jiān)管下工作的。
          在WebWork中,我們需要如下配置XWork.xml。
          <xwork>

          <!-- Include webwork defaults (from WebWork-2.1 JAR). -->
          <include file="webwork-default.xml" />
          <!-- Configuration for the default package. -->
          <package name="default" extends="webwork-default">
          <!-- Default interceptor stack. -->
          <default-interceptor-ref name=" defaultStack" />
          <!-- Action: YourAction. -->
          <action name="youraction" class="yourapp.YourAction">
          <result name="success" type="dispatcher">
          YourAction.jsp
          </result>
          </action>
          </package>
          </xwork>

          webwork-default.xml里面的相關(guān)定義如下:
          <interceptors>
          <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
          <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.
          StaticParametersInterceptor"/>
          <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor "/>
          <interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.
          WebWorkConversionErrorInterceptor"/>
          <interceptor-stack name="defaultStack">
            <interceptor-ref name="static-params"/>
            <interceptor-ref name="params"/>
            <interceptor-ref name="conversionError"/>
          </interceptor-stack>
          </interceptors>

          從上述的配置信息中可以看出,YourAction執(zhí)行execute()方法的前后,會(huì)被
          defaultStack所定義的三個(gè)Intercepter截獲。這些Interceptor的任務(wù)之一就是把輸入?yún)?shù)設(shè)置到Action的對(duì)應(yīng)屬性當(dāng)中。
          如果我們需要加入對(duì)YourAction的屬性的驗(yàn)證功能,只要把上述定義中的validation Interceptor加入到defaultStack中就可以了。當(dāng)然,實(shí)際工作還沒(méi)有這么簡(jiǎn)單,一般來(lái)說(shuō),還要為每個(gè)進(jìn)行屬性驗(yàn)證的Action的都配置一份validation.xml。
          XWork Interceptor能夠在Package和Action級(jí)別上,進(jìn)行截獲處理。
          Servlet Filter能夠在URL Patten級(jí)別上,進(jìn)行截獲處理。雖然實(shí)際上,Servlet Filter截獲的是Servlet,但某些情況下,可以達(dá)到和截獲一批Action的同樣效果。
          比如,在Web Work中,我們可以為所有admin package的Action,加入一個(gè)Interceptor,當(dāng)檢查到當(dāng)前Session的用戶(hù)沒(méi)有admin權(quán)限時(shí),統(tǒng)一返回一個(gè)警告頁(yè)面:您沒(méi)有足夠的權(quán)限執(zhí)行這個(gè)操作。
          我們看到也可以為所有URL Pattern為“admin/*.action”的URL定義一個(gè)Servlet Filter,當(dāng)檢查到當(dāng)前Session的用戶(hù)沒(méi)有admin權(quán)限時(shí),統(tǒng)一返回一個(gè)警告頁(yè)面:您沒(méi)有足夠的權(quán)限執(zhí)行這個(gè)操作。
          WebWork的Interceptor配置是相當(dāng)靈活的,相當(dāng)于對(duì)Action實(shí)現(xiàn)了AOP。Interceptor相當(dāng)于Aspect,基類(lèi)AroundInterceptor的before(), after()方法相當(dāng)于Advice。
          另外,XWork也提供了從XML配置文件裝配Component的機(jī)制,相當(dāng)于實(shí)現(xiàn)了對(duì)于Component的IoC。
           
                                                                         (申明:本文來(lái)源于網(wǎng)絡(luò),摘錄于此,僅為日后方便查看)
          posted on 2006-03-02 16:02 Live-in Java 閱讀(983) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Web Framwork
          主站蜘蛛池模板: 丹江口市| 南阳市| 阳曲县| 麻栗坡县| 仪陇县| 辽阳县| 凤山市| 东源县| 阜城县| 亚东县| 靖宇县| 辽阳县| 彭州市| 中山市| 东乡县| 无棣县| 商水县| 万年县| 大安市| 恭城| 马公市| 青川县| 太湖县| 四平市| 堆龙德庆县| 长治市| 屏山县| 隆尧县| 洱源县| 南平市| 辽中县| 郸城县| 墨脱县| 日照市| 宁陕县| 东城区| 兴隆县| 长兴县| 五华县| 崇信县| 太保市|