struts2 工作原理,流程

一.Struts2工作流程总览

      Struts2遵循MVC模式,即模型(action),视图(view),控制器(FilterDispatcher)。

工作过程如图:

即首先是Web客户端浏览器发送HTTP请求,该请求经过struts2中的控制器FilterDispatcher,该FilterDispatcher决定调用哪个Action来响应这个请求,在Action对请求处理完后,返回一个字符串,选择一个视图返回给Web客户端浏览器。


二.Struts2工作过流程细节

1.FilterDispatcher如何调用动作?

        FilterDispatcher首先会询问ActionMapper来决定这个HTTP请求是否需要响应某个动作。当ActionMapper决定需要调用某个动作,FilterDispatcher就会把控制交给ActionProxyActionProxy就会询问框架的配置文件,找到需要调用的Action类。接着,ActionProxy创建一个ActionInvocation实例,把拦截器和Action类依次加入到其中。并且由框架依次调用。如图:


2.拦截器相关知识。

    其中,在模型Action的前前后后,会有很多的拦截器为Action对数据进行预处理和后加工。FilterDispatcher不会直接一开始就调用Action,而是先调用拦截器,如图所示:

当调用一个动作之前,首先要调用拦截器,动作执行完后,也需要调用拦截器。

原理:首先我们引入一个ActionInvocation类,当框架收到一个请求时,它首先决定这个URL 映射到哪个动作,这个动作的一个实例会被加入到一个新创建的ActionInvocation的  实 例中,接着,框架询问声明性构架(XML,或者Java注解),以发现哪些拦截器应该被 触发,以及按照什么顺序触发。指向这些拦截器的引用也被加入到ActionInvocation中。 这样,ActionInvocation中就包含了一系列的东西:拦截器---Action---拦截器。如上图。

触发拦截器:ActionInvocation公开了Invoke()方法,框架调用这个方法开始执行动作。它通 过调用拦截器的intercept()方法,把控制交给第一个拦截器,并开始执行。重要的是,intercept()方法把ActionInvocation实例作为一个参数。在拦截器的处理过程中,它会继续调用ActionInvocationinvoke()方法来继续调用后续的拦截器,这样,就能达到一个递归的作用。

拦截器的强大之处在于能够改变工作流。Action会返回一个字符串来决定回调什么视图给客户端。拦截器同样可以返回一个字符串决定回调什么视图给客户。总而言之,Action能不能得到执行的机会,拦截器说了算。

TimerInterceptorintercept()方法:

Public String intercept(ActionInvocation invocation) throws Exception
{
  Long startTime = System.currentTimeMillis();//1
  String result = invocation.invoke();//2
  Long executeTime = System.currentTimeMills - startTime;//3
  ......
  Return result;
}

对于注释1intercept()方法调用时,拦截器的预处理阶段包括记录开始时间。

对于注释2:然后把控制转交给下一个拦截器。

对于注释3:后加工阶段包括计算时间。(注意:Action不一定会执行,完全有可能由更深 层次的拦截器没有调用invoke()方法,而是自己返回一个控制字符串,从而改变工作流。 这也说明了Action是不一定有机会能够执行的。)


总结拦截器:

作用有3

1.做一些预处理。

2.决定是否要改变工作流。(通过调用invoke()方法将控制转移给后续的拦截器,最后直到动作,或者通过返回一个控制字符串中断执行。)

3.做一个后加工。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值