值栈
什么是值栈
- 在web阶段,在servlet 里面进行操作,把数据放到域对象里面,在页面中使用EL表达式获取值
- 在struts2里面提供本身的一种存储机制,类似于域对象,是值栈,可以存值和取值
- 把action里的数据放到值栈里面,在页面中获取到值栈的数据
- Servlet 和 action区别
- Servlet默认是在第一次访问的时候创建,创建一次,单实例对象
- action:访问的时候创建,==每次访问action的时候,都会创建action对象,创建多次,多实例对象==
- 值栈的存储位置
- 每次访问action的时候都会创建action 对象
- ==在每个action对象里面都会有一个值栈对象(只有一个==)
如何获取值栈对象
- 栈
- 是一种数据存储结构,先进后出,后进先出
- 往栈里存储数据的过程叫做压栈
- 最上层的元素叫做栈顶元素
- 常用的方式,使用actionContext类里面的方法得到值栈
- 每个action对象里只有一个值栈对象
值栈的内部结构
- 包含两部分
- root :list结构
- context :map数据结构
- Context存储的对象的引用
- Context存储的对象的引用
使用s:debug标签查看值栈结构和存储值
- 访问action 跳转到jsp 。jsp页面使用s:debug这个标签
- 创建action类
- 配置struts核心配置文件
- 在jsp页面中使用debug标签
- 访问action
- 点击debug查看值栈内部结构
- 发现栈顶元素是我们定义的action,也就是说,在action中有值栈对象,同时在值栈对象内有action的引用
向值栈放数据
- 第一种:==获取值栈对象获取值栈对象里的set方法==
- action类
- 结果,当访问action,查看值栈内部结构,发现已经设置进入了,栈顶元素是一个map
- action类
-
第二种:获取值栈对象,调用值栈里面的push方法
- 写action类
- 结果:
- 写action类
-
第三种:==在action定义变量,生成变量的get方法==
- action类
- 结果:
- ==第一种和第二种设置数据都会开辟一个新的空间存放,第三种方式设置的数据是封装在action内的,占用空间小,推荐使用==
- action类
案例:向值栈中放置对象,使用第三中方式
- action类
- 结果:
案例:将集合放置到值栈中,使用第三种方式
- action 类
- 结果:
从值栈中获取字符串
- 使用struts2标签加上ognl表达式获取值栈数据
- 获取字符串
- 向值栈放置字符串
- 通过struts2标签和ognl表达式获取值栈的数据
- 向值栈放置字符串
从值栈中获取对象
- 给值栈设置数据
- 通过使用struts2 标签和ognl表达式获取值栈的数据
- 访问demo3.action 跳转到了b.jsp页面显示值栈的数据
从值栈中获取list集合
- 向值栈中放置数据
- 从值栈中获取数据第一种方式
- 通过下标获取list集合中的元素
- 通过下标获取list集合中的元素
- 第二中方式
-
第三种方式
- iterator 获取出来的集合元素会放到值栈中的Context中,key是var指定的值,value是遍历的元素
- 获取Context的数据,需要使用特殊符号#
-
==注释需要注意的==
- html注释 \不能注释struts标签,否则报错
- 可以使用jsp注释<%– –%>
获取set方式设置的数据
- set方式设置的数据是个键值对
- 通过键的名字直接获取数据
获取push方式设置的数据
- push方式设置的数据是个String类型
- 设置的值放在了一个值栈中root部分数组里面,数组的名字是top,根据索引获取值,栈顶元素的索引是0
详解为什么EL表达式可以获取值栈数据
- EL表达式获取的是request域对象中的数据
- 使用EL表达式会首先从域对象中获取数据,如果域对象中没有,那么就从值栈中获取 数据,将数据设置到request域对象中
- 最后获取的还是从域对象中获取的
- 因为有个从值栈设置到域对象的过程,所以通过EL表达式获取值栈数据效率很低,不建议使用
ognl表达式中的特殊符号
- # 用来获取值栈Context部分的数据
- % 如果直接在==struts2表单标签里使用ognl表达式==是不识别,只有添加了%后才会识别