一、值栈分为两个逻辑部分

1 Map 栈: 实际上是 OgnlContext 类型, 是个 Map, 也是对 ActionContext 的一个引用. 里边保存着各种 Map:
如: requestMap, sessionMap, applicationMap, parametersMap, attr 2 对象栈: 实际上是 CompoundRoot 类型, 是一个使用 ArrayList 定义的栈. 里边保存各种和当前 Action 实例相关的对象.
是一个数据结构意义的栈.

二、Struts2 利用 s:property 标签和 OGNL表达式来读取值栈中的属性值

1、值栈中的属性值:

  • 对于对象栈: 对象栈中某一个对象的属性值
  • Map 栈: request, session, application 的一个属性值 或 一个请求参数的值.

2、读取对象栈中对象的属性:

  1. 若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一:

object.propertyName ;

object['propertyName'];

object["propertyName"]

  1. ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,

    它下面的那个对象可以用 [1] 引用.

[0].message

  1. [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象.(也就是说,0找不到,就找1,以此类推)

  2. 若从栈顶对象开始搜索, 则可以省略下标部分: message

  3. 结合 s:property 标签: <s:property value="[0].message" /> <s:property value="message" />

3、默认情况下,Action 对象会被 Struts2 自动的放到值栈的栈顶

如:我这里写了一个action

public class Product {

	private Integer productId;
private String productName;
private String productDesc;
private double productPrice; ...省去getter,setter // 会返回到 details.jsp
public String save(){
// 请求save 时,带上参数
System.out.println("save: " + this);
return "success";
}
}

下面是关于details.jsp

<s:debug></s:debug>

<br> ProductName:<%=request.getAttribute("productName")%>
<br> ProductDesc: ${productDesc }
<br> ProductPrice: ${productPrice }

页面的效果为:

ProductName:abc
ProductDesc: 123
ProductPrice: 123.0

查看debug可以看出,Product被放到了栈顶

如果使用<s:property >标签来获取也是可以的( [] 可以省略 )

ProductName: <s:property value="[0].productName" />
ProductDesc: <s:property value=".productDesc" />

4、通过例子,直观ValueStack(对象栈)

还是使用原来的action

public class Product {

	private Integer productId;
private String productName;
private String productDesc;
private double productPrice; // 省去getter,setter // 前台请求的参数为: productName=abc&productDesc=cde&productPrice=123
public String save(){
System.out.println("save: " + this); //1. 获取值栈
ValueStack valueStack = ActionContext.getContext().getValueStack(); //2. 创建 Test 对象, 并为其属性赋值
Test object = new Test();
object.setProductDesc("AABBCCDD");
object.setProductName("ABCD"); //3. 把 Test 对象压入到值栈的栈顶!
valueStack.push(object); return "success";
} }

关于Test类如下

public class Test {

	private String productName;
private String productDesc; // 省去getter,setter
}

接下来,查看页面信息的debug

从这里可以看出,此时Test对象已经在栈顶,所以

${productName}就会获取AABBCCDD

而如果要获取Product对象,就要使用 <s:property value="[1].productName" />

5、使用<s:property /> 获取map栈里面的值

也就是获取request,sesssion,application等

<s:property value="#request.product.productName" />

直接用EL表达式获取也可以

${requestScope.product.productName}

三、ongl表达式读取静态字段或方法(了解)

可以利用 OGNL 调用 (了解)

  • 任何一个 Java 类里的静态字段或方法.
  • 被压入到 ValueStack 栈的对象上的公共字段和方法

默认情况下, Struts2 不允许调用任意 Java 类静态方法, 需要重新设置 struts.ognl.allowStaticMethodAccess 标记变量的值为 true.

<s:property value="@java.lang.Math@PI" />

struts2 值栈分析的更多相关文章

  1. struts2值栈分析

    前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...

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

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

  3. Struts2值栈

    一.前言 很多事儿啊,就是“成也萧何败也萧何”,细想一些事儿心中有感,当然,感慨和本文毛关系都没有~想起之前有篇Struts2中值栈的博客还未完工,就着心中的波澜,狂咽一把~ 二.正文 博文基于:st ...

  4. Struts2值栈详解

    1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的.  2). ...

  5. 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式

    一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...

  6. Struts2 - 值栈(ValueStack)

    1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...

  7. 10.Struts2值栈

    1.什么是值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueSta ...

  8. struts2值栈ValueStack中都有哪些东西?

    com.opensymphony.xwork2.dispatcher.HttpServletRequest application com.opensymphony.xwork2.dispatcher ...

  9. Struts2 值栈总结(ValueStack)

    1.获取值栈 //获取值栈的第一种方式 ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttri ...

随机推荐

  1. error MSB8008: 指定的平台工具集(v110)未安装或无效

    转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...

  2. Java并发:搞定线程池(上)

    原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要 ...

  3. Flink水印机制(watermark)

    Flink流处理时间方式 EventTime 时间发生的时间,例如:点击网站上的某个链接的时间 IngestionTime 某个Flink节点的source operator接收到数据的时间,例如:某 ...

  4. Html5 学习笔记 --》css3 学习

    在开发任务中最好不要使用前缀 可以设置发散图形 圆形 方形等 边框图片效果: CSS3 变形效果: Css3 3D立体变形: css 设置 CSS3 过度效果: div:hover { backgro ...

  5. Android深度探索-卷1第四章心得体会

    这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...

  6. P3375 【模板】KMP字符串匹配——kmp算法

    先上一波题目 https://www.luogu.org/problem/P3375 kmp模板 看了好久才想起来是个什么东西qwq #include<cstdio> #include&l ...

  7. spark streaming 笔记

    spark streaming项目 学习笔记 为什么要flume+kafka? 生成数据有高峰与低峰,如果直接高峰数据过来flume+spark/storm,实时处理容易处理不过来,扛不住压力.而选用 ...

  8. db2备份与恢复

    备份数据库: 离线备份 1.连接至数据库: db2 connect to test user db2admin using db2admin 2.显示数据库应用状态 db2 list applicat ...

  9. webpack从入门到精通(一)

    1.webpack的使用背景: 目前国内前端开发都是基于模块化的 2.webpack的作用有哪些: 3.webpack四大核心理念: entry,output,loaders,plugins 4.使用 ...

  10. 容斥原理+补集转化+MinMax容斥

    容斥原理的思想大家都应该挺熟悉的,然后补集转化其实就是容斥原理的一种应用. 一篇讲容斥的博文https://www.cnblogs.com/gzy-cjoier/p/9686787.html 当我们遇 ...