Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 942|回复: 0

Struts2使用之值栈与OGNL-概述

[复制链接]

该用户从未签到

发表于 2011-10-9 23:41:57 | 显示全部楼层 |阅读模式
值栈的含义正如它的名字所表示的那样——对象所组成的栈。OGNL的全称是Object Graph Navigational Language(对象图导航语言),提供了访问值栈中对象的统一方式。它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

值栈中的对象构成及其排列顺序如下所示:

1.  临时对象——在执行过程中,临时对象被创建出来并放到了值栈中。举个例子来说,像JSP标签所遍历的对象容器中,当前访问到的值就是临时对象

2.  模型对象——如果模型对象正在使用,那么会放在值栈中action的上面

3.  Action对象——正在被执行的action

4.  固定名称的对象(Named Objects)——这些对象包括有#application, #session, #request, #attr 和 #parameters,以及相应的Servlet作用域

访问值栈可以有很多方法,其中最常用的一种就是使用JSP,Velocity或者freemarker提供的标签。还有就是使用HTML标签访问值栈中对象的属性;结合表达式使用控制标签(例如if,elseif和iterator);使用data标签(set和push)来控制值栈本身。

在使用值栈时,我们无须关心目标对象的作用域。如果要使用名为“name”的属性,直接从值栈中进行查询就可以了。值栈中的每一个元素,都会按照排列顺序依次检查是否拥有该属性。如果有的话,那么就返回对应的值,查询结束。如果没有的话,那么下一个元素就会被访问……直到到达值栈的末尾。这个功能非常强大,我们根本不需要知道所需要的值在什么地方——存在于Action,模型或是HTTP请求中——只要这个值存在,它就会被返回。

但它也有个缺点。如果所请求的是很常见的属性(例如“id”),而你想要从某个特定的对象中(例如action)获取该属性的值,这时候值栈中第一个满足条件的对象返回的属性值就可能不是所想要的结果了。返回结果的确是“id”属性的值,但它可能来自JSP标签,临时对象或者模型对象。这时候就需要用到OGNL来增强值栈的功能了。OSGL并不仅限于访问对象属性,如果我们知道某个action在值栈中的深度,那么就可以用“[2].id”来替换掉“id”。

实际上OGNL是一套完整的表达式语言。在OGNL里面,可以用“.”来遍历对象图(比如说,使用“person.address”而不是“getPerson().getAddress()”),它还提供了类型转换,方法调用,集合的操作与生成,集合间的映射,表达式运算和lambda表达式。OGNL的网站上提供了一套完整的指南,地址为

http://www.ognl.org/2.6.9/Docume ... ageGuide/index.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-3 13:14 , Processed in 0.373362 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表