一、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的源码分析,主要是执行了哪些方法,以文字的方式进行了描述。
struts2源码分析总结 是我在网上找到的关于源码讲解比较深刻的资料总结。对于研究struts2源码很有价值。
唉,咋下载东西都要积分呢,没办法了,只能逼着我要一分了,自己写的笔记,研究了源码,不过不太深入,大致思路还是对的
包含struts2.0源码,对源码有深厚研究的可以下载瞧瞧
这是官方原版最新版本2.3.20版本的源码 对于那些喜欢以后要从事web开发的童鞋绝对不要错过啊 研究源码的看起来牛!!!
Struts2 jar 整合包 及部分核心源码 内包含了与spring整合jar包即struts2-spring-plugin-2.0.14.jar 包含了struts-2.0.14-src.zip、ognl_src.zip、xwork-2.0.7-src.zip3个源码,方便广大源码爱好者研究。
struts 源码,可以直接导入eclipse 的,非常好,可以研究struts 的原理·
Struts 2.1.6源码 要好好研究的
此资源内置了hibernate3.3,struts2.1,spring2.5等ssh框架的详细源码,适合初学者和想深入研究ssh框架的人员。
struts新闻系统源码,学习JSP和struts的可以研究研究
Struts 1.2源码,想研究的下下来看看哈
这是用Struts写的登录 供初学者学习,感谢大家的支持
网上商城系统 Hibernate Java JSP Struts Spring 源码+数据库+完整论文 可以直接运行的 只提供学习研究哦.....
struts2+xwork的源代码调试项目,包含简单的demo项目。次项目可直接导入eclispe、部署在服务器上要加入servlet-api.jar包的支持,此项目为研究源代码者提供,这也是个人好长时间自己探索出来的,希望大家努力。...
Jboss7上+maven搭建struts2+spring3+hibernate3完整能运行工程源码,在tomcat7上运行也成功测试了,注意:我工程文件是用myeclipse2013开发的,你需要导入自己ide的时候,会有兼容性问题:最好阁下是自己新建一个maven...
基于struts的bbs网站源码,提供给想要学习研究struts的朋友们。
构建struts2框架必备源码,希望对大家研究struts2底层机制起到帮助!
struts2框架源码 本人最近在研究s2sh源码,如有需要请留言。 在使用过程中如果有问题可联系,让我们开始学习s2sh源码总动员吧!
基于struts+hibernate的物业管理系统,提供源码,供大家分析和研究。希望大家提供修改意见。
struts+spring+hibernate纯源码,整理过的,不是官方的带有一堆例子的project,只有源代码。文件大小:struts2只有1.03M,srping只有3.3M,hibernate只有2.2M。想研究ssh源码的朋友可以拿去。