zoukankan      html  css  js  c++  java
  • 转:ServletContext,ActionContext,ServletActionContext

    ServletContext
    
    ServletContext从他的package信息可以看出,它是标准的JavaEE WebApplication类库
    javax.servlet.ServletContext
    ServletContext提供了标准的Servlet运行环境,其实就是一些servlet和web container进行通信的方法
    public interface ServletContext {
    
     // Returns the URL prefix for the ServletContext.
     public String getServletContextName();
    
     //Returns the ServletContext for the uri.
     public ServletContext getContext(String uri);
     
     //Returns the context-path for the web-application.
     public String getContextPath();
     
     //Returns the real file path for the given uri.
     public String getRealPath(String uri);
     
     public RequestDispatcher getRequestDispatcher(String uri);
     public RequestDispatcher getNamedDispatcher(String servletName);
    public Object getAttribute(String name);
    public Enumeration getAttributeNames();
    public void setAttribute(String name, Object value);
    public void removeAttribute(String name);
    注意:一个ServletContext对应一个命名空间的servlet( 比如/struts下的所有servlet),是被所有servlet共享的.
    There is one context per "web application" per Java Virtual Machine.
    (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.)
    
    ServletContext被包含在ServletConfig对象中,ServletConfig对象通常被servlet或filter的init()方法读取
    ServletConfig.getServletContext()
    filterconfig.getServletContext()
    
    
    ActionContext来源于Struts2 与 Struts1的本质不同.
    struts1时,由一个servlet (servlet org.apache.struts.action.ActionServlet)处理所有的*.do
    struts2时,由一个filter(org.apache.struts2.dispatcher.FilterDispatcher)处理所有的请求
    struts1 仍旧属于servlet范畴,struts1 action 其本质仍是servlet.
    struts2 action 已经是普通的Java bean了,已经跳出了servlet 框架
    ActionContext就是为了弥补strtus2 action跳出标准servlet框架而造成的和WEB环境失去联系的缺陷
    
    ActionContext的主要作用:
    
    提供Web环境Context
    解决线程安全问题
    解决一些和其他框架或容器(siteMesh,webLogic)的兼容问题
    
    分析ActionContext源码
    
     public class ActionContext implements Serializable {
      //////////ThreadLocal模式下的ActionContext实例,实现多线程下的线程安全///////////////
    
         static ThreadLocal actionContext = new ThreadLocal();
         
         //Sets the action context for the current thread.
         public static void setContext(ActionContext context) {
             actionContext.set(context);
         }
         //Returns the ActionContext specific to the current thread.
         public static ActionContext getContext() {
             return (ActionContext) actionContext.get();
         }
     ///////////////定义放置"名/值对"的Map容器,这是ActionContext的主要功能/////////////// 
      
         Map<String, Object> context;
                  
         // constractor    
         // Creates a new ActionContext initialized with another context.
         public ActionContext(Map<String, Object> context) {
             this.context = context;
         }
         
         public void setContextMap(Map<String, Object> contextMap) {
             getContext().context = contextMap;
         }
         public Map<String, Object> getContextMap() {
             return context;
         }
    
    //Returns a value that is stored in the current ActionContext by doing a lookup using the value's key.
         public Object get(String key) {
             return context.get(key);
         }
     //Stores a value in the current ActionContext. The value can be looked up using the key.
         public void put(String key, Object value) {
             context.put(key, value);
         }
    ///////////////////将各种功能属性放置入Map容器中/////////////////////
                
         //action name, Constant for the name of the action being executed.
         public static final String ACTION_NAME = "com.opensymphony.xwork2.ActionContext.name";
     
         // ognl value stack
         public static final String VALUE_STACK = ValueStack.VALUE_STACK;
     
         public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session";
         public static final String APPLICATION = "com.opensymphony.xwork2.ActionContext.application";
         public static final String PARAMETERS = "com.opensymphony.xwork2.ActionContext.parameters";
         public static final String LOCALE = "com.opensymphony.xwork2.ActionContext.locale";
         public static final String TYPE_CONVERTER = "com.opensymphony.xwork2.ActionContext.typeConverter";
         public static final String ACTION_INVOCATION = "com.opensymphony.xwork2.ActionContext.actionInvocation";
         public static final String CONVERSION_ERRORS = "com.opensymphony.xwork2.ActionContext.conversionErrors";
         public static final String CONTAINER = "com.opensymphony.xwork2.ActionContext.container";
     
     ////// 各种Action主属性:ActionName, ActionInvocation(调用action的相关信息), ognl value stack///
                 
         //Gets the name of the current Action.
         public String getName() {
             return (String) get(ACTION_NAME);
         }
         //Sets the name of the current Action in the ActionContext.
         public void setName(String name) {
             put(ACTION_NAME, name);
         }
         
         //Sets the action invocation (the execution state).
         public void setActionInvocation(ActionInvocation actionInvocation) {
             put(ACTION_INVOCATION, actionInvocation);
         }
         public ActionInvocation getActionInvocation() {
             return (ActionInvocation) get(ACTION_INVOCATION);
         }
     
         // Sets the OGNL value stack.
         public void setValueStack(ValueStack stack) {
             put(VALUE_STACK, stack);
         }
         //Gets the OGNL value stack.
         public ValueStack getValueStack() {
             return (ValueStack) get(VALUE_STACK);
         }
    
    ////////////////各种 request请求包含的内容////////////////////
         //Returns a Map of the HttpServletRequest parameters
         public Map<String, Object> getParameters() {
             return (Map<String, Object>) get(PARAMETERS);
         }
         public void setParameters(Map<String, Object> parameters) {
             put(PARAMETERS, parameters);
         }    
        
         public void setSession(Map<String, Object> session) {
             put(SESSION, session);
         }
         public Map<String, Object> getSession() {
                      return (Map<String, Object>) get(SESSION);
         }      
         public void setApplication(Map<String, Object> application) {
             put(APPLICATION, application);
         }
         public Map<String, Object> getApplication() {
             return (Map<String, Object>) get(APPLICATION);
         }
     
         public void setConversionErrors(Map<String, Object> conversionErrors) {
             put(CONVERSION_ERRORS, conversionErrors);
         }
         public Map<String, Object> getConversionErrors() {
             Map<String, Object> errors = (Map) get(CONVERSION_ERRORS);
     
             if (errors == null) {
                 errors = new HashMap<String, Object>();
                 setConversionErrors(errors);
             }
             return errors;
         }
     
         //Sets the Locale for the current action.
         public void setLocale(Locale locale) {
             put(LOCALE, locale);
         }
         public Locale getLocale() {
             Locale locale = (Locale) get(LOCALE);
     
             if (locale == null) {
                 locale = Locale.getDefault();
                 setLocale(locale);
             }
     
             return locale;
         }
         public void setContainer(Container cont) {
             put(CONTAINER, cont);
         }
         public Container getContainer() {
             return (Container) get(CONTAINER);
         }
        
         public <T> T getInstance(Class<T> type) {
             Container cont = getContainer();
             if (cont != null) {
                 return cont.getInstance(type);
             } else {
                 throw new XWorkException("Cannot find an initialized container for this request.");
             }
         }
     }
    
    
    ServletActionContext 其实是ActionContext的子类,其功能脱胎于ActionContext,对ActionContext的方法做了一定的包装,提供了更简便直观的方法
    
     public class ServletActionContext extends ActionContext implements StrutsStatics {
    /////////////////Servlet Context 提供了多种操作ActionContext的静态方法,使获得Web对象更方便
    
            //HTTP servlet request
          public static void setRequest(HttpServletRequest request) {
              ActionContext.getContext().put(HTTP_REQUEST, request);
          } 
          public static HttpServletRequest getRequest() {
              return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);
          }
     
          //HTTP servlet response
          public static void setResponse(HttpServletResponse response) {
              ActionContext.getContext().put(HTTP_RESPONSE, response);
          } 
          public static HttpServletResponse getResponse() {
              return (HttpServletResponse) ActionContext.getContext().get(HTTP_RESPONSE);
          }
     
          //servlet context.
          public static ServletContext getServletContext() {
              return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT);
          } 
          public static void setServletContext(ServletContext servletContext) {
              ActionContext.getContext().put(SERVLET_CONTEXT, servletContext);
          }

    原文:http://blog.csdn.net/ocean1010/article/details/6160159

  • 相关阅读:
    Web API 强势入门指南
    毫秒必争,前端网页性能最佳实践
    Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
    Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
    Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
    WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题
    透过WinDBG的视角看String
    Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
    企业IT管理员IE11升级指南【17】—— F12 开发者工具
    WCF : 如何将NetTcpBinding寄宿在IIS7上
  • 原文地址:https://www.cnblogs.com/1-Admin/p/6200910.html
Copyright © 2011-2022 走看看