一、Struts2容器初始化过程
1> 创建Dispatcher对象
a> 将ServletContext设置到Dispatcher中
b> 读取default.properties,struts-default.xml,struts-plugin.xml,struts.xml等配置文件
c> 获取创建Container全局容器,在此期间会解析配置文件并创建xml文件中配置的Bean
d> 使用ContainerHolder的静态方法将Container实例放入ThreadLocal中
e> 初始化一些全局配置,比如是否为开发模式等
f> 将Dispatcher对象放入Container全局容器中
2> 创建PrepareOperations和ExecuteOperations两个对象并将Dispatcher放入其中,之后doFilter会用到这两个对象
二、Struts2插件机制
介绍一下ObjectFactory类,它是创建对象的工厂,这些对象包括Action对象、结果类型、拦截器、验证器、类型转换器等。可以在struts.xml中配置
<bean type="com.opensymphony.xwork2.ObjectFactory" name="smallbug" class="cn.smallbug.struts2.action.SmallbugFactory" /> <constant name="struts.objectFactory" value="smallbug" />
SmallbugFactory是ObjectFactory的子类,以此来修改默认的对象工厂,spring插件也是配置这个参数达到了整合Struts2的目的。之所以可以这样做是因为在Struts2容器中很多地方都是调用了ObjectFactory的buildXxx方法来获取实例的。在运行时如果你给它配置了不同的子类,那么如何创建Action就有你来决定了。想使用某种工具直接可以将它的jar包放到部署目录下就ok,不想用直接取走,连配置文件都不用该极其灵活。这种灵活度的实现也得益于struts-default.xml,struts-plugin.xml,struts.xml配置文件的依次加载,出现重复的话后者覆盖前者。
三、Action核心流程(过滤器匹配成功时触发)
1> PrepareOperations对象设置结果集
2> PrepareOperations对象创建ActionContext
a> Dispatcher获取ValueStackFactory的实例然后创建ValueStack
b> 将request,request.getParameterMap(),session,servletContext分别封装成map
c> 将上述所有Map放入一个大Map中以它们的名字作为key
d> 获取ValueStack中名为context的Map,将上述大Map以putAll的方式添加进context中
e> 创建一个ActionContext对象将ValueStack添加进去
3> 调用Dispatcher的静态setInstance方法,将Dispatcher实例放入ThreadLocal中
4> 将Request对象包装为StrutsRequestWrapper对象,其作用在于如果request域中找不到的属性会去stack中找
5> 根据request,response创建mapping映射对象
6> 使用ExecuteOperations执行目标方法
a> 创建代理Action
-> createAction(contextMap);创建Action:调用ObjectFactory中的buildAction方法创建action
-> stack.push(action);把action放入到了栈顶
-> 获取拦截器
b> proxy.execute()执行代理方法,按照顺序的方式执行:
-> 拦截器
-> 执行action
-> 执行结果集
-> 如果拦截器的返回形式不是return invocation.invoke方法,则按照倒叙的方式执行
c> 清空数据
四、拦截器调用原理
首先是代理对象触发ActionInvocation实例的invoke方法,拦截器开始执行。ActionInvocation中有一个Iterator<InterceptorMapping>数据结构,保存着要依次执行的拦截器。看一下调用代码
if (interceptors.hasNext()) { final InterceptorMapping interceptor = interceptors.next(); String interceptorMsg = "interceptor: " + interceptor.getName(); UtilTimerStack.push(interceptorMsg); try { resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this); } finally { UtilTimerStack.pop(interceptorMsg); } } else { resultCode = invokeActionOnly(); }
它其实是把自己的实例作为参数传了下去,这时候拦截器链上的节点执行会有两种情况
1> return invocation.invoke();它会在执行完自己的逻辑之后返回ActionInvocation之后不再执行。
2> invocation.invoke();//之后还有逻辑,它会在执行完自己的逻辑之后返回ActionInvocation,在ActionInvocation的逻辑执行完之后还会执行自己剩余的部分的逻辑。
相关推荐
Struts2 源码分析主要涉及其在Tomcat启动过程中的初始化步骤以及请求处理流程。首先,我们来看Tomcat启动时Struts2框架如何准备和执行。 在Tomcat启动时,Struts2的Filter文件被加载,具体是`...
在深入研究Struts2源码时,我们可以关注以下几个关键组件: - **StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,负责初始化Struts2框架并处理所有的HTTP请求。 - **ActionContext**:存储了请求期间...
导入源码后,你可以开始深入研究Struts 2的核心组件和工作流程: 1. **Action类**:在Struts 2中,Action类是处理用户请求的核心。开发者通常需要继承`org.apache.struts.action.Action`或`...
Struts2是一个流行的Java Web框架,它简化了MVC(模型-视图-控制器)架构的实现。本文将深入探讨Struts2的...通过深入研究Struts2的源码,我们可以发现其内部工作原理,这对于解决复杂问题和开发自定义插件非常有帮助。
通过对Struts2源码的深入研究,开发者可以更好地理解其内部工作原理,从而优化应用性能,解决实际问题,以及设计出更符合框架精神的代码结构。同时,这也为面试中展示自己的技术深度和问题解决能力提供了有力的支持...
本项目源码提供了一个基础的Struts2应用程序实例,对于初学者来说,这是一个很好的学习资源,可以深入理解Struts2的工作原理和架构。 Struts2的核心组件包括: 1. **Action类**:Action类是业务逻辑的载体,它是...
2. **Eclipse关联Struts2源码** 在Eclipse中关联Struts2.1.8源码,可以帮助开发者更好地理解和调试代码。步骤包括: - 下载Struts2.1.8的源码包。 - 在Eclipse中,右键点击项目,选择"Build Path" -> "Configure ...
在深入研究Struts2源码时,我们可以关注以下几个关键部分: 1. **org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter**:这是Struts2的核心过滤器,它初始化并调用Struts2的生命周期。 2. **...
深入研究Struts 2的源码,我们可以学习到: - 如何实现MVC模式并进行请求处理。 - 拦截器的设计模式及其应用场景。 - 如何通过配置文件定制框架行为。 - 视图层模板语言的使用和实现原理。 - 插件系统的工作方式和...
Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache...通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。
深入研究Struts2源码有助于提升对Java Web开发的理解,尤其是对于MVC框架的设计思想、AOP(面向切面编程)的应用以及依赖注入等方面有深刻认识。同时,源码学习也能帮助你更好地定位和解决问题,提高开发效率。
此压缩包文件包含的是Struts2的源码,特别适合初学者研究和学习,其中涵盖了拦截器和验证等关键组件的实现。 首先,我们来深入了解Struts2的核心概念: 1. **Action类**:在Struts2中,业务逻辑通常由Action类执行...
Struts2是一个强大的Java web开发框架,用于构建可维护、可扩展且结构良好的应用程序。它提供了MVC(Model-View-...通过深入研究这些示例,开发者可以更好地理解和掌握Struts2框架,从而更高效地开发Java web应用。
这个源码包是Struts2的2.3.20版本,官方的最新版本,对于想要深入理解Struts2工作原理、优化代码或自定义行为的开发者来说,研究源码是非常有价值的。 首先,Struts2的核心组件包括Action、Interceptor、Result和...
总之,通过这本书的源码学习,你不仅可以系统地掌握Struts2的框架原理,还能积累实际开发经验,提升Java Web开发技能。在实践中不断探索和理解,将使你对Struts2有更深的认识,为后续的项目开发打下坚实的基础。
深入研究源码,开发者可以了解到Struts2的请求处理流程,包括ActionInvocation、Interceptor Stack、Result执行等关键组件的工作方式。通过阅读源码,可以更好地理解如如何定义和实现自定义拦截器、如何处理异常、...
Struts2是一个基于MVC(Model-View-...在研究struts-2.2.1.1 src这个源码包时,可以关注各个主要组件的实现,如Action、Interceptor、ValueStack等,以及配置解析和请求处理流程,这对于提高Java Web开发技能大有裨益。
在实际开发中,理解和研究源码可以帮助解决框架使用中的问题,定制化开发,以及避免框架的潜在风险,例如著名的Struts2的安全漏洞。 总的来说,Struts2源码的学习涵盖了Java Web开发中的许多重要概念和技术,包括...
通过对这些关键组件的深入理解和代码研究,开发者可以更好地掌握Struts2框架,提高应用的可维护性和扩展性。在实际项目中,合理利用Struts2提供的特性,如Interceptor,可以大大提高代码的复用性和模块化程度,从而...
下面,我们将深入探讨Struts2的核心概念、源码分析以及如何利用它来创建实际的案例。 首先,Struts2的架构基于Action和Result的设计模式,Action是业务逻辑的载体,Result则是处理Action执行后展示结果的方式。这种...