• 转: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

  • 相关阅读:
    ch2_CaseStudy_CanonicalNASLScript.txt
    树形数据广度排序处理示例.sql
    编程管理SQL SERVER的帐号.sql
    索引影响查询结果顺序的示例
    校验表中数据是否有循环编码的通用存储过程.sql
    BackupAndRestoreSmallWorks.sql
    cPanel下安装GodaddySSL教程
    ExcludingRNG.cs
    SymmetricAlgorithmEvaluator.cs
    操作SQLSERVERAGENT服务的扩展存储过程.sql
  • 原文地址:https://www.cnblogs.com/1-Admin/p/6200910.html
Copyright © 2020-2023  润新知