首页 > 其他 > 详细

struts2.0中ognl栈的解析

时间:2019-06-04 10:05:26      阅读:116      评论:0      收藏:0      [点我收藏+]

ongl详解:

ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是 ValueStack的实现类,客 户端发起一个请求,struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例, OgnlValueStack贯穿整个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储 到值栈中,并通过OGNL表达式读取值栈中的对象属性值。

值栈中分为两个部分:

ContextMap和值栈(root栈)

 OnglValueStack源码:

技术分享图片

 

CompoundRoot栈源码:

技术分享图片

 从源码可以看出 OgnlValueStack由两部分组成;一部分是由实现了 ArrayList 的CompoundRoot组成。另一部分是属于map的key-value类型 

技术分享图片

在idea中打开debug模式,可以看到值栈由两部分组成;context的map类型和root;

技术分享图片

从上面的图中,可以看出context中是存在HashMap(key-value类型);而在context中国都是对象类型;

 在页面中打开debug也可以看到

技术分享图片

技术分享图片

CompoundRoot继承ArrayList 实现压栈和出栈功能,拥有栈的特点,先进后出,后进先出,最后压进栈的数据在栈顶。
CompoundRoot作为OgnlContext的Root对象,并且在CompoundRoot中action实例位于栈顶,

当直接使用表达式,读取deptList的属性值时会先从栈顶对象中查找对应的属性,如果找不到则继续查找栈中的其它对象, 如果未找到则到ContextMap中去查找,未找到,则返回null;
当使用#表达式去,读取deptList的属性值时,会直接从ContextMap中去查找,未找到,则返回null;并在页面中报错;

报错信息:

tag ‘select‘, field ‘list‘, name ‘parentId.deptId‘: The requested list key ‘#deptList‘ could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name}

技术分享图片

使用#表达式的时候在context(key-value)中没有对应的值;

技术分享图片

操作的方法是;

第一种:可以在对应的方法中将key-value放进context栈中即可;

第二种:在页面中直接使用表达式取值即可;

 

struts2.0中ognl栈的解析

原文:https://www.cnblogs.com/ice-image/p/10971797.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!