您的位置:首页 > 编程语言 > Java开发

Struts2工作原理解说

2014-04-01 15:25 260 查看
  1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
  2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
  3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
  4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
  5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
  6、ActionProxy创建一个ActionInvocation的实例。
  7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。
本人综合理解如下:

客户端初始化一个指向servlet容器的请求,我们一般就是tomcat。这个请求会经过一些列的过滤器,接着fileDispatcher被调用。这里讲一下filterDispatcher,实际上filterDispatcher他不仅实现了file接口还实现了StrutsStatice这个接口,这个接口并没有定义业务方法,只定义了若干个常量。Struts2对常用的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。FileterDispatcher这个类一共有4个作用1、执行Action。2、清理ActionContext,避免内存泄露。3、处理静态内容。4、为请求启动xwork’s的拦截器链。当用户向Struts发送请求时,FilterDispatcher的doFilter()方法自动调用,这个方法很关键,Struts2对请求的对像进行了重新包装。接着下面的讲filterDispatcher被调用后它会询问ActionMapper来决定这个请求是否要调用某个Action,ActionMapper会根据请求对地址进行解析,首先它会获取URI(请求路径如:testAction.action或testAction!method)然后删除URI中的扩展名(默认扩展名为action),接着解析出name和nameSpace,如果URI格式形式如testAction!Method那么就会提取左边部分作为Action名称,右边部分作为Method名称,否则的话就会判断这不是一个action请求会另作处理。这样就将action名称解析出来了,如果这是一个Action请求的话,ActionMapper决定调用某个Action,FilterDispatcher就会把请求的处理交给ActionProxy,然后ActionProxy就会找到struts.xml的配置文件,找到后会创建一个valueStack对象,这个valueStack是一个值栈,它贯穿了整个struts的生命周期。为什么struts2的类通过属性就可以获取到所有相关的值,要完成这个功能很大程度上就是依赖于valueStack对象。当struts2接收到一个.action的请求后,会先建立一个Action类对象的实例,但并不调会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点,只不过这个时候所有属性都是默认的值,例如String默认为null,int默认为0。在处理完上述共工作后,struts2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后就会调用Action类的Action方法,在调用Action方法之前,会先将ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。从上面的描述来看就会很容易明白,在struts2的Action类可以获取与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params获得Action的配置参数的拦截器是stationParam等。在这些拦截器内部读取相应的值,并更新valueStack对象的顶层节点的相应属性的值,而valueStack对象就像是一个传送带,将属性值从一个拦截器传到另一个拦截器,最后传回Action对像,并将ValueStack对象中的属性的终值赋给Action类中相应的属性。

一小段总结:

浏览器发送请求过来,前端控制器收到请求后根据struts.xml配置文件查找对应的action,找到后创建一个valueStack对象,该对象中包含一个root栈和一个map集合。将查找到的action实例化后将对象保存在root栈顶中。然后运行层层拦截器的代码,将结果return出去交给result去比较选择对应的jsp或action。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: