`

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中了,如何做到的。

非常疑惑。我特别想将请求参数和输出结果分开,搞不懂。
分享到:
评论
11 楼 Tin 2006-11-09  
引用
所有的Param的操作都在ValueStack中完成,Action本身也在ValueStack里面。所以说在Action里面也没有错。不过ValueStack是放在ActionContext里面的线程安全的变量。

这种说法我不同意。因为这只是双向引用。问题在于Xwork是command模式。Action作为command是处理ActionContext的,ValueStack只是ActionContext的一部分。应该首先弄清楚一下WebWork的调用过程
10 楼 downpour 2006-11-09  
hiwzg 写道
Webwork和XWork倒是结合得非常好,这个确实要赞一个,比Struts要好多了。

但是,我觉得作为Command pattern framework,并且是具备良好可扩展性的框架来说,XWork稍微有点重,还要依赖OGNL并且还需要配置xwork.xml

呵呵,满口胡说啦:)


XWork依赖的包已经很少了,OGNL也不是Web依赖的,这点我觉得还是可以容忍的吧。至于说道配置文件,xwork.xml已经够少的了,现在哪个框架不是配置一堆?呵呵
9 楼 downpour 2006-11-09  
所有的Param的操作都在ValueStack中完成,Action本身也在ValueStack里面。所以说在Action里面也没有错。不过ValueStack是放在ActionContext里面的线程安全的变量。
8 楼 Tin 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。
7 楼 hiwzg 2006-11-07  
Webwork和XWork倒是结合得非常好,这个确实要赞一个,比Struts要好多了。

但是,我觉得作为Command pattern framework,并且是具备良好可扩展性的框架来说,XWork稍微有点重,还要依赖OGNL并且还需要配置xwork.xml

呵呵,满口胡说啦:)
6 楼 jzk 2006-11-07  
webwork那么做有点一箭双雕的味道 既使用了ognl方便读取 又让action跟数据结构 脱离web container 至于你的框架要怎么做可以自己衡量di
5 楼 hiwzg 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"));




4 楼 jzk 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"));




3 楼 hiwzg 2006-11-07  
jzk 写道
输入输出参数都保存在action里面

如果是页面上来的数据 一般通过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那个类就清楚了
[b][/b][b][b]
2 楼 jzk 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那个类就清楚了
1 楼 youcai 2006-11-07  
action本身就带着参数。

相关推荐

    XWork绕过安全限制执行任意命令漏洞补丁

    XWork是一个命令模式框架,用于支持Struts 2及其他应用。 XWork处理用户请求参数数据时存在漏洞,远程攻击者可以利用此漏洞在系统上执行任意命令。 Struts2中WebWork框架使用XWork基于HTTP参数名执行操作和调用,...

    jdf.rar_基于xwork框架

    **标题:“jdf.rar_基于xwork框架”** **描述:**这个压缩包“jdf.rar”包含了一个名为“jdf”的门户...深入研究这个框架的源代码将有助于提升对Java企业级开发的理解,特别是对于XWork、Spring和MVC模式的实际运用。

    xwork-2.1.5-all.rar_xwork_xwork-2.1.5_xwork-2.1.5.jar_xwork-core

    《XWork 2.1.5:Web框架的核心组件与应用》 XWork是一个Java Web开发中的关键框架,它的核心在于提供了一套强大的动作处理机制和业务逻辑支持。在描述中提到的“xwork-2.1.5-all”是一个包含XWork所有组件的综合包...

    xwork官网源码 下载 xwork

    XWork是一个强大的Action框架,它为Java Web应用程序提供了模型-视图-控制器(MVC)模式的支持。这个框架的主要目标是简化企业级应用的开发,提高代码的可维护性和可扩展性。在本篇文章中,我们将深入探讨XWork的...

    xwork

    标题 "xwork" 暗示我们关注的是一个与软件框架或库相关的概念,特别是它在Java企业级开发中的应用。XWork是一个历史悠久的开源项目,它是Struts 1框架的核心部分,负责处理Action的执行逻辑。Struts是Apache软件基金...

    xwork帮助文档

    - 设计模式的应用:了解如何在XWork中有效地应用设计模式,如工厂模式、单例模式等,可以提升代码质量。 - 性能调优策略:学习如何配置和优化XWork以适应高并发场景。 通过这份“最新文档”,开发者不仅可以掌握...

    完整的xwork源代码

    2. **命令模式**:XWork采用了命令模式的设计,Action就像一个命令对象,接收请求并执行相应的业务逻辑。这种设计模式有助于实现职责分离,提高代码的可维护性。 3. **拦截器(Interceptor)**:拦截器是XWork的一...

    OGNL和XWORK源代码

    2. **命令模式**:XWork采用了命令模式设计,每个Action对应一个业务操作。 3. **拦截器(Interceptor)**:XWork的拦截器链允许在Action执行前后插入自定义逻辑,如日志记录、事务管理、权限检查等。 4. **工作流...

    xwork源码及文档

    XWork的设计理念是基于“命令模式”,即每个HTTP请求都被映射到一个特定的Action,这个Action负责处理请求并返回结果。XWork通过ActionContext来管理请求和响应的数据,提供了一种统一的上下文环境。此外,它还引入...

    xwork-2.1.6 doc文档

    XWork 是 Struts 2 框架的核心组件之一,它提供了一种强大的动作处理机制,包括事务管理、异常处理和类型转换等功能。XWork 2.1.6 版本的 doc 文档包含了详细的 API 参考、用户指南和开发者信息,帮助开发者深入理解...

    xwork各版本的jar包

    xwork-1.1.1.jar, xwork-1.1.jar, xwork-1.2.1.jar, xwork-1.2.3.jar, xwork-2.0.0.jar, xwork-2.0.1.jar, xwork-2.0.3.jar, xwork-2.0.4.jar, xwork-2.0.5.jar, xwork-2.0.6.jar, xwork-2.0.7.jar, xwork-2.1.0.jar...

    xwork-src

    《深入解析xwork-src:揭示Web应用开发的强大框架》 在Web应用开发的世界里,xWork框架是一个不可或缺的工具,其源代码库“xwork-src”为我们提供了深入了解这个框架内部运作机制的机会。本文将深入探讨xwork-src的...

    xwork源文件及文档

    XWork提供了一种强大的、可扩展的、基于事件驱动的模型-视图-控制器(MVC)设计模式实现,支持拦截器和类型转换等关键功能。在深入理解XWork之前,我们首先要了解它与Struts2的关系。 **一、XWork与Struts2的关系**...

    xwork2.1.2源码与xwork2.2.1源码

    《深入解析xwork 2.x源码:从2.1.2到2.2.1的演进》 xwork作为一个强大的Action框架,是Struts2的...通过深入学习xwork源码,开发者可以更好地掌握MVC设计模式,理解Web应用的控制层实现,从而在实践中发挥更大的效能。

    xwork-2.0.7jar

    《深入解析xwork-2.0.7:框架与源码探索》 xwork-2.0.7是一个重要的Java框架,它在Web应用开发领域扮演着不可或缺的角色。本篇文章将详细探讨xwork的核心功能、设计理念以及如何通过其源码进行深入学习。 一、...

    JavaEE源代码 xwork-2.0.4

    JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源代码 xwork-2.0.4JavaEE源...

    OpenSymphony公司的xwork资源包

    这个资源包的核心是XWork框架,它是Struts2框架的基础,旨在提供一种灵活且可扩展的方式来管理应用程序的行为。在Java开发领域,XWork因其强大的功能和易用性而受到广泛欢迎。 XWork框架的主要功能包括动作调度、...

    xwork-2.0.5-src

    《深入剖析Struts2核心组件:XWork框架2.0.5源码解析》 在Java Web开发领域,Struts2作为一款强大的MVC框架,因其灵活、易用的特性深受开发者喜爱。其中,XWork框架是Struts2的核心组成部分,负责处理动作执行和...

    xWork2.1.2源代码下载

    xWork是一个广泛使用的Java框架,主要用于构建企业级应用,它强调业务逻辑的控制层,帮助开发者实现MVC(Model-View-Controller)设计模式。这份源代码能够帮助开发者深入理解xWork的工作原理,提升开发效率,并进行...

    Xwork源代码源文件下载

    1. **Action与Command模式**:Xwork基于设计模式中的Command模式,实现了Action接口,Action是业务逻辑的载体,接收并处理来自用户请求的数据。 2. **OGNL(Object-Graph Navigation Language)**:Xwork使用OGNL...

Global site tag (gtag.js) - Google Analytics