值栈

什么是值栈

  • 在web阶段,在servlet 里面进行操作,把数据放到域对象里面,在页面中使用EL表达式获取值
  • 在struts2里面提供本身的一种存储机制,类似于域对象,是值栈,可以存值和取值
    • 把action里的数据放到值栈里面,在页面中获取到值栈的数据
  • Servlet 和 action区别
    • Servlet默认是在第一次访问的时候创建,创建一次,单实例对象
    • action:访问的时候创建,==每次访问action的时候,都会创建action对象,创建多次,多实例对象==
  • 值栈的存储位置
    • 每次访问action的时候都会创建action 对象
    • ==在每个action对象里面都会有一个值栈对象(只有一个==)这里写图片描述

如何获取值栈对象


    • 是一种数据存储结构,先进后出,后进先出
    • 往栈里存储数据的过程叫做压栈
    • 最上层的元素叫做栈顶元素这里写图片描述
  • 常用的方式,使用actionContext类里面的方法得到值栈这里写图片描述
  • 每个action对象里只有一个值栈对象这里写图片描述

值栈的内部结构

  • 这里写图片描述
  • 包含两部分
    • root :list结构
    • context :map数据结构
      • Context存储的对象的引用这里写图片描述

使用s:debug标签查看值栈结构和存储值

  • 访问action 跳转到jsp 。jsp页面使用s:debug这个标签
  • 创建action类这里写图片描述
  • 配置struts核心配置文件这里写图片描述
  • 在jsp页面中使用debug标签这里写图片描述
  • 访问action这里写图片描述
  • 点击debug查看值栈内部结构这里写图片描述
    • 发现栈顶元素是我们定义的action,也就是说,在action中有值栈对象,同时在值栈对象内有action的引用

向值栈放数据

  • 第一种:==获取值栈对象获取值栈对象里的set方法==
    • action类这里写图片描述
    • 结果,当访问action,查看值栈内部结构,发现已经设置进入了,栈顶元素是一个map这里写图片描述
  • 第二种:获取值栈对象,调用值栈里面的push方法

    • 写action类这里写图片描述
    • 结果:这里写图片描述
  • 第三种:==在action定义变量,生成变量的get方法==

    • action类这里写图片描述
    • 结果:这里写图片描述
    • ==第一种和第二种设置数据都会开辟一个新的空间存放,第三种方式设置的数据是封装在action内的,占用空间小,推荐使用==

案例:向值栈中放置对象,使用第三中方式

  • action类这里写图片描述
  • 结果:这里写图片描述

案例:将集合放置到值栈中,使用第三种方式

  • action 类这里写图片描述
  • 结果:这里写图片描述

从值栈中获取字符串

  • 使用struts2标签加上ognl表达式获取值栈数据
  • 获取字符串
    • 向值栈放置字符串这里写图片描述
    • 通过struts2标签和ognl表达式获取值栈的数据这里写图片描述

从值栈中获取对象

  • 给值栈设置数据这里写图片描述
  • 通过使用struts2 标签和ognl表达式获取值栈的数据这里写图片描述
  • 访问demo3.action 跳转到了b.jsp页面显示值栈的数据

从值栈中获取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表达式==是不识别,只有添加了%后才会识别这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值