struts2之实现原理
2015-07-17 15:37
211 查看
首先还是贴上一张官方的struts2工作原理图吧。如下:
![](http://img.blog.csdn.net/20140530165433234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuZXIwNTE1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
那接下来就来谈一下struts2 框架的调用流程。
①. 当Servlet 容器接收到一个请求后,将请求交给你在 web.xml 文件中配置的Filter中,然后调用它的doFilter()方法。
②. Filter 询问 ActionMapper,以便确定这个请求是否有对应的Action调用。
③. ActionMapper 返回一个描述了 action调用的 ActionMapper对象。
④.
Filter 调用Dispatcher 类的serveraction()方法。
⑤.
Dispatcher 调用ActionProxy 的execute()方法。
⑥.
ActionProxy 设置ActionInvocation 对象的执行上下文,然后调用其invoke()方法。
⑦.
ActionInvocation 的invoke()方法从拦截器映射中查找尚未执行的拦截器,调用它的intercept(invocation)方法,并将自身对象的引用作为参数传递给拦截器。
⑧.
拦截器完成某些预处理工作后,反过来调用ActionInvocation 的invoke()方法。ActionInvocation 为了维护自己的状态,所以它知道哪些拦截器已经被拦截,如果还有没执行的拦截器,那就继续执行它的intercept(invocation)方法。
⑨.
直到所有的拦截器都已经执行,就调用action 实例的execute()方法。(不过也得看在struts.xml中是否使用了动态方法调用或者通过method属性配置要调用Action中的方法,如果没有使用前面那两种,则调用execute()方法)。
⑩.
然后ActionInvocation 会根据action 执行返回的结果码,也就是一串字符串,查找struts.xml中对应name为结果码的Result,再调用Result的execute(invocation)方法,将结果页面呈现给用户。
⑪.
当ActionInvocation 的invoke()方法将控制权返回给拦截器映射中的最后一个拦截器时,该拦截器就会完成所有必需的后期处理工作,然后从 intercept(invocation)方法返回,允许前一个拦截器执行自己的后期工作。如此反复,直到所有的拦截器都成功返回。
⑫.
ActionInvocation 的invoke() 方法执行完毕后,想ActionProxy 返回一个String 类型的结果码,最后,ActionProxy清理状态并返回。
至此,struts2 的工作流程就基本是这样了。
那接下来就来谈一下struts2 框架的调用流程。
①. 当Servlet 容器接收到一个请求后,将请求交给你在 web.xml 文件中配置的Filter中,然后调用它的doFilter()方法。
②. Filter 询问 ActionMapper,以便确定这个请求是否有对应的Action调用。
③. ActionMapper 返回一个描述了 action调用的 ActionMapper对象。
④.
Filter 调用Dispatcher 类的serveraction()方法。
⑤.
Dispatcher 调用ActionProxy 的execute()方法。
⑥.
ActionProxy 设置ActionInvocation 对象的执行上下文,然后调用其invoke()方法。
⑦.
ActionInvocation 的invoke()方法从拦截器映射中查找尚未执行的拦截器,调用它的intercept(invocation)方法,并将自身对象的引用作为参数传递给拦截器。
⑧.
拦截器完成某些预处理工作后,反过来调用ActionInvocation 的invoke()方法。ActionInvocation 为了维护自己的状态,所以它知道哪些拦截器已经被拦截,如果还有没执行的拦截器,那就继续执行它的intercept(invocation)方法。
⑨.
直到所有的拦截器都已经执行,就调用action 实例的execute()方法。(不过也得看在struts.xml中是否使用了动态方法调用或者通过method属性配置要调用Action中的方法,如果没有使用前面那两种,则调用execute()方法)。
⑩.
然后ActionInvocation 会根据action 执行返回的结果码,也就是一串字符串,查找struts.xml中对应name为结果码的Result,再调用Result的execute(invocation)方法,将结果页面呈现给用户。
⑪.
当ActionInvocation 的invoke()方法将控制权返回给拦截器映射中的最后一个拦截器时,该拦截器就会完成所有必需的后期处理工作,然后从 intercept(invocation)方法返回,允许前一个拦截器执行自己的后期工作。如此反复,直到所有的拦截器都成功返回。
⑫.
ActionInvocation 的invoke() 方法执行完毕后,想ActionProxy 返回一个String 类型的结果码,最后,ActionProxy清理状态并返回。
至此,struts2 的工作流程就基本是这样了。
相关文章推荐
- SpringMVC 通过注解进行参数注入
- JAVA 中Arrays类简单介绍
- Eclipse中修改SVN用户名和密码方法
- Java 学习笔记14:Spring 数据库数据源DBCP配置说明
- 在Java中调用带参数的存储过程
- Java 内存分配全面浅析
- mac java开发环境配置
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
- 聊聊高并发(四十一)解析java.util.concurrent各个组件(十七) 任务的异步执行和状态控制
- java数学归纳法非递归求斐波那契数列的方法
- JAVA 继承与组合
- java中List的排序功能的实现
- Hibernate 报错:this project is not a myeclipse hibernate project . assuming hibernate 3 cap
- spring注入时bean的set方法为什么不能是static类型?
- java 利用系统WinRAR解压缩(zip/rar压缩文件)
- 改进Spring中的分页技术
- 关于java解压缩文件(rar或者zip)的实现示例
- Java编程中“为了性能”需做的26件事
- eclipse快捷键及各种设置
- Spring MVC项目的构建过程