Struts2中Action及拦截器的执行

下午临时有点时间,一直以来有个想法,那就是sstruts2要深入熟悉一下。于是趁这个时间,找来源码,重点看了action的初始化及调用执行。

怕看过后就忘掉,特此记下来。有的地方可能理解的不对,待哪一天有机会真正理解透彻了,再过来看过,更正。

struts2中,通过web容器请求一个action,经过系统的Fileter,Struts2的ActionMapping及FilterDispatcher后,来到ActionProxy(一般执行struts2默认的ActionProxy,即DefaultActionProxy):

1 . ActionProxy首先执行其prepare方法,做一些准备工作。

  • 读取action的配置(配置文件已被初始化到内存,此时到内存中读?)

  • 从action配置中获取要访问的action的方法名

  • 调用ActionInvocation(如无例外,一般是默认的ActionInvocation,即DefaultActionInvocation)的init方法,init方法使用action名称,利用类加载器新建一个action实例(从这里可以看出struts2 中的action是多例的),action可以事先通过spring容器加载到内存。然后通过配置读取所有的拦截器存储到此ActionInvocation拦截器List当中,DefaultActionInvocation#init, 410~411行:

f.jpg

2 . 执行ActionInvocation的invoke方法,从ActionInvocation的拦截器列表判断有没有拦截器要执行,如果有,则执行拦截器的intercept方法,由于拦截器的intercept方法会继续调用ActionInvocation的invoke方法,然后invoke继续从拦截器列表中读取并调用下一个拦截器的intercept,因此此逻辑是一个拦截器的递归调用,等最后一个拦截器执行invoke时,action才得的真正执行,执行后根据执行结果的配置,返回结果代码(error,success,或其他在result节点中配置的结果),action执行完后,最后一个拦截器的intercept方法在调用invoke后继续执行完,然后是倒数第二个拦截器在intercept方法的invoke后执行完,即递归的执行逻辑:执行流依次出栈继续执行。

这里附上ActionInvocation的invoke方法执行拦截器的主体代码:
DefaultActionInvocation#invoke, 243~255行

Struts2中Action及拦截器的执行_第1张图片
f2.jpg

3 . 写了一个模拟struts2中action及拦截器执行的例子 ,点这里查看

你可能感兴趣的:(Struts2中Action及拦截器的执行)