一、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. Gatsby & React & NPX & NVM

    Gatsby & React Gatsby is a blazing fast modern site generator for React. https://www.gatsbyjs.or ...

  2. 跨站请求伪造和cookie伪造

    CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  3. 梯度下降取负梯度的简单证明,挺有意思的mark一下

    本文转载自:http://blog.csdn.net/itplus/article/details/9337515

  4. H5(仅仅是个地址)

    http://www.w3school.com.cn/html5/html_5_intro.asp (▼ヘ▼#)   怕你不看,我特地给你记个地址,应该不能再故意不看了吧   (▼ヘ▼#)

  5. DotNetty 实现 Modbus TCP 系列 (三) Codecs & Handler

    本文已收录至:开源 DotNetty 实现的 Modbus TCP/IP 协议 DotNetty 作为一个半成品,我们不需要关注细节的实现,只需要关注自己的业务即可,所以最主要的就是处理 Codecs ...

  6. Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

    在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...

  7. 修改iptables后重启返回错误

    在防火墙添加规则后我是这样改的vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ...

  8. BZOJ3724PA2014Final Krolestwo——欧拉回路+构造

    题目描述 你有一个无向连通图,边的总数为偶数.设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每条边长度为1)的 ...

  9. IDM下载神器

    破解版IDM 个人评价:基本上能满足日常下载需求,除bt.磁力外. 不管是在线视频, 还是音乐, 电子书, 统统都能下载, 还附有爬虫功能~~ 直接附链接: 百度云链接: https://pan.ba ...

  10. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...