首页 > 代码库 > struts2工作原理
struts2工作原理
[组成]Struts2框架的一些组成部分
1、ActionMapper和ActionMapping
org.apache.struts2.dispatcher.mapper.ActionMapper接口在HTTP请求和action调用请求之间提供一个映射。当给定一个HTTP请求时,ActionMapper根据请求的URI查找是否有对应的action,如果有,返回一个描述action调用的ActionMapping;如果没有,返回null。
ActionMapping本质上是一个数据传输对象,它将action类和要执行的方法的详细资料手机在一起。
2、ActionProxy和ActionInvocation
ActionProxy在XWork和真正的action之间充当代理角色,在通过框架执行action的过程中,因为是使用代理而不是直接操作对象,所以可以在代理中封装拦截器、result等额外代码。
ActionProxy持有ActionInvocation对象。ActionInvocation代表了action执行的当前状态。它持有拦截器(按顺序排列)、Action实例、结果映射(从结果吗到Result实例的映射)和ActionContext。
3、ActionContext
ActionContext是action执行的上下文。每一个上下文都相当于一个action执行所需的一组对象的容器,例如session、application、parameters、locale等。
ActionContext是线程本地的,这意味着在ActionContext中存储的值对于每个线程都是唯一的。所以对于某个action,如果要从ActionContext中获得数据,不需要担心线程安全的问题。
ActionContext的完整类名是com.opensymphony.xwork2.ActionContext。
4、ObjectFactory
com.opensymphony.xwork2.ObjectFactory负责构建核心的框架对象(拦截器、action、result等)。用户可以注册自己的ObjectFactory实现来控制这些对象的实例化。
你可以把ObjectFactory看成Struts2框架中一个专门负责创建对象的工厂,从这个工厂类派生的子类可以采用不同的方式来实例化对象。利用Struts2框架未ObjectFactory赋予的这种职责,通过提供ObjectFactory的自定义实现,可以很容易把框架和IoC容器(如Spring、Pico、Plexus等)集成在一起。
5、result
com.opensymphony.xwork2.Result接口代表action执行后的结果。每一个action执行都返回一个String类型的结果码,用于从配置的result元素列表中选择对应的result。result在Struts.xml文件中的配置
[原理]Struts2框架的工作原理
struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说
struts2是struts1和Webwork结合的产物。
struts2 的工作原理图:
一个请求在Struts2框架中的处理分为以下几个步骤:
1.客户端发出一个指向servlet容器的请求(tomcat);
2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2
的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一
些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,
Interceptors,等)都是通过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的模版。在表
示的过程中可以使用Struts2 框架中继承的标签。