struts2 18拦截器详解(四)
ServletConfigInterceptor
ServletConfigInterceptor拦截器处理defaultStack第三的位置,可以说这个拦截器是18拦截器中逻辑最简单的一个,就是给Action提供一种获取运行参数的一种方式,如果request,session,application,通过该拦截器,只要Action实现相应的接口就可以获得这些对象。
下面是该拦截器intercept方法源码:
public String intercept(ActionInvocation invocation) throws Exception { final Object action = invocation.getAction();//获取当前正在执行的Action final ActionContext context = invocation.getInvocationContext();//获取ActionContext对象//判断当前Action是否实现了ServletRequestAware接口 if (action instanceof ServletRequestAware) { //如果实现了则将HttpServletRequest对象通过Action的setServletRequest传递给Action HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); ((ServletRequestAware) action).setServletRequest(request); }//与上同理 if (action instanceof ServletResponseAware) { HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE); ((ServletResponseAware) action).setServletResponse(response); }//与上同理 if (action instanceof ParameterAware) { ((ParameterAware) action).setParameters((Map)context.getParameters()); }//与上同理 if (action instanceof ApplicationAware) { ((ApplicationAware) action).setApplication(context.getApplication()); } //与上同理 if (action instanceof SessionAware) { ((SessionAware) action).setSession(context.getSession()); } //与上同理,只不过这里传递的是Map类型的request对象 if (action instanceof RequestAware) { ((RequestAware) action).setRequest((Map) context.get("request")); }//与上同理 if (action instanceof PrincipalAware) { HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); if(request != null) { // We are in servtlet environment, so principal information resides in HttpServletRequest ((PrincipalAware) action).setPrincipalProxy(new ServletPrincipalProxy(request)); } } //与上同理 if (action instanceof ServletContextAware) { ServletContext servletContext = (ServletContext) context.get(SERVLET_CONTEXT); ((ServletContextAware) action).setServletContext(servletContext); } return invocation.invoke();//调用下一个拦截器 }