struts2 值栈分析
一、值栈分为两个逻辑部分
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、读取对象栈中对象的属性:
- 若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一:
object.propertyName ;
object['propertyName'];
object["propertyName"]
- ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,
它下面的那个对象可以用 [1] 引用.
[0].message
[n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象.(也就是说,0找不到,就找1,以此类推)
若从栈顶对象开始搜索, 则可以省略下标部分: message
结合 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 值栈分析的更多相关文章
- struts2值栈分析
前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...
- struts2值栈内部数据结构详解
值栈是struts2内部一片很重要的区域,我在初学的时候,发现对于值栈这个数据结构的理解不是很深刻.例如OGNLContext是什么,ActionContext和值栈有什么关系.为什么ActionCo ...
- Struts2值栈
一.前言 很多事儿啊,就是“成也萧何败也萧何”,细想一些事儿心中有感,当然,感慨和本文毛关系都没有~想起之前有篇Struts2中值栈的博客还未完工,就着心中的波澜,狂咽一把~ 二.正文 博文基于:st ...
- Struts2值栈详解
1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...
- 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式
一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...
- Struts2 - 值栈(ValueStack)
1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...
- 10.Struts2值栈
1.什么是值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueSta ...
- struts2值栈ValueStack中都有哪些东西?
com.opensymphony.xwork2.dispatcher.HttpServletRequest application com.opensymphony.xwork2.dispatcher ...
- Struts2 值栈总结(ValueStack)
1.获取值栈 //获取值栈的第一种方式 ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttri ...
随机推荐
- vue将页面导出成pdf
npm i jspdf-html2canvas prinOut(){ // 导出pdf let page = document.querySelector('.app-main'); // page ...
- (二)linux内核准备及编译
1. 内核下载地址 linux内核网站,可以拿到最新的和最近的稳定版本内核: https://www.kernel.org/ 通过网站下载压缩包后解压或者使用git下载到本地: git clone h ...
- 嵌入式开发环境搭建(一) 虚拟机实现桥接Ethernet网口 并且通过WIFI进行NAT联网
背景: 目前手头上有一块JZ2440的板子,之前有搭建完整套开发环境,由于虚拟机故障需要从新搭建服务器端,故在此记录搭建步骤 环境: Ubuntu16.4 VMWare 12 先行条件: 先按照自定义 ...
- 测开之路三十二:Flask基础之错误与重定向
错误处理,框架默认的错误为:not Found 可以捕获,并自定义 准备一张自定义图片,放在static文件夹下,并在template下创建一个html文件,引用该图片 捕获404状态,返回自定义页面 ...
- Visual C++中error spawning cl.exe解决办法
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天安装Vc6.0的时候出现了一个error spawning cl.exe的错误,在网上找了一些资料,才知道这是因为路径设置的问题引起的 ...
- java反射(三)--反射与操作类
一.反射与操作类 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成的操作,任何一个类的基本组成结构:父类(父接口),包,属性,方法(构造方法,普通方法)--获取类的 ...
- ES6中的CLASS继承
ES6中的CLASS继承:https://www.jianshu.com/p/3d3d52b47762 es6 javascript的Class 类的继承:https://blog.csdn.net/ ...
- SVN 目录 定义
1.项目名称定义: 项目自然序号_项目名称_负责人名称 例如:23_测试项目_An 2.项目目录定义: 01_Source 注:01_Source 中包含 代码 和 DB 设计 02_Document ...
- Centos,tomcat
1.下载tomcat9.0,解压,配置 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apa ...
- SQL数据库—<6-001> 常用系统存储过程大全 --摘录网
-- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...