什么是值栈
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的上下文。贯穿整个应用的对象。
- 通过源码看到,当请求过来的时候,执行过滤器中doFilter方法,在方法中创建ActionContext,同时创建ValueStack并传给ActionContext,所以可以根据ActionContext获取值栈对象
- ActionContext对象访问Servlet的API(访问的是域对象的数据),因为在其内部有值栈的引用。
如何获得值栈
- 通过ActionContext获得值栈
- 在Struts2的内部,将值栈存入request中
- 一个Action实例只会创建一个ValueStack
操作值栈:向值栈存入数据
- 一种:在Action中提供属性的get方法的方式,默认情况下将Action压入值栈,因此Action属性也在值栈中
- 二种:使用ValueStack中本身方法的方式(常用),此种方法压栈,对象在栈顶
方式一:
方式二:压入的对象永远在栈顶
值栈的操作
获取值栈的数据:
获取值栈中的数据:在页面中使用ognl表达式即可
获取root中的数据(不加#):对象和集合中的数据
结果页面:
获取context中的数据(加#):相当于往域里面(如request)去存(不常用)
EL为何能访问值栈的数据
通过查看源代码,发现框架底层对request.getAttribute进行了增强。
如果有,就从request返回,如果没有,就从值栈返回。