• 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对象通常被servletfilterinit()方法读取

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

     

  • 相关阅读:
    wp7订餐客户端源码
    AOP技术术语
    urlpattern详解
    .net 访问IBM DB2 数据库
    入驻博客园
    hadoop视频
    阿里OneData构建数据指标体系
    大数据领域全景解析
    PyTorch中梯度为什么默认自动累加,在反向传播前要手动将梯度清零?
    Pytorch:Dataloader和Dataset以及搭建数据部分的步骤
  • 原文地址:https://www.cnblogs.com/langtianya/p/2990951.html
Copyright © 2020-2023  润新知