一、ContextMap
1、概述
它是OGNL上下文对象,是struts2中封装数据最大的对象。我们一次请求中所有用到的信息都可以在它里面找到。它是一个Map结构的对象,其中key是字符串,value是一个Object。
2、ContextMap中封装的数据
(1)、contextMap中的全部对象
(2)、ContextMap的结构
二、ActionContext
1、什么是ActionContext
它是一个工具类,是struts2框架提供给我们的,可以让我们调用其中的方法,快速的操作ContextMap。用它操作OGNL上下文对象,比直接操作ContextMap要方便很多。
2、ActonContext和ContextMap的关系
ActionContext就相当于对ContextMap进行了一次再封装。
3、ActionContext什么时候创建
由于ActionContext是操作的ContextMap,而ContextMap中封了我们一次请求的所有数据,所以它的创建应该是每次请求访问Action时,即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时
三、ContextMap中数据的存取
1、向ContextMap域中存取数据
(1)、动作类存值
public String value(){
ActionContext context = ActionContext.getContext();//从当前线程上获取context
context.put("contextMap", "向ContextMap中存放数据");
return "success";
}
(2)、jsp页面 debug视图 中的数据
<body>
<s:debug />
</body>
注意:contextMap中后添加的数据会覆盖之前添加的数据
public String value(){
ActionContext context = ActionContext.getContext();
Map<String, Object> contextMap = context.getContextMap();
contextMap.put("contextMap", "111");
context.put("contextMap", "第一次");
return "success";
}
页面debug中显示的contextMap中的数据只有"第一次"
(3)、jsp页面取值
获取contextMap域中的数据
<%--1、获取ContextMap中的数据(大Map和小Map)
使用的是OGNL表达式。借助的是struts2的s:property标签
取Map中的数据:
需要使用#key的方式
--%>
<s:property value="#contextMap"/>
2、向ContextMap中key为applicationContext的小map中存取数据
(1)、动作类中
public String value(){
ActionContext context = ActionContext.getContext();//从当前线程上获取context
//获取application
Map<String, Object> application = context.getApplication();
//向application域中存值
application.put("application存值", "向application域中存值");
return "success";
}
(2)、jsp中debug
(3)、获取大Map中key为application的小Map中的数据
注意:不要直接获取application域的数据,因为application域中数据太多
<%--3、获取大Map中key为application的小map数据 --%>
<s:property value="#application.applicationMap"/><br/>
<s:property value="#application.application存值"/><br/>
<s:property value="#application.application存值.split(' ')"/>
3、向key为session的小map中存取数据
(1)、动作类
public String value(){
ActionContext context = ActionContext.getContext();//从当前线程上获取context
//获取session
Map<String, Object> session = context.getSession();
//存值
session.put("session存值", "向小map--session中存值");
return "success";
}
(2)、jsp中debug
(3)、jsp取值
获取session域中的所有数据
<%-- 获取session的map中的所有数据 --%>
<s:property value="#session"/>
获取session域中的key为 sessionMap、sessionAttr 的数据
<%--2、获取大Map中key为session的小Map中的数据
获取小map中key为sessionMap、sessionAttr的数据以及sessionAttr中字符串数据的长度
--%>
<s:property value="#session.sessionMap"/><br/>
<s:property value="#session.sessionAttr"/><br/>
<s:property value="#session.sessionAttr.length()"/>
4、使用原生servletAPI对象存值
(1)、动作类
public String value(){
//使用原生ServletAPI获取对象
ServletContext application = ServletActionContext.getServletContext();
HttpSession session = ServletActionContext.getRequest().getSession();
//存入数据
application.setAttribute("原生application域对象", "向原生application域中存入数据");
session.setAttribute("原生session域对象", "向原生session域对象中存入数据");
return "success";
}
(2)、jsp中debug
四、ValueStack
1、什么是ValueStack
ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个 Action 的生命周期。
它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器。它的封装是由struts2框架完成的。
ValueStack实现了栈的特性,即先进后出
2、ValueStack的内部结构
在 OnglValueStack 中包含了一个CompoundRoot的对象,该对象继承了ArrayList,并且提供了只能操作集合第一个元素的方法,所以我们说它实现了栈的特性。同时,它里面定义了一个ContextMap的引用,也就是说,我们有值栈对象,也可以通过值栈来获取ContextMap。
3、ValueStack的存值取值
(1)、动作类代码
public String value(){
//获取ActionContext
ActionContext context = ActionContext.getContext();
//获取valueStack
ValueStack valueStack = context.getValueStack();
//将数据存入valueStack中,即压栈
Student s = new Student();
s.setName("test");
s.setAge(18);
valueStack.push(s);
return "success";
}
(2)、jsp中debug内容
(3)、jsp页面取值
使用OGNL表达式获取值栈中的数据,借助的是s:property标签
<s:property value="name"/><br/>
<s:property value="age"/>
注意:在动作类中push方法是压栈操作,后面push的对象会在栈顶,而action动作类中的成员属性会在栈底,具体信息如下图
取指定位置的值:
当<s:property>中没有指定name属性时,获取的是栈顶的第一个对象
当没有操作值栈的时候,默认的栈顶对象是当前执行的动作类
ognl表达式对应的对象及方法
使用的对象是:valuestack
使用的方法是:Object = vs.findValue(String ognlExpression)
<body>
<s:debug />
<s:property value="name" />
<br/>
<!-- 以下是java代码findValue()方法输出的内容 -->
<%
ActionContext context = ActionContext.getContext();
//获取name的值
Object v1 = context.getValueStack().findValue("name");
out.print(v1);
//获取指定位置的name
Object v2 = context.getValueStack().findValue("[0].name");
out.print(v2);
//获取session域中key为sessionMap的值
Object v3 = context.getValueStack().findValue("#session.sessionMap");
out.print(v2);
%>
</body>