XWork命令模式框架的疑问
因为在项目中有一部分功能的设计看上去和命令模式比较像,因此,特意研究了下XWork。
XWork号称是通用,可重用以及可扩展的命令模式的框架。主要牵涉到的类就是
Action:命令接口,Action的返回结果就是String类型,其实是代表Action的执行状态,是成功了,还是失败了。
ActionInvocation:命令的调用者(Action和ActionInvocation分开,是典型的Command模式)
ActionContext:和ActionInvocation相关的命令的上下文,一般就是执行这个命令所需要的一些参数对象。如果f(x,y)可以表示命令的话,那么x,y就是这里的ActionContext的值:),不知道理解得对不对。我看源代码
public class ActionContext implements Serializable { static ThreadLocal actionContext = new ActionContextThreadLocal();public static final String SESSION = "com.opensymphony.xwork.ActionContext.session"; ... private static class ActionContextThreadLocal extends ThreadLocal { protected Object initialValue() { OgnlValueStack vs = new OgnlValueStack(); return new ActionContext(vs.getContext()); } } private void init() throws Exception { Map contextMap = createContextMap(); createAction(); if (pushAction) { stack.push(action); } //... private void init() throws Exception { Map contextMap = createContextMap(); createAction(); if (pushAction) { stack.push(action); } //... TestAction action = new TestAction(); OgnlValueStack valueStack = new OgnlValueStack(); valueStack.push(action); //进 valueStack.setValue("id", "1"); //改变值 action.execute(); //出 System.out.println("id after change: " + valueStack.findValue("id")); TestAction action = new TestAction(); OgnlValueStack valueStack = new OgnlValueStack(); valueStack.push(action); //进 valueStack.setValue("id", "1"); //改变值 action.execute(); //出 System.out.println("id after change: " + valueStack.findValue("id"));