锁定老帖子 主题:XWork命令模式框架的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-07
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中了,如何做到的。 非常疑惑。我特别想将请求参数和输出结果分开,搞不懂。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-07
action本身就带着参数。
|
|
返回顶楼 | |
发表时间:2006-11-07
输入输出参数都保存在action里面
如果是页面上来的数据 一般通过params那个interceptor来把request里用户传进来的参数填到action里面去 这个lz没有意见吧 楼主的疑惑无非是在action执行完毕后 在action内部的数据怎么拿出来的 答案是通过OgnlValueStack 拿com.opensymphony.webwork.views.jsp.PropertyTag 举例子 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那个类就清楚了 |
|
返回顶楼 | |
发表时间:2006-11-07
jzk 写道 输入输出参数都保存在action里面
[b][/b][b][b]
如果是页面上来的数据 一般通过params那个interceptor来把request里用户传进来的参数填到action里面去 这个lz没有意见吧 嗯,没有意见。 如果是页面应用,那么该页面对应的参数通过ParameterInceptor传入到Action关联的模型中取了,要么是Property-Driven,要么是Model-Driven的对象。在ActionContext中应该总是可以取到的。这个是ActionContext怎么将环境的输入转换为与环境无关的Map的过程:) 我应该理解没错吧:) 楼主的疑惑无非是在action执行完毕后 在action内部的数据怎么拿出来的 嗯,正是。谢谢你看得这么仔细 答案是通过OgnlValueStack 拿com.opensymphony.webwork.views.jsp.PropertyTag 举例子 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那个类就清楚了 |
|
返回顶楼 | |
发表时间:2006-11-07
可能是我没有说清楚 OgnlValueStack在这里的作用有点像翻译 或者叫代理
其实数据从一开始就一直乖乖的待在action里面 只不过进出都通过OgnlValueStack而已 数据进出都通过讲一种叫做ognl的语言来put和get 这样action不用学习什么外语就可以干自己的话 是不是很解藕阿.. 给你看段代码吧 随便写个action 这是它的execute方法 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")); |
|
返回顶楼 | |
发表时间:2006-11-07
哈哈,懂了懂了。如果按照这个思路的话,Action的执行结果应该也放在Action里头,然后通过OgnlValueStack将这个值给取出来就OK.
下面的是示意代码,不知道是否是这样? 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")); jzk 写道 可能是我没有说清楚 OgnlValueStack在这里的作用有点像翻译 或者叫代理
其实数据从一开始就一直乖乖的待在action里面 只不过进出都通过OgnlValueStack而已 数据进出都通过讲一种叫做ognl的语言来put和get 这样action不用学习什么外语就可以干自己的话 是不是很解藕阿.. 给你看段代码吧 随便写个action 这是它的execute方法 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")); |
|
返回顶楼 | |
发表时间:2006-11-07
webwork那么做有点一箭双雕的味道 既使用了ognl方便读取 又让action跟数据结构 脱离web container 至于你的框架要怎么做可以自己衡量di
|
|
返回顶楼 | |
发表时间:2006-11-07
Webwork和XWork倒是结合得非常好,这个确实要赞一个,比Struts要好多了。
但是,我觉得作为Command pattern framework,并且是具备良好可扩展性的框架来说,XWork稍微有点重,还要依赖OGNL并且还需要配置xwork.xml 呵呵,满口胡说啦:) |
|
返回顶楼 | |
发表时间:2006-11-09
怎么会存在Action里面?当然是放在ActionContext里面了,这个Map放在ThreadLocal里面,所以在Action的生命周期中都可以访问,这样才真的把Xwork和Webwork分开的。Webwork在ActionContext放上了Request、Reponse、ValueStack。ActionInvocation是根据配置产生的Action类,如果和Spring结合它就是一个春节的getBean()获取来的pojo,然后它在你的ActionContext里面执行,返回一个String。如果在WebWork里面,它的前端控制器会控制这个流程,然后根据返回的String寻找对应的Result,而Result类型等都是单独配置的。所以这样才坐到了完整的分离,非常清晰。
如果想看清楚工作过程可以参考FilterDispather。 |
|
返回顶楼 | |
发表时间:2006-11-09
所有的Param的操作都在ValueStack中完成,Action本身也在ValueStack里面。所以说在Action里面也没有错。不过ValueStack是放在ActionContext里面的线程安全的变量。
|
|
返回顶楼 | |