zoukankan      html  css  js  c++  java
  • ServletContext,ActionContext,ServletActionContext (关系及联系)

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

     

            ServletContext,ActionContext,ServletActionContext       

    分类:            JavaStruts627人阅读评论(0)收藏举报

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

    1.ActionContext
    xwork框架的ActionContext是Action执行时的上下文,存放Action执行时需要用到的对象。在使用webwork时,其中放有Parameter、Session、ServletContext、Locale等信息。这样,webwork负责将Servlet相关数据转换为与ServletAPI无关的Map对象(即ActionContext),使得xwork的Action实现与web层、逻辑层与表现层的解耦。

    2.ServletActionContext
    提供直接与Servlet容器交互的途径。通过它,可以取得HttpServletRequest、HttpServletResponse 、ServletConfig、ServletContext、PageContext 对象。但是,使用ServletActionContext意味着Action与ServletAPI的紧密耦合。

    3.由于WebWork对request,parameter,Session和Application都进行了封装,将这些隐含的对象封装成了相应的Map,如RequestMap,ParameterMap,SessionMap和ApplicationMap,而这些Map就组成

    了ActionContext,因此我们通常都不再需要与request,session这些底层的对象打交道了,这也是我一开始觉得迷惑的地方,因为我找不到Session了。事实上,对于SessionMap的处理即是对Session的

    处理了。我们可以通过ActionContext的静态方法getContext返回一个ActionContext的实例,然后再调用其getSession方法获得SessionMap,接着就可以利用put和get方法对session进行读写的操作了。


    Map params = new HashMap();;  
    params.put(String, String);;  
    ......  
    Map extraContext = new HashMap();;  
    extraContext.put(ActionContext.PARAMETERS,params);

    Map session = new HashMap();;  
    session.put("foo", "bar");;  
    extraContext.put(ActionContext.SESSION, session);

    ActionContext ctx = ActionContext.getContext();
    Map session = ctx.getSession();
    session.put("username",loginInfo.getUsername());

    ActionContext ctx = ActionContext.getContext();
    Map params = ctx.getParameters();
    String username = ctx.getParameters("username");

    OgnlValueStack stack = new OgnlValueStack();
    stack.push(new User());//首先将欲赋值对象压入栈中
    stack.setValue("name","erica");//为栈顶对象的指定属性名赋值

  • 相关阅读:
    springmvc入门详解
    getClass 与getSimpleName
    mybati的存储过程
    mybatis与spring的整合
    mybatis分页插件以及懒加载
    mybatis知识总结
    【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
    【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    【Java面试题】27 多线程笔试面试概念问答
  • 原文地址:https://www.cnblogs.com/guanghuiqq/p/2714942.html
Copyright © 2011-2022 走看看