文档章节

ServletContext,ActionContext,ServletActionContext

z
 zdatbit
发布于 2016/04/18 10:56
字数 1067
阅读 21
收藏 1
点赞 1
评论 0

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


© 著作权归作者所有

共有 人打赏支持
z
粉丝 3
博文 43
码字总数 5767
作品 0
海淀
Struts2中Action访问Servlet API的三种方法

Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,能更轻松的测试该Action。但如何访问? Web应用中通常需要访问的Servlet A...

紫宸 ⋅ 2013/02/26 ⋅ 0

Struts2源码阅读之ActionContext

上一篇文章概述了Struts2的一些流程。这次说下ActionContext,直接进入正题。 static ThreadLocal actionContext = new ThreadLocal();//ActionContext public static ActionContext getCont......

空谷幽兰_ ⋅ 2012/11/17 ⋅ 0

Struts2中的ActionContext

ActionContext介绍 通过上面用户注册例子的学习,我们知道Xwork与Web无关性,我们的Action不用去依赖于任何Web容器,不用和那些JavaServlet复杂的请求(Request)、响应(Response)关联在一起...

crazyinsomnia ⋅ 2010/03/25 ⋅ 0

Struts中ActionContext和ServletActionContext的比较

一、ActionContext 在Struts2开发中除了将请求参数自动设置到Action的字段中,往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(...

ke_ry ⋅ 2016/12/17 ⋅ 0

struts2中action中取不到session的值

请问高手,struts2中action中取不到session的值。 代码如下: java代码如下: public class LoginAction extends BaseAdminAction { getRequest().getSession().setAttribute(SystemUtil.USE......

zuolz ⋅ 2013/06/06 ⋅ 1

ActionContext和ServletActionContext小结(转)

ActionContext和ServletActionContext小结 1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些...

teacheryang ⋅ 2015/01/25 ⋅ 0

ActionContext和ServletActionContext小结 (包含IoC和非ioc方式获取request等)

1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请...

长平狐 ⋅ 2013/01/06 ⋅ 0

ActionContext和ServletActionContext

前面已经了解到ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,我们也称之为广义值栈。 Struts2在每次执行Action之前都会创建新的ActionContext,在同一个线...

mr桀骜不驯 ⋅ 2013/03/10 ⋅ 1

ActionContext和ServletActionContext小结(转)

ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(...

B.H. ⋅ 2012/09/19 ⋅ 0

struts2中action如何获取jsp页面参数

ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(...

闵开慧 ⋅ 2012/08/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 40分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部