Struts2初级教程04 Struts2架构剖析

来源:互联网 发布:网络上 蛤是啥意思 编辑:程序博客网 时间:2024/06/15 23:18

一.XWork2 Struts2 的基础

XWork提供了很多核心功能:
1.IOC(Inversion of Control)控件反转.
2.强大的表达式语言.
3.数据类型转换.
4.Xwork框架的概念  Action    interceprot拦截器     result   .
Struts2扩展了这些基础实现,用于支持Web应用程序的开发.


二.Struts2的体系结构

初始请求 --> servlet容器 -->  (这个请求被传递给一个过滤器链,如果用SiteMesh过滤器中包括了ActionContextCleanUp) -->org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter (它轮询ActionMapper以确定这个请求是否调用一个Action )     如果调用Action  --> ActionProxy(建立一个ActionInvocation)  -->    ActionInvocation在调用Action之前会座次调用所有配置的拦截器. -->  Action执行返回   -->  ActionInvocation查找result对应的结果码执行结果码  .-->    顺序相反在返回给用户.(如设置ActionContextCleanUp过滤器,StrutsPrepareAndExecuteFilter 不会清理ThreadLocal中的ActionContext信息,相反...)


1.ActionMapper     ActionMapping
org.apache.struts2.dispatcher.mapper.ActionMapper       interface
org.apache.struts2.dispatcher.mapper.ActionMapping     class
ActionMapper的接口在HTTP请求的action调用请求之间提供了一个映射.当给HTTP请求时,ActonMapper根据请求URI来找对应的action,如果有返回一个描述了action调用的ActionMapping,没有找到返回null.

2.ActionProxy   ActionInvocation
ActionProxy在XWork和Action之间充当代理,在通过框架执行不是直接操作对象,所可以封装拦截器,result等额外的代码.
ActionPoxy持有ActionInvocation对象.ActionInvocation代表了action执行的当前状态,它持有拦截器,action实例,结果码到result的映射,ActionContext.
Struts对ActionPorxy有默认的实现org.apache.struts2.impl.StrutsActonProxy类继承自com.opensymphony.xwork2.DefaultActionProxy.
Struts对ActionInvocation默认实现com.opensymphony.xwork2.DefaultActionInvocation.


3.ActionContext
ActionContext是action执行上下文,包括session ,application, parameters, locale.等 .
ActionContext的内容由org.apache.struts2.dispatcher.Dispatcher在创建ActionProxy前设置,并封装到一个Map对象extraContext中,通过参数传递给ActionProxyFactory.createActionProxy()方法。
ActionContext是线程本地的,这样每个线程都是唯一的,安全.com.opensymphony.xwork2.ActionContext.


4.ObjectFactory
com.opensymphony.xwork2.ObjectFactory,构建核心对象拦截器,action,result.
定制ObjectFactory必须直接或间接继承com.opensymphony.xwork2.ObjectFactory类,有一个默认无参构造方法
注册自己的Object,在CLASSPATH根目录下创建struts.properties 
内容:
struts.objectFactory = com.你自己的类名

5.result
com.opensymphony.xwork2.Result接口代码action执行后的结果 .返回类型为String ,与struts.xml进行对应 .
Result实现包括:Servlet转发, Servlet重定向, Velocity模板输出, FreeMarker模板输出, JasperReports(可生成PDF,CSV,XML),XSTL渲染,ActionChainResult(当前action到另一个action链式处理)



三.Struts2框架的调用流程

1.当Servlet容器接收到一个请求后,将请求交给你在web.xml文件中配置的过滤器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter .调用它的doFilter()方法.
2.StrutsPrepareAndExecuteFilter 询问ActonMapper以便确定这个请求是否对应action调用 .
3.ActionMapper返回一个描述了action调用的ActionMapping对象.
4.FilterDispatcher  -->  Dispathcer.ServiceAction()方法
5.Dispatcher --> ActionProxy.execute()方法
6.ActionProxy设置ActionInvocation对象的执行上下文-->invoke()方法
7.ActionInvocation.invoke()方法从拦截器映射中找未执行的拦截器,调用intercept(invocation)方法,将自身为引用参数传递.
8.拦截器完成后,返回来调用ActionInvocation.invoke()方法.ActionInvocation维护自己的状态.所以它自己哪些拦截器已经执行了.如果没有执行完,就继续执行intercept(invocation)方法.

9.如果拦截器全部执行完成,就调用action.execute()方法(如果在struts.xm文件中没有设置成其它方法)
10.ActionINvocation根据action返回结果码,调用Result.execute(invocation)方法,将结果返回.
11.ActionInvocation.invoke()方法将控制权返回给最后一个拦截器,完成所有必要的工作,然后从intercept(invocation)方法返回.
12.ActionInvocation.invoke()方法执行完毕后,向ActionProxy返回一个String类型的结果码,ActionProxy清理状态并返回...