ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,也正是由于这个原因,使用者不用去操心让Action是线程安全的。    无论如何,ActionContext都是用来存放数据的。Struts2本身会在其中放入不少数据,而使用者也可以放入自己想要的数据。ActionContext本身的数据结构是映射结构,即一个Map,用key来映射value。所以使用者完全可以像使用Map一样来使用它,或者直接使用Action.getContextMap()方法来对Map进行操作。    Struts2本身在其中放入的数据有ActionInvocation、application(即ServletContext)、conversionErrors、Locale、action的name、request的参数、HTTP的Session以及值栈等。完整的列表请参考它的Javadoc(本文附录有对它包含内容的讨论)。    由于ActionContext的线程唯一和静态方法就能获得的特性,使得在非Action类中可以直接获得它,而不需要等待Action传入或注入。需要注意的是,它仅在由于request而创建的线程中有效(因为request时才创建对应的ActionContext),而在服务器启动的线程中(比如fliter的init方法)无效。由于在非Action类中访问其的方便性,ActionContext也可以用来在非Action类中向JSP传递数据(因为JSP也能很方便的访问它)。
如何获得ActionContext:
  • 在自定义的拦截器中:使用ActionInvocation.getInvocationContext()或者使用ActionContext.getContext()。
  • 在Action类中:让拦截器注入或者使用ActionContext.getContext()。
  • 在非Action类中:让Action类传递参数、使用注入机制注入或者使用ActionContext.getContext()。注意:只有运行在request线程中的代码才能调用ActionContext.getContext(),否则返回的是null。
  • 在JSP中:一般不需要获得ActionContext本身。
如何向ActionContext中存入值:
  • 在拦截器、Action类、非Action类等Java类中:使用ActionContext.put(Object key, Object value)方法。
  • 在JSP中:标签<s:set value="..."/>默认将值存入ActionContext中(当然,<s:set>标签还可以把值存到其他地方)。另外,许多标签都有var属性(以前用的是id属性,现在id属性已被弃用),这个属性能向ActionContext存入值,key为var属性的值,value为标签的value属性的值。(有些文档写的是向ValueStack的context存入值,其实是一样的)
如何从ActionContext中读取值:
  • 在拦截器、Action类、非Action类等Java类中:使用ActionContext.get(Object key)方法。
  • 在JSP中:使用#开头的Ognl表达式,比如<s:property value="#name"/>会调用ActionContext.get("name")方法。注意:如果某标签的属性默认不作为Ognl表达式解析,则需要使用%{}把表达式括起来,于是就会出现类似“%{#name}的表达式”。(“#”的更多用途参见这里)
总之,在JSP中使用ActionContext一方面是由于它是映射结构,另一方面是能读取Action的一些配置。当你需要为许多Action提供通用的值的话,可以让每个Action都提供getXXX()方法,比如:
   ActionContext.getContext().getSession().put(x,x)  获取的是session,然后用put存入相应的值,只要在session有效状态下,这个值一直可用
  ActionContext.getContext().put("x", x) 是将对象默认的放入map中。map中原本有request、response、session等基本‘容器
   ActionContext.getContext().getValueStack().push(x)  在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack,可以把一个对象直接压入到valuestack中
但更好的方法是在拦截器或JSP模板中把这些通用的值存放到ActionContext中(因为拦截器或JSP模板往往通用于多个Action)。

												

ActionContext.getContext()的几种用法相关推荐

  1. ActionContext.getContext()的用法总结

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

  2. 关于ActionContext.getContext()的用法心得

    这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比较方便吧. 为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpSe ...

  3. 关于ActionContext.getContext()的使用方法心得

    这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比較方便吧. 为了避免与Servlet API耦合在一起,方便Action类做单元測试,Struts 2对HttpSe ...

  4. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  5. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示.  比如 SELECT * FROM [user ...

  6. javamap的用法_Java Map常用的几种用法。

    Java Map常用的几种用法. 通常,Map是由一组键值对组成的数据结构,每个键只能在映射中出现一次.这篇文章总结了有关如何使用Java Map及其实现的类的前9个常见问题解答.为了简单起见,我将在 ...

  7. using 的三种用法

    using 有哪三种用法? 1)引入命名空间. 2)给命名空间或者类型起别名. 3)划定作用域.自动释放资源,使用该方法的类型必须实现了 System.IDisposable接口,当对象脱离作用域之后 ...

  8. C++ operator两种用法【转】

    C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换).下面分别进行介绍: 1.operator ...

  9. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

最新文章

  1. 0x02.基本算法 — 递推与递归
  2. 关系型数据库之Mysql备份(五)
  3. MAP Protocol 协议(1)初步介绍
  4. 回文树或者回文自动机,及相关例题
  5. ios 自定义字体_如何仅用几行代码在iOS应用中创建一致的自定义字体
  6. excel超级工具箱_这6个Excel高效办公插件,你都用过吗?
  7. 外媒:柔宇科技搁置赴美上市计划 考虑在中国进行IPO
  8. Web Server监视器 v0.75 - Free tool
  9. ES11新特性_String.prototype.matchAll方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记063
  10. 云单元架构,如何赋能数字化转型呢?
  11. Java多线程-join方法
  12. 如何在word2016中使用自带的公式编辑器
  13. 页面中的icon小图标,下载+设置
  14. (面经)微信群发红包后,怎么判断抢的与发的钱数一致
  15. 大象进冰箱和软件设计的关联性
  16. java 家谱管理系统_家谱管理系统
  17. 计算机的硬件系统和软件系统的关系
  18. Android及IOS微信5,Android版微信5.0今日正式发布 与iOS版略不同
  19. ARIMA模型,在时间序列中,加入其他解释变量
  20. 分贝dB、dBm、dBw

热门文章

  1. 美柚如何精准引流?怎么通过美柚引流?美柚引流技巧
  2. 杭电通信841考研考研经验交流及资料分享
  3. 使用PYTHON图像识别实现车牌号码识别
  4. typora全局替换文本
  5. OWASP WebGoat---安全测试学习笔记(一)
  6. win 7 音频问题
  7. mysql 嵌入式 稳定性_常用的嵌入式数据库的比较
  8. system call——系统调用
  9. VMD/NAMD命令/规则
  10. execute与executeUpdate的区别(学习笔记)