• struts2.0中ognl栈的解析


    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栈中即可;

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

  • 相关阅读:
    自学MongoDB(1)
    小心心
    js文件处理File
    jquery图片滚动jquery.scrlooAnimation.js
    jquery图片滚动normalizy.css
    jquery图片滚动demo.css
    jquery图片滚动animate.css
    jquery图片滚动
    C# 数组与集合的区别
    SQL server 批量插入和更新数据
  • 原文地址:https://www.cnblogs.com/ice-image/p/10971797.html
Copyright © 2020-2023  润新知