转载
http://blog.csdn.net/flyforlove/article/details/1661965
xwork中command模式中的几个类
命令的发出者:ActionProxy
命令的传送者:ActionInvaction
命令的执行者:Action
当然,xwork的内部调用没有这么简单,使用xml配置文件来联系各个类。
现在用程序模拟以下xwork的comman模式工作方式。
首先是ActionProxy
ActionProxy.java
publicinterface ActionProxy {
public String execute() throws Exception;
}
ActionProxy是命令的发出着,也就是说client并不是直接让Action执行的,而是让ActionProxy来代理执行(虽然这儿看起来有点儿像代理模式,但是不是).
下面是ActionProxy的实现
package jp.co.wqf;
publicclass ActionProxyImpl implements ActionProxy {
Invocation invocation;
public ActionProxyImpl(Invocation invocation) {
this.invocation = invocation;
}
public String execute() throws Exception {
returninvocation.invoke();
}
}
要注入一个Invocation让其来传送命令。
接下来是ActionInvocation
ActionInvocation.java
public interface Invocation {
public String invoke() throws Exception;
}
定义一个调用方法。
它的实现为
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
publicclass InvocationImpl implements Invocation {
Iterator interceptors;
Action action;
Map resultMap;
booleanexecuted = false;
String resultCode;
public InvocationImpl(ArrayList interceptors, Action action, Map resultMap){
this.interceptors = interceptors.iterator();
this.action = action;
this.resultMap = resultMap;
}
public String invoke() throws Exception {
if(executed){
thrownew Exception("Action has been execute!");
}
if(interceptors.hasNext()) {
Interceptor interceptor = (Interceptor) interceptors.next();
interceptor.intercept(InvocationImpl.this);
}else{
resultCode = action.exectute();
}
if(!executed){
Result result = (Result) resultMap.get(resultCode);
if(result!=null)
result.execute();
executed = true;
}
returnresultCode;
}
}
这是一个比较主要的类,很多处理都是通过这儿来中转的,首先它通过注入和递归调用来实现了方法拦截,然后再调用Action来执行真正的处理,并根据处理结果来调用不同的结果处理类(Result)
最后是Action接口
Action.java
publicinterface Action {
public String exectute();
}
Action接口里定义了一个execute方法,用来执行某种操作,例如,数据库的CRUD各个操作等,用一个String的返回值来表示执行结果,比如“success”,“error”等。实际上xwork支持任何的执行方法,不仅限于execute,只要在xwork.xml文件中指定执行哪个方法就可以了
以下是Action接口的实现类,这儿返回一个“error”字符串。
publicclass ActionImpl implements Action {
public String exectute() {
System.out.println("Action Execute");
//return "success";
return"error";
}
}
另外还有Interceptor和Result接口,实现类。
Interceptor.java
public interface Interceptor {
publicvoid intercept(Invocation invocation) throws Exception;
}
InterceptorImpl.java
public class InterceptorImpl implements Interceptor {
private String name;
public InterceptorImpl(String name){
this.name = name;
}
publicvoid intercept(Invocation invocation) throws Exception {
System.out.println(name+", start");
invocation.invoke();
System.out.println(name+", end");
}
}
Result.java
public interface Result {
publicvoid execute();
}
ResultImpl.java
public class ResultImpl implements Result {
private String name;
public ResultImpl(String name) {
this.name = name;
}
publicvoid execute() {
System.out.println("Result "+this.name+" execute!");
}
}
测试类如下:
public class Test {
/**
*@paramargs
*@throwsException
*/
publicstaticvoid main(String[] args) throws Exception {
// TODO Auto-generated method stub
ArrayList interceptors = new ArrayList();
for (int i = 0; i < 5; i++) {
Interceptor inter = new InterceptorImpl("Interceptor_"+i);
interceptors.add(inter);
}
Result result = null;
Map resultMap = new HashMap();
result = new ResultImpl("success");
resultMap.put("success", result);
result = new ResultImpl("error");
resultMap.put("error", result);
Action action = new ActionImpl();
Invocation invocation = new InvocationImpl(interceptors, action, resultMap);
ActionProxy actionProxy = new ActionProxyImpl(invocation);
actionProxy.execute();
}
}
要点:
1.comman模式
2.IOC注入
3.递归调用(使用递归调用来实现方法拦截是个比较新颖的方法)
相关推荐
XWork利用了设计模式中的Command模式,将请求转换为可执行的对象,使得Action执行更加灵活。通过`com.opensymphony.xwork2.DefaultActionProxy`,我们可以看到如何创建和调度这些命令。 5. **ValueStack与OGNL** ...
XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Navigation ...
XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Navigation ...
XWork是Apache Struts框架的核心组件,它提供了一套强大的动作(Action)框架,使得开发者能够构建基于MVC(Model-View-Controller)模式的Web应用。这个资源包包含了XWork项目的源代码、文档、核心组件、插件以及...
XWork的核心组件包括Action、Interceptor(拦截器)和Command设计模式。Action是业务逻辑的载体,它接收请求、处理业务并返回结果。Interceptor则提供了一种在Action执行前后插入额外逻辑的方式,例如日志记录、权限...
1. **Action与Command模式**:Xwork基于设计模式中的Command模式,实现了Action接口,Action是业务逻辑的载体,接收并处理来自用户请求的数据。 2. **OGNL(Object-Graph Navigation Language)**:Xwork使用OGNL...
2. **Command模式**:XWork2基于Command模式,Action作为命令对象,接收请求并执行相应操作。 3. **Type Conversion**:XWork2提供类型转换机制,自动将请求参数转换为Action字段的类型。 4. **Exception Handling...
xwork 核心jar包,XWork是一个标准的Command模式实现,并且完全从web层脱离出来。 xwork-core-2.1.6.jar
3. **Command设计模式**:XWork中的Action实际上实现了Command设计模式,接收请求、执行命令并返回结果。 4. **动态方法调用**:XWork支持动态方法调用,允许通过字符串来调用Action的方法,增强了灵活性。 5. **...
7. **模块化设计**:XWork遵循模块化设计,源码中各模块分工明确,如Command模块负责Action的执行,Converter模块处理数据类型转换,使得代码可读性和可维护性大大提高。 8. **设计模式**:XWork源码中运用了多种...
Xwork最初源自WebWork项目,但随着技术的发展,它已经被抽象成一个独立的Command设计模式框架,并不再仅仅局限于Web应用开发领域。这意味着Xwork不仅可以被用于构建Web应用程序,还可以应用于非Web场景,如服务器端...
- **Command Pattern**: XWork采用了命令模式设计,使得请求处理过程可扩展且易于维护。 2. **工作流程** - **Dispatcher**: 调度器是XWork的核心组件,它接收请求,根据配置信息决定调用哪个Action,并管理...
XWork采用了Command模式设计,将每个Action实例视为一个命令对象,通过工作流组件执行命令。这种设计使得复杂的业务逻辑可以被分解为多个小任务,降低了耦合度。 4. **Ognl表达式语言** XWork内部使用了OGNL...
xwork-core-2.1.6.jar Command模式框架,WebWork和Struts2都基于xworkcommons-logging-1.0.4.jar Java日志工具类包 freemarker-2.3.15.jar 表现层框架,定义了struts2的可视组件主题 ognl-2.7.3.jar OGNL表达式语言...
http://localhost:8080/S2-016/hello.action?debug=command&expression=%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c... (省略) ``` 此payload的主要目的是绕过Struts2的安全限制,...
2. `xwork-core.jar`:XWork是Struts2的基础,提供Action、Command模式的支持。 3. `ognl.jar`:Object-Graph Navigation Language,用于表达式语言支持,用于访问和操作对象属性。 4. `freemarker.jar`:Freemarker...
- `xwork-core.jar`:XWork框架的库,它是Struts 2的基础,提供了ActionContext、Command模式等基础服务。 - `ognl.jar`:Object-Graph Navigation Language,用于表达式语言,Struts 2中的数据绑定和表达式计算依赖...
3. **xwork-2.0.4.jar**:XWork是Struts2的基础,提供了动作(Action)和命令(Command)模式的支持。它包含了一些基础的框架功能,如类型转换、数据绑定、异常处理等,这些功能也被Struts2框架所继承。 4. **ognl-...
Xwork作为基础框架,提供了核心功能,如Command模式实现、前端拦截器、表单验证、类型转换以及强大的表达式语言OGNL(Object Graph Notation Language)和IoC(Inversion of Control)容器。而Webwork2则基于Xwork,...
Xwork则是一个基础的Command模式框架,提供了前端拦截器、运行时表单验证、类型转换、OGNL表达式语言以及IoC容器等功能。 【Xwork详解】 Xwork作为WebWork的基础,其特点在于: 1. **前端拦截机(Interceptor)**:...