-1

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

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

4

1 回答 1

1

它们之间有很多不同之处。

Servlet上下文

ServletContext's package( 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 或 filter 的init()方法中读取:

servletConfig.getServletContext()
filterConfig.getServletContext()

动作上下文

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

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

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

因为 struts1 属于 servlet 范围。struts1 的动作本质上是servlet。
struts2 的动作是普通的Java bean,超出了servlet 的限制。
ActionContext 弥补了strtus2 动作脱离stand servlet 框架后丢失的WEB 环境。

ActionContext 主要功能:

  • 提供 WEB 上下文。
  • 解决线程安全问题。
  • 解决与其他Framework(如: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。

于 2017-04-07T03:31:00.627 回答