十七 值栈,数据的存取

 

 

什么是值栈

valuestack实际类似于一个数据中转站(Struts2的框架当中的数据就都保存到了ValueStack中)

  • ValueStack接口,实现类OgnlValueStrak对象。
  • ValueStack贯穿整个Action的生命周期(当Action创建,框架创建ValueStack对象)

 

值栈的内部结构

有两个主要区域:

  • root区域:查看源代码,其实是一个ArrayList,里面放置的是Object(java对象)
  • context区域:查看源代码,其实是一个Map,内有web常见对象的引用(往request\session里存值相当于操作context区)
  • 所谓操作值栈,通常指的是操作ValueStack的root区域

 

值栈与ActionContext的关系

  • ActionContext:Action的上下文。
  • ServletContext:servlet的上下文。贯穿整个应用的对象。
  1. 通过源码看到,当请求过来的时候,执行过滤器中doFilter方法,在方法中创建ActionContext,同时创建ValueStack并传给ActionContext,所以可以根据ActionContext获取值栈对象
  2. ActionContext对象访问Servlet的API(访问的是域对象的数据),因为在其内部有值栈的引用。

如何获得值栈

  • 通过ActionContext获得值栈
  • 在Struts2的内部,将值栈存入request中
  • 一个Action实例只会创建一个ValueStack

 

操作值栈:向值栈存入数据

  • 一种:在Action中提供属性的get方法的方式,默认情况下将Action压入值栈,因此Action属性也在值栈中
  • 二种:使用ValueStack中本身方法的方式(常用),此种方法压栈,对象在栈顶

方式一:

方式二:压入的对象永远在栈顶

 

 

 

 值栈的操作

获取值栈的数据:

获取值栈中的数据:在页面中使用ognl表达式即可

    获取root中的数据(不加#):对象和集合中的数据

 

结果页面:

 

 获取context中的数据(加#):相当于往域里面(如request)去存(不常用)

 

 

EL为何能访问值栈的数据

通过查看源代码,发现框架底层对request.getAttribute进行了增强。

如果有,就从request返回,如果没有,就从值栈返回。

 

转载于:https://www.cnblogs.com/ltfxy/p/9832049.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值