Struts2的工作原理及流程

现在市面上一直在对比Spring MVC和Struts2,说Sping MVC完胜Struts2,但是目前好多项目也在使用struts2,各有各的好处吧,技多不压身,而且学框架就是学思想,融会贯通,在对比中学习,才会发现相通之处(不过…当然能会有点乱,可能就学混了,比如笔者就曾在springmvc配置文件里写出了action标签…尴尬)。下面就来说下struts2的整个流程。

官方路线----上图

struts
在说struts流程之前,我想先引入一下servlet,在我们之前原生态的servlet中,客户端发送http请求过来,是直接由web容器中的servlet接受,而在我们使用了Struts2框架后,会有一个FilterDispatcher的核心过滤器进行接管(为什么叫核心,因为在这个过滤器之前还有很多其他的过滤器,这个等会会说到),而这个核心过滤器的实现类就是StrutsPrepareAndExecuteFilter,旧版本是FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.,StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.!

  • 图示中各颜色区域所示意义:
    橙色(Servlet Filters):一系列用来处理http请求的过滤器;
    蓝色 (Struts core):struts2业务处理的核心部分;
    绿色 (Interpectors):拦截器这是struts2的基石,提供了很多默认拦截器,这些拦截器在struts2的核心包下(struts2-core-2.5.20jar)的struts-defalut.xml中已经定义,我们只需正确引用就行了。
    黄色 (User Created):用户自己创建的,包括action,struts.xml,jsp

运行流程

1、 客户端发送Http请求,由web容器接受,通过web.xml中配置,经过一层层过滤器链,找到核心过滤器(StrutsPrepareAndExecuteFilter这是Controller的调度中心,因为是处理的是前端发来的请求,有时候也叫做前端控制器)。
2、 FilterDispatcher作为最后一个过滤器,会停止过滤后续的内容,filterDispatcher会将请求转发给ActionMapper,他的作用就是来判断客户端发来的请求struts2这边有没有相应的action来处理,或者是需不需要对其进行处理(因为并不是有了struts2就非得用filterDispatcher来接管,之前的servler仍然适用
3、 ActionMapping对象是用来存放ActionMapper(默认DefaultActionMapper)解析后得到的name,nameSpace,method,extension,params,result ,这些数据返回到FilterDispatcher, 如果ActionMapper通过url请求找到相应的处理类,则会告诉FilterDispatcher是用struts2进行处理,

下面是ActionMpper的源码

public interface ActionMapper {
ActionMapping getMapping(HttpServletRequest var1, ConfigurationManager var2);

ActionMapping getMappingFromActionName(String var1);

String getUriFromActionMapping(ActionMapping var1);

}

4、 创建ActionProxy == 由StrutsPrepareAndExecuteFilter调用dispatcher类的serviceAction== 创建, proxy意为代理,所以他其实有的权利只是告诉下面的构件去做什么,他并不会做,他拿到的信息只是url信息,而我们都知道url对应的action配置存放在struts.xml中,而只有ConfigurationManager能读取里面的信息,并加载到内存中,所以结合url请求,就可以创建ActionInvocation*对象了。
5、 ActionInvocation对象是 最最 核心的构件,因为他包含了action和所有拦截器的引用,进程调度的控制权全由他来控制。然后就是拦截器–>action -->reslut–>拦截器的顺序执行。
6、 ActionInvocation对象执行完毕后,得到响应对象(HttpServletResponse)向客户端展示出响应的结果。

另外补充一下 filter 和interceptor的简单区别:
filter是过滤所有请求,而interceptor只是拦截action;
两者都是对请求先后进行处理(递归).

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值