struts2.0的工作原理

struts2.0的工作原理? 


  

1).客户端发出一个指向servlet容器的请求(tomcat);
2).这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3).过滤器FilterDispatcher是struts2框架的心脏。在web容器启动时,struts2框架会自动加载配置文件里相关参数,
并转换成相应的类。在请求过程中所有的对象(Action,Results等)都是通过ObjectFactory来创建的。过滤器会通过询
问ActionMapper类来查找请求中需要用到的Action。
4).如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。
ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5).ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action
的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6).ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有
Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程
前后,涉及到相关拦截器(intercepetor)的调用。
7). 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是
(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。

请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。
        ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。

2. Struts2部分类介绍
这部分从Struts2参考文档中翻译就可以了。
ActionMapper
        ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs\actionmapper.html。
ActionProxy&ActionInvocation
        Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
        ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

3. Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行
5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现,不知道其它还有什么方式

 

 

二、struts2标签分类:
1.表单UI标签
2.非表单UI标签
3.控制标签
4.数据标签


三、为什么使用struts2?

struts2.0的优点?
1).Struts2基于MVC架构,框架结构清晰,关注点绝大部分是在如何实现业务逻辑上,开发过程十分清晰明了。
2).使用OGNL进行参数传递,可以方便的获取RequestAttributeApplicationSessionParameters中的数据。大大简化
了开发人员在获取这些数据时的代码量。
3).强大的拦截器
4).易于扩展的插件机制,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以
实现扩展。