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

struts2 工作原理,流程

2014-06-15 23:38 218 查看
一.Struts2工作流程总览

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

工作过程如图:



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

二.Struts2工作过流程细节

1.FilterDispatcher如何调用动作?

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



2.拦截器相关知识。

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



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

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

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

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

如TimerInterceptor的intercept()方法:

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;
}

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

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

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

总结拦截器:

作用有3:

1.做一些预处理。

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

3.做一个后加工。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: