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栈中即可;
第二种:在页面中直接使用表达式取值即可;
struts2.0中ognl栈的解析的更多相关文章
- struts2.0中struts.xml配置文件详解
		
先来展示一个配置文件 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration ...
 - struts2 ValueStack(值栈)解析
		
Struts2一个重要点就是值栈. ValueStack,是用来存储一些在各个action,或者说是通过s标签.el表达式等给前台Jsp等页面展示的东西. ValueStack是一个接口,其内部接口非 ...
 - Struts2.0中ActionInvocation使用
		
Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法.而它所依赖的参数ActionInvocation则是我们 ...
 - 关于struts2.0 中 struts.xml设置了struts.devMode 的值为TRUE后仍然不起作用的分析
		
首先确认jdk 和tomcat的环境变量是否配置正确. 下面是配置方式 jdk的环境变量配置步骤: 安装j2sdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量- ...
 - struts2框架之OGNL表达式概述(在代码中使用OGNL表达式)
		
1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象 * 通 ...
 - ognl,jstl,struts2标签中符号#,$,%的用法
		
STRUTS2标签操作Map <s:iterator value="sundayMap"> <td colspan="7" ...
 - Struts2中OGNL
		
什么是OGNL OGNL:Object Graph Navigation Language 对象导航图语言 开源项目,取代页面中Java脚本,简化数据访问 和EL同属于表达式语言,但功能更为强大 让 ...
 - 在Struts2框架中使用OGNL表达式(在jsp页面中使用OGNL表达式)
		
1. Struts2引入了OGNL表达式,主要是在JSP页面中获取值栈中的值 2. 具体在Struts2中怎么使用呢?如下步骤 * 需要先引入Struts2的标签库(在JSP页面的最上面位置) > ...
 - Struts2中OGNL表达式的用法
		
今天分享的是Struts2框架中的一种ognl表达式语言,主要分两个目标去学习 1.理解struts2传值的优先级 2.ognl与el的区别 一:ognl表达式语言简介 OGNL的全称是O ...
 
随机推荐
- MySQL 索引的类型
			
主键索引(PRIMARY KEY) # 主键 = 唯一键索引 + 非空 + 只能设置一个字段 # 创建表的时候创建主键索引 mysql> create table test(id int not ...
 - KEIL5 使用STM32 官方例程
			
1. 安装keil5,破解 网上很多安装包/教程,跳过 2.下载官方固件库 https://www.st.com/content/st_com/en.html 在这里找微处理器,STM32 stand ...
 - codeforces 1042D - Petya and Array【树状数组+离散化】
			
题目:戳这里 题意:有n个数,问有多少个区间满足[L,R]内的和小于t. 解题思路: [L,R]内的和小于t等价于sum[R]-sum[L-1]<t,将sum[L-1]左移,可以看出R与L的关系 ...
 - oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式
			
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...
 - nmap进阶使用[脚本篇]
			
nmap 进阶使用 [ 脚本篇 ] 2017-05-18 NMAP 0x01 前言 因为今天的重点并非nmap本身使用,这次主要还是想给大家介绍一些在实战中相对比较实用的nmap脚本,所以关于 ...
 - cnblogs blogs backup & node.js crawler
			
cnblogs blogs backup & node.js crawler refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访 ...
 - 前端架构模式 All In One
			
前端架构模式 All In One 架构模式 同构 异构 微前端 Web Components 组件化 无框架 去框架 前后端分离 前端架构图 Clean Architecture https://b ...
 - Swift All in One
			
Swift All in One Swift 5.3 https://github.com/apple/swift-evolution Xcode https://developer.apple.co ...
 - 联合登录 & OAuth 2.0 & OpenID
			
联合登录 & OAuth 2.0 & OpenID 第三方联合登录一般可以降低网站的获客成本,所以一般的网站都会做一些联合登录,常用的就是QQ.微信.微博; https://www.z ...
 - Android Webview & iframe auto full screen
			
Android Webview & iframe auto full screen android webview iframe 全屏适配 https://stackoverflow.com/ ...