jeffy

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


          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è)類里面的productId將接受request輸入?yún)?shù),productName是輸出到頁面顯示的結(jié)果。
          比如,這樣的請(qǐng)求,http://yourhost/yourapp/MyAction.action?productId=1
          Web Work會(huì)把1填到Y(jié)ourAction的productId里面,然后執(zhí)行execute()方法,JSP里的語句<ww:property value=“productName”>會(huì)把YourAction的productName顯示在頁面上。

          如果一個(gè)Web Framework采用了這種屏蔽Action的request, response參數(shù)的設(shè)計(jì)方式,一般也同時(shí)會(huì)采用這種Action和輸入輸出數(shù)據(jù)結(jié)合成一體的解決方式。類似的情形也存在于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)代理類對(duì)象。實(shí)際上運(yùn)行的正是這個(gè)代理對(duì)象,如同Servlet Filter的工作機(jī)制一般,所有注入的Interceptor方法會(huì)先于Actio方法運(yùn)行。

          我們來看一下Action和Interceptor的地位:Action沒有參數(shù),無法獲得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é)無旁貸地落在Interceptor的肩上。
          我們可以設(shè)想一個(gè)極端的例子。我們聲明一批不做任何事情的空Action,我們只是需要它們的空殼類名;我們制作一批對(duì)應(yīng)的Interceptor,所有的轉(zhuǎn)發(fā)控制、商業(yè)邏輯都在Interceptor上實(shí)現(xiàn),然后把Interceptor都注入到對(duì)應(yīng)的空Action。這在理論上是完全可行的。
          在Web海洋的包圍中,Action可少,Interceptor不可少。Action是一個(gè)孤島,如果沒有外來盟友Interceptor的協(xié)助,只能在自己的小范圍內(nèi)獨(dú)立作戰(zhàn)(比如Unit Test),而對(duì)整體大局的作戰(zhàn)目標(biāo)無法產(chǎn)生影響。
          下面我們來看一下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í)際工作還沒有這么簡(jiǎn)單,一般來說,還要為每個(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的用戶沒有admin權(quán)限時(shí),統(tǒng)一返回一個(gè)警告頁面:您沒有足夠的權(quán)限執(zhí)行這個(gè)操作。
          我們看到也可以為所有URL Pattern為“admin/*.action”的URL定義一個(gè)Servlet Filter,當(dāng)檢查到當(dāng)前Session的用戶沒有admin權(quán)限時(shí),統(tǒng)一返回一個(gè)警告頁面:您沒有足夠的權(quán)限執(zhí)行這個(gè)操作。
          WebWork的Interceptor配置是相當(dāng)靈活的,相當(dāng)于對(duì)Action實(shí)現(xiàn)了AOP。Interceptor相當(dāng)于Aspect,基類AroundInterceptor的before(), after()方法相當(dāng)于Advice。
          另外,XWork也提供了從XML配置文件裝配Component的機(jī)制,相當(dāng)于實(shí)現(xiàn)了對(duì)于Component的IoC。
           
                                                                         (申明:本文來源于網(wǎng)絡(luò),摘錄于此,僅為日后方便查看)
          posted on 2006-03-02 16:02 Live-in Java 閱讀(981) 評(píng)論(0)  編輯  收藏 所屬分類: Web Framwork
          主站蜘蛛池模板: 新建县| 思南县| 邢台市| 海门市| 乐业县| 乌拉特后旗| 越西县| 洮南市| 临桂县| 卢氏县| 汉沽区| 海伦市| 全椒县| 历史| 瑞金市| 北川| 保康县| 高密市| 德安县| 阿克陶县| 车致| 榆林市| 东至县| 金川县| 寿光市| 遵义县| 中阳县| 大渡口区| 晋江市| 昆明市| 台北市| 德兴市| 淳化县| 兴安盟| 通州市| 池州市| 德惠市| 九台市| 繁峙县| 微博| 九龙城区|