Ognl值栈对象及struts标签
用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象;然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面(key: struts.valueStack)。
值栈的内存结构分为:
map栈:
request
session
application
list栈:
action及全局对象
我们只需要通过ActionContext对象就可以访问struts的其他的关键对象。
public class OgnlDemo2 extends ActionSupport {
private User user = new User(100,"Jacks");
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
ActionContext ac = ActionContext.getContext();
ac.put("test", new User(222, "Ronaldo"));
ValueStack vs = ac.getValueStack();
vs.push(new User(111, "Asen"));
return SUCCESS;
}
}
struts会将全局属性及action对象放入根元素中即list栈,如图:

以下方法可以操作该栈对象
vs.push(new User(101, "Asen"));//可以list栈顶添加对象
vs.pop();//可以移除list栈顶对象
vs.set("new_user", new User(222, "Ronaldo"));//也可以往list栈添加元素

ac.getContextMap().put("user1", new User(111, "mapUser"));
ac.getSession().put("user2", new User(444, "sessionUser"));
ac.getApplication().put("user3", new User(5555, "applicationUser"));
可以向map栈(OgnlContext)添加对象

从这个table里可以找到:
user1=com.asen.test4.entity.User@7dbeb971
session={user2=com.asen.test4.entity.User@59713249}
application={user3=com.asen.test4.entity.User@9482b33
综上所述:
ActionContext.getContext().put(String key, Object value)放入map栈(OgnlContext)
ActioinContext.getContext().getValueStack().push(Object value)放入list栈
在jsp页面我们可以通过struts标签获取值栈里的对象
对于map栈的数据,加#号访问
<s:iterator value="#test">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
</tr>
</s:iterator>
ognl表达式对于list栈的数据直接根据key值提取value值就可以了
<s:property value="id" />
还可以用
<td><s:textarea name="id" /></td> <h2>ValueStack vs = ac.getValueStack();</h2>
<h2>vs.push(new User(111, "Asen"));</h2>
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
</tr>
<tr>
<td><s:textfield name="id" /></td>
<td><s:textfield name="name" /></td>
</tr> <h2>private User user = new User(100,"Jacks");</h2>
<tr>
<td><s:property value="user.id" /></td>
<td><s:property value="user.name" /></td>
</tr>
以上是前端页面获取到数据,接下来是前端页面提交数据到服务器,服务器接收数据
假如有一个用来处理客户的 CustomerAction 类, 该动作类实现了 ModelDriven 接口,当用户触发CustomerAction 动作时, ModelDriven 拦截器将调用相关CustomerAction 对象的 getModel() 方法, 并把返回的模型(Customer实例)压入到 ValueStack 栈. 接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Product)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象.
Department department = new Department();
/**
* 把model的值赋值给了department
*/
BeanUtils.copyProperties(this.getModel(), department);
Ognl值栈对象及struts标签的更多相关文章
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- struts2中的值栈对象ValueStack
ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...
- Struts2_day03--课程安排_OGNL概述入门_什么是值栈_获取值栈对象_值栈内部结构
Struts2_day03 上节内容 今天内容 OGNL概述 OGNL入门案例 什么是值栈 获取值栈对象 值栈内部结构 向值栈放数据 向值栈放对象 向值栈放list集合 从值栈获取数据 获取字符串 获 ...
- Struts2-获取值栈对象与结构
1.获取值栈对象有多种方式 (1)使用ActionContext类里面的方法获取值栈对象 @Override public String execute(){ //1.获取ActionContext类 ...
- Struts笔记二:栈值的内存区域及标签和拦截器
值栈和ognl表达式 1.只要是一个MVC框架,必须解决数据的存和取的问题 2.struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 1. ValueStack是一个接口,在struts ...
- Struts(九):值栈(OGNL)
引言 在我们开发过程中,往往会使用一个对像传递到一个具体的action中,之后到跳转页面中访问对应对象的具体的参数. 比如:我们搭建一个struts2项目: 回顾下如何搭建strut2: 1.下载的s ...
- struts框架问题四之获取到值栈的对象
4. 问题四 : 如何获得值栈对象 * 获得值栈对象 有三种方法 * ValueStack vs1 = (ValueStack) ServletActionContext.getRequest().g ...
- struts框架值栈问题三之值栈的创建和ActionContext对象的关系
3. 问题三 : 值栈对象的创建,ValueStack 和 ActionContext 是什么关系? * 值栈对象是请求时创建的 * ActionContext是绑定到当前的线程上(一个Action访 ...
随机推荐
- PHP 性能追踪及分析工具(XHPROF)
原文:https://gold.xitu.io/post/5860d23f128fe10069e1cfbf XHPROF:Facebook 开源的轻量级PHP性能分析工具. 它报告函数级别的请求次数和 ...
- 华为AR1220新机试用
今天刚刚收到华为AR1220,以为直接就可以用web界面管理,结果开机后才知道web管理界面需要激活. 下面简单分享这个过程: *** 用控制台线(一边RJ45,一边9针串)连接Router cons ...
- 网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)
原文链接:http://www.bzfshop.net/article/176.html 网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路.找几百个电脑(肉鸡),控制这些电脑同时 ...
- 在web前端使用SVG
前言: 花了些时间了解了一下svg,然而仍然不怎么了解... 第一步:直接在html代码中使用svg. 首先了解几个标签: <svg version="1.1" xmlns= ...
- SSH系统介绍
SSH的系统中,对象的调用流程是:JSP->Action->Service->DAO->Hibernate,数据的流向是ActionFormBean接受用户的数据,Action ...
- mysql 无法启动的原因Can't start server: can't create PID file: No space left on device
一大早来到公司,看到了一个噩梦,后台总是登录不上,登录就出错,还以为被黑客入侵了.经过1个小时的排错原因如下: 我的服务器是linux的,mysql的报错日志路径是/var/log/,经过查看日志发现 ...
- 数组的map方法
map方法 不支持IE6.7 .8 array1.map(fn) array1.map(fn[,thisArg]) 注意: fn 必须是函数,如果不是函数则会报错 TypeError: undefi ...
- 各个浏览器开启CSS Grid Layout的方式
2017年3月,Chrome.Firefox将开启默认支持. 当然对于很多人等不及浏览器默认支持,想提前体验一把,这里提供一些打开方式: 1.Chrome 在浏览器中输入:chrome://flags ...
- Jquery实现的几款漂亮的时间轴
引言 最近项目中使用了很多前端的东西,对于我一个做后台开发的人员,这是一个很好的锻炼的机会.经过这段时间的学习,感觉前端的东西太多了,太强大了,做出来的东西太炫酷了.现在有很多开源的前端框架,做的都非 ...
- MyBatis 源码分析——介绍
笔者第一次接触跟MyBatis框架是在2009年未的时候.不过那个时候的他并不叫MyBatis,而是叫IBatis.2010年的时候改为现在的名字--MyBatis.这几年过去了,对于笔者来讲有一点陌 ...