锁定老帖子 主题:Xwork才是核心
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-04
1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的),仔细来看,这所有的优点都是在Xwork这个框架中实现的,所以我觉得对于Xwork的流程的充分的了解才是WebWork精髓.前两天看了看Xwork的源码,胡乱写了点东西,希望有空了能够把剩下的完善的写出来,也希望大家就此问题多多讨论
WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-03-18
拥护。
个人认为,webwork只是在xwork上面加了一些web相关的组件,核心还是xwork。 |
|
返回顶楼 | |
发表时间: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属性填充 前几天随手写的,上次忘了贴出来了 |
|
返回顶楼 | |
发表时间:2005-03-20
如何填充action中的相关属性 :
在action的执行过程中会将action实例push进ognlvaluestack中的root区域,然后将所有的参数extramap包括以前设置的ognlvaluestack全都放到ognlvaluestack的contentmap里面,至于设置action的属性,是利用parameterInteceptor拦截器中的setValue(),这个方法最终调用的是OGNL的语法setValue,也就是在利用contentMap中的内容来设置root区域的对象属性. |
|
返回顶楼 | |
发表时间:2005-04-10
是的,他关于对象属性的填充的关键还是OGNL,不过前一段一直忽略了他的另一项功能就是Type Conversion,好像这个功能可以把他对于对象属性填充的功能近乎完美的完成,改天有空一定要仔细看看
|
|
返回顶楼 | |
发表时间:2005-06-14
apache有类似的项目:commons chain。
|
|
返回顶楼 | |
发表时间:2005-06-14
rootsoso 写道 WebWork为什么大家都是是比Struts强?我自己想大致是以下几点:1,耦合度小,便于测试 2,业务代码比较好的脱离了servlet容器 3,线程安全?(WebWork自己的说明文档上这么写的),仔细来看,这所有的优点都是在Xwork这个框架中实现的,所以我觉得对于Xwork的流程的充分的了解才是WebWork精髓.前两天看了看Xwork的源码,胡乱写了点东西,希望有空了能够把剩下的完善的写出来,也希望大家就此问题多多讨论
Struts是page controller模式,webwork是front controller模式。我前几天在哪里看到这两个模式的比较来着,一时想不起了,回头找到贴上来。 |
|
返回顶楼 | |
发表时间:2005-06-14
http://www.microsoft.com/china/community/Column/93.mspx
领悟Web设计模式 |
|
返回顶楼 | |
发表时间: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。再有就是状态机的结构,常见根据处理结果进行页面间跳转就是这种结构。了解了这几种结构,许多开源框架剩下的就是具体如何应用了。 |
|
返回顶楼 | |
发表时间: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等等 每一样功能都会让你拍手叫绝,不禁感叹它的精巧和灵活。 二、可维护性。 代码少了,耦合度小了,结构清晰了,灵活性增加了,可维护性不就提高了吗? |
|
返回顶楼 | |