ServletContext,ActionContext与ServletActionContext详解

来源:互联网 发布:python bytes 编辑:程序博客网 时间:2024/06/06 01:45

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

0 0