论坛首页 Java企业应用论坛

Xwork才是核心

浏览 11814 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-04  
WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的),仔细来看,这所有的优点都是在Xwork这个框架中实现的,所以我觉得对于Xwork的流程的充分的了解才是WebWork精髓.前两天看了看Xwork的源码,胡乱写了点东西,希望有空了能够把剩下的完善的写出来,也希望大家就此问题多多讨论
   发表时间:2005-03-18  
拥护。
个人认为,webwork只是在xwork上面加了一些web相关的组件,核心还是xwork。
0 请登录后投票
   发表时间:2005-03-19  
再webwork2.1中
Xwork中关于actiom最终调用的代码依次为DefaultActionProxy.execute();->DefaultActionInvocation.invokeAction(Action action,ActionConfig actionConfig);->接着是在这个过程中出现如下代码
Method method = actionConfig.getMethod(action.getClass(););;
return (String); method.invoke(action, new Object[0]);;
在actionConfig的getMethod();函数中获得一个method变量,因为在这个函数中默认取得名为execute的过程来取得一个Mehtod类,调用这个变量来执行最根本的action中的execute();函数.

ActionProxy
ActionProxy.execute();函数执行相应的action的执行方法.


ActionInvocation
本身含有相应的contextMap,在本身的构造函数中有一个creatContext();函数,用来创建context
            stack = new OgnlValueStack();;

            // create the action context
            contextMap = stack.getContext();;
在这个函数中首先看构造函数中的map—extraContext不为空而且含有extraContext.containsKey(ActionContext.VALUE_STACK这个值的话就在在这个值中取得一个
stack = (OgnlValueStack); extraContext.get(ActionContext.VALUE_STACK);;
然后利用
if (extraContext != null); {
            contextMap.putAll(extraContext);;
        }
实现把额外的map拷贝到context中的目的
在ActionInvocation中有OgnlValueStack stack;


实现拦截器
在DefaultActionInvocation的invoke函数中实现了拦截器的实现.
        if (interceptors.hasNext();); {
            Interceptor interceptor = (Interceptor); interceptors.next();;
            resultCode = interceptor.intercept(this);;
        } else {
            resultCode = invokeAction(getAction();, proxy.getConfig(););;
        }
在ActionInvocation的创造函数中有如下函数
        this.proxy = proxy;
        this.extraContext = extraContext;
        this.pushAction = pushAction;
        init();;
而在init();中
        Map contextMap = createContextMap();;

        createAction();;

        if (pushAction); {
            stack.push(action);;
        }

        invocationContext = new ActionContext(contextMap);;
        invocationContext.setName(proxy.getActionName(););;

        List interceptorList = new ArrayList(proxy.getConfig();.getInterceptors(););;
        interceptors = interceptorList.iterator();;



ActionContext分析
类里面有一个静态的TheadLocal actionContext属性.
static ThreadLocal actionContext = new ActionContextThreadLocal();;
ActionContext有一个创造函数ActionContext(Map map);,可以使用一个Map类作为ActionContext的构造参数. ActionContext.setContext(context);可以使用一个ActionContext作为参数,在这个函数中
actionContext.set(context);;
使用TheadLocal的set(Object o);函数.在ActionContext.getContext();函数中
        ActionContext context = (ActionContext); actionContext.get();;

        if (context == null); {
            OgnlValueStack vs = new OgnlValueStack();;
            context = new ActionContext(vs.getContext(););;
            setContext(context);;
        }

        return context;
疑问:
在action的执行中有的参数是bean的相应属性,但是在execute();中这些属性没有被指出来了,按照框架的本意来说是在action的执行中被actionProxy自动填充了.

如何填充action中的相关属性

OgnlValueStack负责相关的bean属性的填充.它把一个bean推进自己的pool里面后好像是利用了一些ongl的东西来把相关的bean属性填充


前几天随手写的,上次忘了贴出来了
0 请登录后投票
   发表时间:2005-03-20  
如何填充action中的相关属性 :

     在action的执行过程中会将action实例push进ognlvaluestack中的root区域,然后将所有的参数extramap包括以前设置的ognlvaluestack全都放到ognlvaluestack的contentmap里面,至于设置action的属性,是利用parameterInteceptor拦截器中的setValue(),这个方法最终调用的是OGNL的语法setValue,也就是在利用contentMap中的内容来设置root区域的对象属性.
0 请登录后投票
   发表时间:2005-04-10  
是的,他关于对象属性的填充的关键还是OGNL,不过前一段一直忽略了他的另一项功能就是Type Conversion,好像这个功能可以把他对于对象属性填充的功能近乎完美的完成,改天有空一定要仔细看看
0 请登录后投票
   发表时间:2005-06-14  
apache有类似的项目:commons chain。
0 请登录后投票
   发表时间:2005-06-14  
rootsoso 写道
WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的),仔细来看,这所有的优点都是在Xwork这个框架中实现的,所以我觉得对于Xwork的流程的充分的了解才是WebWork精髓.前两天看了看Xwork的源码,胡乱写了点东西,希望有空了能够把剩下的完善的写出来,也希望大家就此问题多多讨论

Struts是page controller模式,webwork是front controller模式。我前几天在哪里看到这两个模式的比较来着,一时想不起了,回头找到贴上来。
0 请登录后投票
   发表时间:2005-06-14  
http://www.microsoft.com/china/community/Column/93.mspx
领悟Web设计模式
0 请登录后投票
   发表时间:2005-06-14  
去年在项目准备期研究过XWork,当时是为了找到一个Interceptor的解决方案。下面是我的学习笔记。
Hello, XWork Interceptor

rootsoso 写道
WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的),仔细来看,这所有的优点都是在Xwork这个框架中实现的,所以我觉得对于Xwork的流程的充分的了解才是WebWork精髓.前两天看了看Xwork的源码,胡乱写了点东西,希望有空了能够把剩下的完善的写出来,也希望大家就此问题多多讨论

1、2两点是一回事,3是因为它每次处理一个请求都会创建一个Context容纳请求的内容,而不是重用已有的Context。

3月份上海BEA User Group时,我曾经介绍过一些服务端应用开发常见手法,讲到Interceptor时,就曾经拿XWork说事,它主要是便于透明的添加服务。还有是管理的一个结构,对服务进行统一的管理,例子是Servlet。再有就是状态机的结构,常见根据处理结果进行页面间跳转就是这种结构。了解了这几种结构,许多开源框架剩下的就是具体如何应用了。
0 请登录后投票
   发表时间:2005-06-14  
rootsoso 写道
WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:[color=red]1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的)[/color

其实,这3点感觉还是比较虚。提高开发效率和可维护性,才是正道。

一、提高开发效率。
1、无需额外的FormBean(相对Struts)
2、强大的EL,可以方便存取任意复杂的对象结构
3、灵活的Interceptor
4、多模块的支持、验证、类型转化、多种视图等。
5、在很快的2.2版本中,提供ide、AJAX支持、Portal等等

每一样功能都会让你拍手叫绝,不禁感叹它的精巧和灵活。

二、可维护性。
代码少了,耦合度小了,结构清晰了,灵活性增加了,可维护性不就提高了吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics