【Struts】ContextMap详解

转自: http://blog.csdn.net/qq_35448976/article/details/78011833
基本介绍
     ContextMap是OGNL的上下文对象,其是以键值对为形式存在的,key是String value是Object。其封装的数据如下:



ContextMap是在ActionInvocation默认实现类DefaultActionInvocation中创建的



使用哪个类来操作该对象
           ActionContext
           ContentMap是一个Map,封装着一次请求所需的所有数据。key是一个字符串,value是一个Object对象。直接操作它有些不方便,所以框架为我们提供了一个工具类,就是ActionContext。

ActionContext
     何时创建
          核心控制器的doFilter方法,在判断访问URL后缀符合条件,准备进入Struts2核心内部时,创建ActionContext对象。该对象可以快速的操作ContextMap。

Struts2核心过滤器StrutsPrepareAndExecuteFilter中的doFilter方法


PrepareOperations类



     如何保证的每个线程访问的都是自己的ActionContext对象       
          每个线程都有自己的一个ActionContext,为了保证每个线程都能获取到自己的ActionContext,它会把ActionContext绑定到当前线程上。


结合PrepareOperation的源码,和以下ActionContext的源码,可以看出ActionContext为什么是线程安全的。
[java] view plain copy
  1. public class ActionContext implements Serializable {  
  2.     static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();  
  3.     private Map<String, Object> context;  
  4.     public ActionContext(Map<String, Object> context) {  
  5.         this.context = context;  
  6.     }  
  7.   
  8.     public static void setContext(ActionContext context) {  
  9.         actionContext.set(context);  
  10.     }  
  11.   
  12.     public static ActionContext getContext() {  
  13.         return actionContext.get();  
  14.     }  

ActionContext是一个工具类,是struts2框架让我们能够快速操作ContextMap的工具类。里面提供了一些访问方法。

ActionContext类常用访问方法
方法声明
功能描述
void put(String key, Object value)
将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttribute()方法。也就是将值存入ContextMap中。
Object get(String key)
通过参数key来查找当前ActionContext中的值,也就是查找ContextMap中的值。
Map<String, Object> getApplication()
返回一个Application级的Map对象。
static ActionContext getContext()
获取当前线程的ActionContext对象。
Map<String, Object> getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。
Map<String, Object> getSession()
返回一个Map类型的HttpSession对象。
void setApplication(Map<String, Object> application)
设置Application上下文。
void setSession(Map<String, Object> session)
设置一个Map类型的Session值 。
void setLocale(Locale locale)
设置当前action
Locale getLocale()
获取当前action
ValueStack getValueStack()
获取ContextMap中的值栈对象
void setValueStack(ValueStack stack)
设置ContextMap中的值栈对象

可以看以下源码,了解ActionContext是怎么设置值,获取值的。由此也能看出ActionContext仅仅只是一个ContextMap的工具类而已。
[java] view plain copy
  1. public class ActionContext implements Serializable {  
  2.     static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();  
  3.     private Map<String, Object> context;  
  4.     public static final String VALUE_STACK = ValueStack.VALUE_STACK;  
  5.     public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session";  
  6.     public static final String APPLICATION = "com.opensymphony.xwork2.ActionContext.application";  
  7.     public static final String PARAMETERS = "com.opensymphony.xwork2.ActionContext.parameters";  
  8.     public static final String LOCALE = "com.opensymphony.xwork2.ActionContext.locale";  
  9.     public void setApplication(Map<String, Object> application) {  
  10.         put(APPLICATION, application);  
  11.     }  
  12.     public Map<String, Object> getApplication() {  
  13.         return (Map<String, Object>) get(APPLICATION);  
  14.     }  
  15.     public static void setContext(ActionContext context) {  
  16.         actionContext.set(context);  
  17.     }  
  18.     public static ActionContext getContext() {  
  19.         return actionContext.get();  
  20.     }  
  21.     public void setLocale(Locale locale) {  
  22.         put(LOCALE, locale);  
  23.     }  
  24.     public Locale getLocale() {  
  25.         Locale locale = (Locale) get(LOCALE);  
  26.         if (locale == null) {  
  27.             locale = Locale.getDefault();  
  28.             setLocale(locale);  
  29.         }  
  30.         return locale;  
  31.     }  
  32.     public void setParameters(Map<String, Object> parameters) {  
  33.         put(PARAMETERS, parameters);  
  34.     }  
  35.     public Map<String, Object> getParameters() {  
  36.         return (Map<String, Object>) get(PARAMETERS);  
  37.     }  
  38.     public void setSession(Map<String, Object> session) {  
  39.         put(SESSION, session);  
  40.     }  
  41.     public Map<String, Object> getSession() {  
  42.         return (Map<String, Object>) get(SESSION);  
  43.     }  
  44.     public void setValueStack(ValueStack stack) {  
  45.         put(VALUE_STACK, stack);  
  46.     }  
  47.     public ValueStack getValueStack() {  
  48.         return (ValueStack) get(VALUE_STACK);  
  49.     }  
  50.     public Object get(String key) {  
  51.         return context.get(key);  
  52.     }  
  53.     public void put(String key, Object value) {  
  54.         context.put(key, value);  
  55.     }  
  56. }  

案例

[java] view plain copy
  1. package com.pc.web.action;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import javax.servlet.ServletContext;  
  6. import javax.servlet.http.HttpSession;  
  7.   
  8. import org.apache.struts2.ServletActionContext;  
  9.   
  10. import com.opensymphony.xwork2.ActionContext;  
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.   
  13. /** 
  14.  * ContextMap中的 
  15.  *         Map部分的操作 
  16.  *             大Map 
  17.  *             小Map 
  18.  * @author Switch 
  19.  * 操作ContextMap用它的工具类:ActionContext 
  20.  */  
  21. public class TestAction extends ActionSupport {  
  22.   
  23.     /** 
  24.      * Map部分的操作 
  25.      *      ContextMap它是一个Map,可以用于存放数据。它的key是String类型。value是Object类型。 
  26.      *      1、存入ContextMap中数据。 
  27.      *             key=contextMap value=hello context map 
  28.      *      2、存入Session小Map中数据 
  29.      *             key=sessionMap value=hello session map 
  30.      *             要求用两种方式: 
  31.      *                 使用Map操作的方式 
  32.      *                 使用HttpSession对象操作的方式 
  33.      *     3、存入application小Map中数据 
  34.      *            key=applicationMap value=hello application map 
  35.      * @return 
  36.      * 注意: 
  37.      *      获取小Map可以使用两种方式: 
  38.      *         一种是长名称,一种是短名称。 
  39.      *         一般情况下,短名称是给程序员用的。 
  40.      *                   长名称是给框架自己用的。 
  41.      */  
  42.     public String test1(){  
  43.         //1.获取ActionContext  
  44.         ActionContext context = ActionContext.getContext();//从当前线程上获取  
  45.         //2.存入数据  
  46.         context.put("contextMap""hello context map");  
  47.   
  48.         //3.获取Session小Map  
  49.         //第一种方式:  
  50.         //(Map<String, Object>) context.get("com.opensymphony.xwork2.ActionContext.session");  
  51.         Map<String,Object> sessionMap = context.getSession();  
  52.         sessionMap.put("sessionMap2""hello session map2");  
  53.         //第二种方式:  
  54.         HttpSession session = ServletActionContext.getRequest().getSession();  
  55.         session.setAttribute("sessionMap3""hello session map3");  
  56.   
  57.         //4.获取application小Map  
  58.         Map<String,Object> applicationMap = context.getApplication();  
  59.         applicationMap.put("applicationMap""hello application map");  
  60.   
  61.         ServletContext application = ServletActionContext.getServletContext();  
  62.         application.setAttribute("applicationAttr""hello application attr");  
  63.   
  64.         return SUCCESS;  
  65.     }  
  66. }  

[html] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="/struts-tags" prefix="s" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Map部分的操作</title>  
  8. </head>  
  9. <body>  
  10. <%--1、使用OGNL表达式获取Map中的数据  
  11. 需要借助s:property标签  
  12. value属性的取值是一个OGNL表达式,在Map部分中获取数据,都是根据key获取value。  
  13. 根据Key获取value的OGNL表达式写法:  
  14.         #key  
  15. --%>  
  16. 大Map:<s:property value="#contextMap"/>  
  17. <hr/>  
  18. 取key为session的小Map中数据:  
  19.     <s:property value="#session.sessionMap2"/><br/>  
  20.     <s:property value="#session.sessionMap2.length()"/><br/>  
  21. 取key为application的小Map中数据:  
  22.     <s:property value="#application.applicationAttr"/>  
  23.     <s:property value="#application.applicationAttr.toUpperCase()"/>  
  24.   
  25.   
  26. <%--s:debug标签:它可以查看ContextMap中的数据 --%>  
  27. <s:debug></s:debug>  
  28. </body>  
  29. </html>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值