一、contextMap中的数据操作

root根:List

元素1

元素2

元素3

元素4

元素5

contextMap:Map

key

value

application

Map

key

value

name

test

session

Map

request

Map

attr

Map

1、存数据:

需要熟悉ActionContext和valueStack的API。框架为我们存数据。

1.1、利用ActionContext存数据

 /**
* 利用ActionContext存数据
* @author zhy
*
*/
public class Demo1Action extends ActionSupport { public String execute(){
//1.得到ActionContext对象
ActionContext context = ActionContext.getContext();//这是从当前线程的局部变量中获取引用
//2.往map中存入数据
context.put("contextMap", "hello contextMap");//把数据直接存到了大Map中 //往session中存数据
//第一种方式:获取key为session的map
Map<String,Object> sessionAttribute = context.getSession();//得到key值为session的小map
sessionAttribute.put("sessionMap", "hello sessionMap");
//第二种方式:直接使用原始的HttpSession对象
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("sessionMap1", "hello sessionMap1"); //往ServletContext域中存数据
//第一种方式:获取key值为application的map
Map<String,Object> applicationAttribute = context.getApplication();
applicationAttribute.put("applicationMap", "hello applicationMap");
//第二种方式:获取原始ServletContext对象
ServletContext application = ServletActionContext.getServletContext();
application.setAttribute("applicationMap1", "hello applicationMap1"); return SUCCESS;
}
}

DemoAction1

1.2、利用ValueStack存数据

a、如何获取ValueStack:

 /**
* 利用VauleStack存数据
* @author zhy
*
*/
public class Demo2Action extends ActionSupport { private String name = "泰斯特2"; public String execute(){
//获取ValueStack对象的引用
//第一种方式:获取HttpServletRequest对象,通过对象的getAttribute方法,从域中取
//1.获取request对象
HttpServletRequest request = ServletActionContext.getRequest();
//2.根据key获取ValueStack对象的引用
ValueStack vs1 = (ValueStack)request.getAttribute("struts.valueStack");
System.out.println(vs1.hashCode()); //第二种方式:先获取ActionContext对象,再取出requestMap,然后通过map的get方法获取
//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2.获取requestMap
Map<String,Object> requestAttribute = (Map<String,Object>)context.get("request");
//3.根据key获取对象的引用
ValueStack vs2 = (ValueStack)requestAttribute.get("struts.valueStack");
System.out.println(vs2.hashCode()); //第三种方式:使用ActionContext对象的方法,直接获取ValueStack对象的引用
ValueStack vs3 = context.getValueStack();
System.out.println(vs3.hashCode()); }

DemoAction2

b、ValueStack中的getRoot()方法:

    c、CompoundRoot是什么:

       d、栈操作:

压栈操作

     //栈的操作
ActionContext context = ActionContext.getContext();
ValueStack vs = context.getValueStack();
//压栈操作
vs.push(new Student("泰斯特",21));

压栈

2、取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)

使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。

2.1、使用s:property取数据

a、取contextMap中的数据,需使用#

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>取ActionContext数据</title>
</head>
<body>
<s:debug/>
<%--使用s:property来获取ActionContext中的数据。
value属性的取值是一个OGNL表达式。--%>
<br/>---------获取大Map中的数据-------------<br/>
<%--获取大Map中的数据,在取的时候是#key名称--%>
<s:property value="#contextMap"/>
<br/>---------获取小Map中的数据-------------<br/>
<%--获取大Map中小Map的数据 ,使用#大Map的key.小Map的key--%>
<s:property value="#session.sessionMap1"/>
<s:property value="#application.applicationMap1"/>
</body>
</html>

Map.jsp

 b、取contextMap里面ValueStack中对象的属性:直接写属性名

               

 <%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@page import="com.opensymphony.xwork2.util.ValueStack"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>取ValueStack中的数据</title>
</head>
<body>
<%--使用s:property标签,获取ValueStack中的元素。
value属性的取值是一个OGNL表达式。它只能获取元素中的属性。
注意:
取ValueStack中的对象属性时,不使用#。
它是从栈顶逐个对象查找指定的属性名称。只要找到了,就不再继续查找。
--%>
<s:property value="name"/><br/>
<%--获取ValueStack中指定位置的属性 :
详情请见解释图
--%>
0-name <s:property value="[0].name" /><br/>
1-name <s:property value="[1].name" /><br/>
2-name <s:property value="[2].name" /><br/>
3-name <s:property value="[3].name" /><br/>
4-name <s:property value="[4].name" /><br/>
<%--去栈顶map中的元素 --%>
<s:property value="s1.name" /><br/> <%--当s:property什么都不写:
默认取栈顶元素
--%>
<s:property />
<%//模拟原理:其实全是ValueStack的findValue和findString
ValueStack vs = ActionContext.getContext().getValueStack();
Object obj = vs.findValue("[1].name");
out.print("<br/>-------------------------<br/>");
out.print(obj);
%>
<s:debug/>
</body>
</html>

valueStack.jsp

                                   如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置

            见上面代码

                                   特殊说明:当s:property不给定value属性时,默认取栈顶对象。

                    见上面代码

                            OGNL的使用总结:

                                   1.取根中对象的属性,不使用#

                                   2.contextMapkey的值,要使用#

2.2、ValueStack的其他方法:

                            asetValue方法

     /*
* ValueStack的其他方法
* setValue(String expr, Object value);
* String expr:它是一个OGNL表达式
* Object value:我们要操作的数据
* 把数据存到哪里去?
* 看expr是否使用了#
* 如果使用了#,操作的就是ContextMap中
* 如果没使用#,操作的就是ValueStack
*/
vs.setValue("#name", "张三");//把数据放到ContextMap中。 key是name valeu=张三
vs.setValue("name", "李四");//把ValueStack中第一个name属性的值换成李四。如果没有一个name属性的对应的setName方法,会报错。

setValue方法

在Jsp页面上获取【李四】

bset方法

                                  

     /*
*set(String key, Object o);
* String key : Map的key
* Object o : map的value
* 如果栈顶是一个Map元素,直接把key作为map的key,把Object作为map的value存入。存入的是栈顶。
* 如果栈顶不是一个Map元素,创建一个Map对象,把key作为map的key,把Object作为map的value,压入栈顶。
*/
vs.set("s1", new Student("王五",18));
vs.push(new Student("test",23));
vs.set("s2", new Student("aaa",28));

set方法

                                   细节问题:

                                          当按照如下方式,往根中存放数据时,根中元素是什么顺序?

                                         

                                          使用<s:debug/>标签查看:

                                         

                            cfindValue:我们在Jsp上调用的都是findValue

                                    

    <s:property />
<%//模拟原理:其实全是ValueStack的findValue和findString
ValueStack vs = ActionContext.getContext().getValueStack();
Object obj = vs.findValue("[1].name");
out.print("<br/>-------------------------<br/>");
out.print(obj);
%>

模拟

struts2 contextMap的更多相关文章

  1. struts2从浅至深(六)contextMap(存取数据)

    A:存数据 1.利用ActionContext存数据 这种方式最简便 这是一个购物车案例 把查询来的数据放入到Session中存储起来 2.利用valuestack值栈存数据 把查询出来的数据放入到值 ...

  2. struts2笔记

    Struts2 中, HTML 表单将被直接映射到一个 POJO,通过params拦截器,类中定义对应属性,及对应set方法即可. Struts2 中,任何一个POJO都可以是一个action类. S ...

  3. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  4. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  5. Struts2相关面试题

    Struts2面试题 1.struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心 ...

  6. struts2值栈内部数据结构详解

    值栈是struts2内部一片很重要的区域,我在初学的时候,发现对于值栈这个数据结构的理解不是很深刻.例如OGNLContext是什么,ActionContext和值栈有什么关系.为什么ActionCo ...

  7. 浅谈 Struts2 面试题收藏

    Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...

  8. Struts2.3.15.1源码浅析

    Struts2 两大运行主线: 1.初始化主线:初始化主线主要是为Struts2创建运行环境(此处的环境与Struts2身处的Web环境是有区别的),初始化入口StrutsPrepareAndExec ...

  9. [原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink

    Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...

  2. $mount(“#app”)手动挂载

    没有el属性时,证明vue还没绑定到特定的dom上,需要延迟加载,则使用.$mount("")进行手动挂载 https://blog.csdn.net/longzhoufeng/a ...

  3. MySQL——基础操作

    参考博客:http://www.cnblogs.com/wupeiqi/articles/5713315.html 1.创建用户.授权(默认root,密码为空) 创建: create user 'al ...

  4. spring boot和swagger 整合

    本文来源:https://blog.csdn.net/saytime/article/details/74937664 一.依赖 <dependency> <groupId>i ...

  5. JSED204B

    简介 JESD204是一种连接数据转换器(ADC和DAC)和逻辑器件的高速串行接口,该标准的 B 修订版支持高达 12.5 Gbps串行数据速率,并可确保 JESD204 链路具有可重复的确定性延迟. ...

  6. Nginx 优先选择连接最少的上游服务器

    详见陶辉87课 upstream test { server ; server ; least_conn ; zone backends 64k; }

  7. python命令里运行正确但是pycharm里面运行就是报错的问题

    这两天在学习爬虫,第一步就是 import scrapy class StackOverflowSpider(scrapy.Spider): 结果一直报错,说是scrapy没有spider这个方法,各 ...

  8. Gedit浏览器常用快捷键备注

    此处只记录常用的,而通常意义上的应知应会不做汇总 搜索 : Ctrl +F : 查找字符串 Ctrl + G : 查找字符串的下一实例 Ctrl + Shift + G : 查找字符串的前一实例 Ct ...

  9. Nginx+Tomcat 负载均衡集群

    案例分析 通常情况下,一台Tomcat站点由于可能出现单点故障及无法应对多客户复杂多样性的请求等问题,不能单独应用于生产环境下,所以我们需要一套更可靠的解决方案来完善Web站点架构. Nginx是一款 ...

  10. EF code first出现错误:列名 Discriminator 无效

    转载:https://blog.csdn.net/lanse_my/article/details/38128355 前几天使用code first碰到错误:列名 'Discriminator' 无效 ...