【发布时间】:2017-04-07 03:02:39
【问题描述】:
在Java EE中,我们经常使用ActionContext、ServletContext和ServletActionContext,它们的名字很相似,但我不知道它们之间的区别。
我只知道ServletActionContext继承了ActionContext。
有人可以解释一下吗?
【问题讨论】:
标签: java servlets action actioncontext
在Java EE中,我们经常使用ActionContext、ServletContext和ServletActionContext,它们的名字很相似,但我不知道它们之间的区别。
我只知道ServletActionContext继承了ActionContext。
有人可以解释一下吗?
【问题讨论】:
标签: java servlets action actioncontext
它们之间有很多不同。
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 主函数:
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。
【讨论】: