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

struts2 18易做图详解(四)

ServletConfigInterceptor
 
   ServletConfigInterceptor易做图处理defaultStack第三的位置,可以说这个易做图是18易做图中逻辑最简单的一个,就是给Action提供一种获取运行参数的一种方式,如果request,session,application,通过该易做图,只要Action实现相应的接口就可以获得这些对象。
下面是该易做图intercept方法源码:
[java] 
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();//调用下一个易做图  
    }  
 
   在ActionContext对象中,即能获取HttpServletRequest对象,也能获取struts2根据HttpServletRequest对象生成的Map对象(如果对这个不大清楚请参看struts2处理请求流程详解),所以在这里struts2提供的aware接口也有两种一种是Servlet API对象,一种是struts2自定义的Map对象。对于实现了PrincipalAware接口的Action,struts2会把request封装在一个PrincipalProxy代理对象中,以方便获取请求安全方面的信息,PrincipalProxy只是一个代理,其内部还是调用的request对象的相关方法。
 
   这几个判断完成后继续调用下一个易做图......
补充:Web开发 , Jsp ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,