什么是ActionContext,ServletContext和ServletActionContext之间的区别?

时间:2017-04-07 03:02:40

标签: java servlets action actioncontext

在Java EE中,我们经常使用ActionContextServletContextServletActionContext,它们的名称相似,但我不知道它们之间的区别。

我只知道ServletActionContext继承了ActionContext。 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

他们之间有很多不同。

<强> ServletContext的

ServletContext的包(javax.servlet.ServletContext)我们可以知道它是标准的JavaEE WebApplication类库。

ServletContext提供标准的Servlet运行时环境。实际上是一些servlet与web容器通信的方法。

public interface ServletContext {

 // Returns the URL prefix for the ServletContext.
 public String getServletContextName();

 //Returns the context-path for the web-application.
 public String getContextPath();

 //Returns the ServletContext for the uri.
 public ServletContext getContext(String uri);

 //Returns the real file path for the given uri.
 public String getRealPath(String uri);

 public RequestDispatcher getNamedDispatcher(String servletName);

 public RequestDispatcher getRequestDispatcher(String uri);

ServletContext包含在ServletConfig中,而ServletConfig通常从servlet或过滤器的init()方法中读取:

servletConfig.getServletContext()
filterConfig.getServletContext()

<强> ActionContext中

来自Struts,但最初来自Struts1和Struts2,它们是不同的。

来自Struts1:
servlet(servlet org.apache.struts.action.ActionServlet)处理所有*.do操作。

来自Struts2:
filter(org.apache.struts2.dispatcher.FilterDispatcher)处理所有请求。

因为struts1属于servlet范围。 struts1动作本质上是servlet struts2动作是普通的Java bean,超出了servlet的限制 在strtus2操作退出stand servlet框架之后,ActionContext构成了丢失的WEB环境。

ActionContext主要功能:

  • 提供WEB上下文。
  • 解决线程安全问题。
  • 解决与其他框架(例如:webLogic)的不兼容问题)

<强> ServletActionContext

正如您所说,ServletActionContext是ActionContext的子类。 它的功能从ActionContext开始,封装方法,使其更简单直观。

我们也可以研究它的源代码:

public class ServletActionContext extends ActionContext implements StrutsStatics {

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

从上面我们可以知道ServletActionContext扩展了ActionContext。