当前位置: 代码迷 >> Web前端 >> Struts2 拦截器实施原理
  详细解决方案

Struts2 拦截器实施原理

热度:138   发布时间:2012-09-19 13:43:54.0
Struts2 拦截器执行原理
1.向服务器发送一个请求,struts2会将会通过责任链模式将多个拦截器连接起来一个个执行,接着执行目标Action,再反向执行拦截器代码,将结果返回到界面

struts2实现代码说明:
DefaultActionInvocation.java

public String invoke() throws Exception {
  String profileKey = "invoke: ";
  try {
    UtilTimerStack.push(profileKey);
    if (executed) {
      throw new IllegalStateException("Action has already executed");
     }
     //interceptors中保存所有配置的拦截器,通过迭代取出每一个拦截器
     if (interceptors.hasNext()) {
       final InterceptorMapping interceptor = 
         (InterceptorMapping) interceptors.next();
        String interceptorMsg = "interceptor: " + interceptor.getName();
        UtilTimerStack.push(interceptorMsg);
        try {
          resultCode = interceptor.getInterceptor()
                         .intercept(DefaultActionInvocation.this);
        }
          finally
        {
           UtilTimerStack.pop(interceptorMsg);
        }
       }
         //如果拦截器已经执行完成,则执行Action(目标) 
         else 
       {
           resultCode = invokeActionOnly();
        }

            // this is needed because the result will be executed, then control will return to the Interceptor, which will
            // return above and flow through again
            if (!executed) {
                if (preResultListeners != null) {
                    for (Object preResultListener : preResultListeners) {
                        PreResultListener listener = (PreResultListener) preResultListener;

                        String _profileKey = "preResultListener: ";
                        try {
                            UtilTimerStack.push(_profileKey);
                            listener.beforeResult(this, resultCode);
                        }
                        finally {
                            UtilTimerStack.pop(_profileKey);
                        }
                    }
                }

                // now execute the result, if we're supposed to
                if (proxy.getExecuteResult()) {
                    executeResult();
                }

                executed = true;
            }

            return resultCode;
        }
        finally {
            UtilTimerStack.pop(profileKey);
        }
    }

  相关解决方案