WebWork项目建立在XWork项目上。入口Servlet是WebWork项目中定义的ServletDispatcher,而Action在XWork项目中定义。 
XWork Action接口的execute()方法没有参数,不像Struts Action那样接受request, response参数,所以XWork Action能够脱离Web环境被直接调用,便于单元测试。 
这里引入了一个问题。没有了request参数,那么XWork Action如何获得request parameters作为输入数据?又通过什么桥梁(Struts用request.setAttribute)把结果数据传送到View层? 
在Web Work中,只能通过Action本身的getter, setter属性来传送输入参数和输出结果。 
比如,我们有这样一个实现了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”; 
} 
}
这个类里面的productId将接受request输入参数,productName是输出到页面显示的结果。 
比如,这样的请求,http://yourhost/yourapp/MyAction.action?productId=1 
Web Work会把1填到YourAction的productId里面,然后执行execute()方法,JSP里的语句<ww:property value=“productName”>会把YourAction的productName显示在页面上。 
如果一个Web Framework采用了这种屏蔽Action的request, response参数的设计方式,一般也同时会采用这种Action和输入输出数据结合成一体的解决方式。类似的情形也存在于Tapestry和Maverick中,后面会讲到。 
当WebWork ServletDispatcher接收到HTTP Request的时候,首先把所有相关的信息(包括request, response, session, servlet config, servelt context, 所有request参数)等存放到AcationContext中,然后根据Interceptor配置信息,生成一个YourAction的动态代理类对象。实际上运行的正是这个代理对象,如同Servlet Filter的工作机制一般,所有注入的Interceptor方法会先于Actio方法运行。 
我们来看一下Action和Interceptor的地位:Action没有参数,无法获得ActionContext;而Interceptor接受的ActionInvoication参数拥有包括ActionContext在内的所有重要信息。 
这种权力分配的不平等,注定了Action的作用非常有限,只限于调用商业逻辑,然后返回一个成功与否标志。所有与外部Web世界打交道、协调内部工作流程的重担,都责无旁贷地落在Interceptor的肩上。 
我们可以设想一个极端的例子。我们声明一批不做任何事情的空Action,我们只是需要它们的空壳类名;我们制作一批对应的Interceptor,所有的转发控制、商业逻辑都在Interceptor上实现,然后把Interceptor都注入到对应的空Action。这在理论上是完全可行的。 
在Web海洋的包围中,Action可少,Interceptor不可少。Action是一个孤岛,如果没有外来盟友Interceptor的协助,只能在自己的小范围内独立作战(比如Unit Test),而对整体大局的作战目标无法产生影响。 
下面我们来看一下Action是如何在Interceptor的全程监管下工作的。 
在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里面的相关定义如下: 
<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执行execute()方法的前后,会被 
defaultStack所定义的三个Intercepter截获。这些Interceptor的任务之一就是把输入参数设置到Action的对应属性当中。 
如果我们需要加入对YourAction的属性的验证功能,只要把上述定义中的validation Interceptor加入到defaultStack中就可以了。当然,实际工作还没有这么简单,一般来说,还要为每个进行属性验证的Action的都配置一份validation.xml。 
XWork Interceptor能够在Package和Action级别上,进行截获处理。 
Servlet Filter能够在URL Patten级别上,进行截获处理。虽然实际上,Servlet Filter截获的是Servlet,但某些情况下,可以达到和截获一批Action的同样效果。 
比如,在Web Work中,我们可以为所有admin package的Action,加入一个Interceptor,当检查到当前Session的用户没有admin权限时,统一返回一个警告页面:您没有足够的权限执行这个操作。 
我们看到也可以为所有URL Pattern为“admin/*.action”的URL定义一个Servlet Filter,当检查到当前Session的用户没有admin权限时,统一返回一个警告页面:您没有足够的权限执行这个操作。 
WebWork的Interceptor配置是相当灵活的,相当于对Action实现了AOP。Interceptor相当于Aspect,基类AroundInterceptor的before(), after()方法相当于Advice。 
另外,XWork也提供了从XML配置文件装配Component的机制,相当于实现了对于Component的IoC。 
                                                               (申明:本文来源于网络,摘录于此,仅为日后方便查看)