首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

XWork下令模式框架的疑问

2012-11-09 
XWork命令模式框架的疑问因为在项目中有一部分功能的设计看上去和命令模式比较像,因此,特意研究了下XWork。

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());        }    }

ActionContext包含了很多将请求的信息转换为内部Map来存储。

Result:表示执行结果,和ActionInvoation相关联,是和后面View的实现相关联的。

我比较疑惑的是,这里的Result是接口,和后续的处理相关联。那实际Action执行之后得到的数据在什么地方?都放在ActionContext当中去了?
如果是的话,命令的输入参数由ActionContext来表示,执行动作后的输出参数也放在ActionContext中了,如何做到的。

非常疑惑。我特别想将请求参数和输出结果分开,搞不懂。
public int doStartTag() throws JspException { try { Object actualValue = null; if (value == null) { value = "top"; } actualValue = getStack().findValue(value, String.class); //..

可以看到数据是从stack里面取出来的

而在DefaultActionInvocation中有这么一段
    private void init() throws Exception {        Map contextMap = createContextMap();        createAction();        if (pushAction) {            stack.push(action);        }        //...


表明在action被执行前 它已经被放到valuestack里面去了

也就是说取数据是通过OgnlValueStack这个类 来解析ognl语言在内部stack里相对应的数据di


顺便说一下 其实把数据从页面填到action里也是OgnlValueStack代工的 看一下ParametersInterceptor那个类就清楚了 public int doStartTag() throws JspException { try { Object actualValue = null; if (value == null) { value = "top"; } actualValue = getStack().findValue(value, String.class); //..

可以看到数据是从stack里面取出来的

而在DefaultActionInvocation中有这么一段
    private void init() throws Exception {        Map contextMap = createContextMap();        createAction();        if (pushAction) {            stack.push(action);        }        //...


表明在action被执行前 它已经被放到valuestack里面去了

也就是说取数据是通过OgnlValueStack这个类 来解析ognl语言在内部stack里相对应的数据di

哦,我大概清楚了。但是,这里的示例代码并没有说明OgnlValueStack中怎么包含了action的执行结果。
stack.put(action),这个只是将action给放放进去了,并没有将Action相关联的执行结果给放进去啊?。我们一般建立Action子类的时候,并不会描述Action的数据结果啊,所以,一直很纳闷这个事情。干脆,那个execute()方法的返回参数变成Object多好:)

对于这个,我就不清楚了。请祥示,谢谢。





顺便说一下 其实把数据从页面填到action里也是OgnlValueStack代工的 看一下ParametersInterceptor那个类就清楚了[b][/b][b][b] public String execute() { System.out.println("id in action: " + id); this.id = "2"; return SUCCESS; }

然后随便写个类 这是main函数
        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"));




MetricsAction implements Action{ private Result result; private Input x; private Input y; public String execute() { System.out.println("id in action: " + id); this.id = "2"; this.result = f(x,y); return SUCCESS; }} valueStack.findValue("result"));


public String execute() { System.out.println("id in action: " + id); this.id = "2"; return SUCCESS; }

然后随便写个类 这是main函数
        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"));




热点排行