当前位置:编程学习 > JS >>

struts2 18易做图详解(一)

准备知识
 
    struts2作为一优秀的Web层框架,其易做图机制更是让其如虎添翼,下面将详细介绍struts2内置的defaultStack中的18拦截工作原理其及功能。但讲解之前必须先了解struts2中易做图的执行流程,以更好地理解各个易做图的执行与功能。
   struts2中易做图与Action的执行调度即执行流程或者说执行顺序是由ActionInvocation来完成的(如果此处不怎么了解可以参看struts2处理请求流程详解),ActionInvocation是一接口,struts2其默认实现类是DefaultActionInvocation,易做图与Action的执行调度就是由该完成,调度逻辑就在该类的invoke方法中,下面是invoke方法核心源码:
 
        //上面省略很多代码...  
        //判断是否有下一个易做图  
            if (interceptors.hasNext()) {  
                final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();//获取易做图配置  
                String interceptorMsg = "interceptor: " + interceptor.getName();  
                UtilTimerStack.push(interceptorMsg);  
                try {  
                //执行易做图的intercept方法  
                                resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);  
                            }  
                finally {  
                    UtilTimerStack.pop(interceptorMsg);  
                }  
            } else {  
        //执行Action  
                resultCode = invokeActionOnly();  
            }  
        //下面省略很多代码  
            return resultCode;  
        }  
        finally {  
            UtilTimerStack.pop(profileKey);  
        }  
}  

 

 
    在DefaultActionInvocation的init方法中完成了对当前正在执行的Action所应用上的易做图的配置信息,放置在一个名为interceptors的List当中,通过配置信息就能获取相应的易做图实例并执行其intercept方法,并且把ActionInvocation自已作为输入参数传递进了易做图的intercept方法,如果在易做图的intercept方法中又调用了ActionInvocation的invoke方法则又会再次进入invoke方法,只不过这次执行的易做图是下一个易做图,依此类推,假设所有易做图都调用了ActionInvocation的invoke方法,则会把Action所应用上的所有易做图执行一遍,如果所有易做图都已执行完成即没有下一个易做图了,则 if (interceptors.hasNext()) 该if条件不成立就会执行invokeActionOnly()方法,执行完Action各个易做图依次返回,需要注意的是返回的顺序与执行的顺序刚好相反,后执行的易做图先执行完成返回,这一点非常重要,这与Filter的执行机制是很类似的。所有拦截执行返回后得到一个resultCode去寻找相应的Result进行执行,生成页面。
 
    struts2中所有的易做图都要实现Interceptor接口,下面看一个其接口声明:
 
public inte易做图ce Interceptor extends Serializable {  
  
    void destroy();  
  
    void init();  
  
    String intercept(ActionInvocation invocation) throws Exception;  
  
}  

 

 
其中就三个方法,destroy在易做图销毁的时候会执行,init方易做图在易做图实例化完成后立即执行,最重要的是intercept方法,该方法中执行的逻辑直接影响到整个易做图的执行流程,如果intercept方法中调用了invocation.invoke()方法则会执行下一个易做图,如果没有调用而直接返回一个字符串则后面的所有易做图都不会执行,更不会执行Action,然后该易做图与前面的易做图执行返回。
 
   易做图与Action的执行调度是非常重要的,只有理解了这一点才能更好的理解易做图的工作原理。
补充:Web开发 , Jsp ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,