- 浏览: 131101 次
- 性别:
文章分类
最新评论
-
seacow2008:
同1楼,深入浅出
Java并发编程(二) CountDownLatch -
Mojarra:
java0000wa 写道不能搞得通俗易懂一点? demo S ...
fastupload 0.6.0发布 -
java0000wa:
不能搞得通俗易懂一点? demo Spring jar包都少了 ...
fastupload 0.6.0发布 -
Mojarra:
tegger 写道不好意思设置字符编码解决了,还是挺好用的,不 ...
fastupload 0.6.0发布 -
tegger:
不好意思设置字符编码解决了,还是挺好用的,不错
fastupload 0.6.0发布
在第一篇中,花了主要篇幅探讨了MVC框架中对于编写Model层的约定,约定的目的是为了在Action类中进行自动装配,那么,struts2是如何自动装配Model Bean呢?在阅读struts2的源代码之前,不烦先做几个假设,带着这几个假设去看代码,效率高很多。
- 当Action类的实例被创建的时候,该实例中的Model Bean也一起被装配
- 当Action类的 实例 execute方法被执行之前,该 实例中的Model Bean被装配
- 当ActionProxy类的 实例 execute方法执行时,被代理的Action实例中的Model Bean被装配
至于struts2是不是采用上述三种假设中的一个,符合不符合假设并不重要,重要的是找到了正确的结果。本文探讨的源码基于struts 2.3.4这个最新的发行版本。在探讨的过程中,仍然聚焦在Model层的处理,不详细描述每个细节(其实,以我对struts2框架的了解水平,显然是不可能的 )。
struts 2.3.4以StrutsPrepareAndExecuteFilter作为整个框架处理Request的接入点,从名字可以看出来,它是一个Filter(它真是一个Filter),在init方法中,读取了struts的配置文件,并且创建了Dispatcher、PrepareOperations和ExecuteOperations这三个重要的对象,其中Dispatcher是派发request给代理的工具类,很多实际的功能由这个类完成。
public void init(FilterConfig filterConfig) throws ServletException { InitOperations init = new InitOperations(); try { // FilterHostConfig其实是FilterConfig类的Wrapper,具有功能性的方法都是通过调用FilterConfig的相应方法实现的,主要的关注方法是 //getServletContext()和getInitParameter() FilterHostConfig config = new FilterHostConfig(filterConfig); init.initLogging(config); Dispatcher dispatcher = init.initDispatcher(config); //通过调用此方法,载入struts2框架需要用到配置文件,并创建Dispatcher对象, //Dispatcher是struts2框架中调度的最上层工具类 init.initStaticContentLoader(config, dispatcher); //创建prepare和execute这两个顶层对象 prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); //被排除执行的action配置 this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); postInit(dispatcher, filterConfig); } finally { init.cleanup(); } }
如果深入的说这个init方法,非要结合strut的配置文件和xwork具有迷你型的DI功能的容器来讨论,上面的只是惊鸿一瞥的把这个复杂载入配置文件的过程带过。
介绍完init方法,再来看一下doFilter方法,这个方法只有20几行代码,这20几行代码就把一个Action对象给执行了(执行前的N个步骤省略....),简洁至极。回到这里所关心的问题,什么时候Action的Model Bean被装配了,仔细的看看这20几行代码,实在是很高深,根本看不出跟装配Model Bean有什么直接关系。猜猜吧,执行装配工作的地方可能存在与这第3、8、16这三行代码之中。
try { prepare.setEncodingAndLocale(request, response); //设置字符集编码和本地化 prepare.createActionContext(request, response); //创建ActionContext prepare.assignDispatcherToThread(); if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) { //如果excludes的,直接交给WEB容器处理 chain.doFilter(request, response); } else { request = prepare.wrapRequest(request); //包装HttpServletRequest类,根据content-type来决定是MultiPartRequestWrapper类,还是StrutsRequestWrapper, ActionMapping mapping = prepare.findActionMapping(request, response, true); //根据request和配置文件,找到一个对应的Action类的ActionMapping对象 if (mapping == null) { boolean handled = execute.executeStaticResourceRequest(request, response); if (!handled) { chain.doFilter(request, response); //只执行静态资源请求后,仍然交给WEB容器 } } else { execute.executeAction(request, response, mapping); //执行action } } } finally { prepare.cleanupRequest(request); //清除在执行Action过程之前向request写入的内容,设置actionContext, invocationContext为null,如果是multipart/form-data请求,清除生产的临时文件。 }
先看第3行,创建ActionContext对象。所谓ActionContext代表了框架处理Action时的上下文,包含了很多数据,主要包括action名,默认的值栈,具有抽象意义的SessionMap,ParameterMap,ApplicationMap, Local,ActionInvocation,Container。ActionContext实例被包装在ThreadLocal对象内,是线程安全的,很多框架也采用ThreadLocal解决多线程并发问题。
下面关键的代码显示,struts框架内,先通过x-work容器创建初始的OnglValueStack对象,此时,OnglValueStack对象是不包含任何和Model层所用的数据,prepare.createActionContext通过调用Dispatcher.createContextMap(...)方法创建的上面列出的map大对象,并且把这些map对象再放到extraContext这个“大”Map对象中去,注意,放的过程中,用到了strut框架里默认的值栈名(key),这些名字取数据的时候会再次用到。
Dispatcher.createContextMap(...)方法其实是struts2框架中Model层预处理的核心部分,有兴趣的读者可以推敲推敲其中的代码。
ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack(); stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext)); ctx = new ActionContext(stack.getContext());
Map<String,Object> extraContext = createContextMap(requestMap, params, session, application, request, response, context);
是不是struts框架非常偏爱Map这个类?这是框架使用了Ongl处理request参数的情形下合理选择。
通过阅读这些代码,我们发现,这个时候Action实例还没有被创建,因此不可能会出现装配的Model Bean的情形。但是,这个时候ActionContext已经具备了和Reqeust脱离的条件,也即在框架下一层的处理中,对于数据上的需要,操作的重点对象不再是Request对象,而是ActionContext对象。
[本文系作者原创,如若转载,请注明出处,新浪微博:@仪山湖]
发表评论
-
Fastupload 0.6.1 发布
2014-03-03 09:44 15650.6.1版本主要修复了JQuery-form提交ajax请 ... -
fastupload 0.6.0发布
2013-06-23 18:24 1779Fastupload 0.6.0完善或者新增加的功能有: ... -
uProfiler使用指南
2013-06-13 14:43 1556简介: uProfiler Community是面向主题 ... -
uProfiler Community 1.0发布
2013-06-08 09:39 1992uProfiler Community 1.0是面 ... -
fastupload-springmvc 0.5.5发布
2013-04-15 21:55 2005fastupload-springmvc是利用f ... -
Fastupload 0.5.3发布
2013-01-05 19:55 997相对于以往的版本,fastupload 0.5.3做出了明 ... -
fastupload已发布至maven中心库
2012-11-29 09:44 1029为了让大家更方便的使用fastupload开源项目,fastu ... -
白话MVC(五)初窥Spring MVC
2012-11-22 21:17 2259在 为 struts2 项 目写完 fastuplo ... -
Fastupload 0.4.7发布,支持struts2
2012-10-28 20:56 1759Fastupload 0.4.7这个版本中主要增加了支持str ... -
白话MVC(四)为Struts2编写文件上传插件
2012-10-28 20:47 3179Struts2中,在Dispatcher.java ... -
Fastupload 0.4.2发布
2012-10-19 12:05 1544更新:fastupload 0.4.2支 ... -
fastupload召集开源开发志愿者
2012-10-11 19:57 98fastupload开源项目自发布0.3.5版本后,文件上传的 ... -
白话MVC(三)Struts2拦截器巧妙装配Model Bean
2012-10-12 18:02 2038白话MVC(二) 在Struts的过滤器中,经过调用Prep ... -
白话MVC(一)Model的产生及处理
2012-09-29 00:36 34663白话MVC(二) 最近在带一“徒弟”,领悟能力很高,对我 ... -
fastupload API开发快速上手
2012-09-01 16:36 2897fastupload提供两种从multipart/form-d ... -
文件上传的秘密(五)0.31版本功能基本完备
2012-08-26 21:15 1399fastupload 0.31版本上周已经发布,因为工作的关系 ... -
fastupload 0.3.1发布
2012-08-21 15:25 1730fastupload根据RFC 1867文档 ... -
开源项目fastupload 0.2.3发布
2012-07-06 17:19 2004fastupload 0.2.3发布,增加了对sub-boun ... -
文件上传的秘密(四)大小限制与进度
2012-05-28 14:27 8411RFC1867规范中,对表单上传文件的大小和进度都没有作出规定 ... -
文件上传的秘密(三)性能和稳定性上的衡量
2012-05-19 22:42 2924文件上传的秘密系列之一, http://mojarra.ite ...
相关推荐
Struts2是一个强大的Java web应用程序框架,它基于Model-View-Controller(MVC)设计模式,简化了开发过程。ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph ...
Struts2是一个流行的Java Web应用程序框架,用于构建和维护MVC(模型-视图-控制器)架构的应用。在本文中,我们将深入探讨Struts2版本2.1.6中的核心jar包以及如何调整`web.xml`配置文件以实现正确部署。 首先,...
可解决java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/Object;)Ljava/lang/Object; java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils struts2.1.8...
Struts2是一个流行的Java web应用程序框架,用于构建和维护可扩展、高效且易于维护的MVC(模型-视图-控制器)架构的应用程序。它的核心是基于Action和Result的设计模式,提供了一种组织业务逻辑和表示层的方式。在这...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架,它的目标是简化开发并提供更强大的控制层。XWork则是Struts2的基础,它处理请求、调度Action、执行业务逻辑,并与用户界面进行交互。 1...
在Struts2中,用户通过浏览器发送的请求首先被FilterDispatcher处理,然后根据配置找到对应的Action类,接着ActionProxy通过调用ActionInvocation来执行Action类。Action类执行完后,ActionInvocation会根据结果来...
Struts2是一个流行的Java web框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。"struts2对Ognl...
《Struts.2权威指南——基于WebWork核心的MVC开发》是一本深入解析Struts.2框架的经典著作,旨在帮助开发者全面理解并熟练掌握基于WebWork核心的模型视图控制器(Model-View-Controller,简称MVC)架构在Web应用开发...
3. **xwork-core.jar**:XWork是Struts2的基础,它提供了许多基础组件,如ActionContext、ObjectFactory等。 4. **ognl.jar**:Object-Graph Navigation Language,用于对象属性的获取和设置,以及表达式语言的支持...
Struts2是一个非常流行的Java Web开发框架,它基于MVC设计模式,用于构建高效、可扩展的企业级应用程序。然而,Struts2默认并不直接支持AJAX(Asynchronous JavaScript and XML)技术,因为AJAX主要用于创建动态、...
Struts2是一个非常流行的Java Web框架,用于构建可维护性和可扩展性良好的企业级应用程序。在Web应用中,为了确保数据传输的安全性,通常会使用HTTPS协议,它基于SSL/TLS来加密通信,保护用户的隐私信息。Struts2...
Struts2是一个开源的MVC(Model-View-Controller)框架,用于构建高效、可扩展的Web应用程序。这个版本号2.0.12表明它是2009年发布的,属于Struts2的早期版本,但依然包含了许多基础和关键的功能。 **1. MVC架构** ...
象,如HttpServletRequest、HttpServletResponse,或者需要访问Session和Application等信息,在Struts2框架中,我们可以利用ActionContext和ServletActionContext这两个类。ActionContext是Struts2提供的一个核心上...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web框架,由Apache软件基金会维护。在深入理解`struts2-core-2.3.7`源码之前,我们先概述一下Struts2的基本概念和核心组件。 1. **Action**: Struts2...
这本书的前三个章节主要涵盖了Struts2的基础知识,WebWork的核心机制以及如何构建基于MVC模式的Web应用程序。 首先,我们来探讨一下MVC(Model-View-Controller)设计模式。MVC是一种用于分离业务逻辑、数据模型与...
在Struts2的ActionContext中,OGNL查找值栈(ValueStack),这是一个存储所有请求相关对象的数据结构。值栈顶部的对象通常为Action实例,OGNL表达式会在此对象及其关联的对象图中查找属性。 Struts2的标签库也广泛...
Struts2是一个非常著名的Java Web框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性极强的Web应用的强大工具。在"struts2-blank-2.0.14"版本中,`lib`目录下的jar包是整个...
2. **xwork-core.jar**: 提供了ActionContext、ObjectFactory、Container接口等XWork框架的基础组件,它是Struts2的基础。 3. **ognl.jar**: Object-Graph Navigation Language,用于表达式语言,支持在Action、...
Struts2是Apache软件基金会的开源项目,它是在Struts1的基础上发展起来的,提供了一种模型-视图-控制器(MVC)架构模式,旨在简化Java Web应用的开发。Struts2框架整合了许多其他优秀框架的功能,如Freemarker和...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛使用,特别是在构建大型企业级应用时。Struts2提供了强大的功能,如动作调度、拦截器、结果类型、插件扩展等,以...