【问题标题】:Whats the difference between ActionContext,ServletContext and ServletActionContext?ActionContext、ServletContext 和 ServletActionContext 有什么区别?
【发布时间】:2017-04-07 03:02:39
【问题描述】:

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

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

【问题讨论】:

    标签: java servlets action actioncontext


    【解决方案1】:

    它们之间有很多不同。

    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或filter的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 的限制。
    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      相关资源
      最近更新 更多