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