JavaWeb框架_Struts2_(四)----->表达式语言OGNL
2. 表达式语言OGNL
2.1 OGNL简介
OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression Language, EL)。可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
OGNL是一种对java对象的getter和setter属性的表示和绑定语言。通常,OGNL使用简单一致的表达式语法去存取对象的属性。
2.2 OGNL基本语法
2.2.1 常量
- 字符串常量:以单引号或双引号括起来的字符串。支持转义字符"\";
- 字符常量:以单引号括起来的字符,例如'C';
- 数值常量:java中的int、long、float和double;
- 布尔常量:true和false;
- null常量。
JSP页面中输出常量的示例代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %> <!--加入Struts2的标签库--> <s:property value = "'you said,\"Hello World\".'"/><br>
<s:property value = "true"/><br>
<s:property value = "null"/><br>
<s:property value = "12.3f"/>
2.2.2 操作符
OGNL的逗号支持所有的Java操作符(+、-、*、/、++、--、!=、==、=等)与java类似还提供了一些特有的操作符号。下面介绍OGNL的一些特有的操作符号。
1. 逗号(,)或序列操作符
逗号被用来分隔两个或者多个独立的表达式,整个表达式的值是最后一个表达式的值;例如:
team1.person.name, team2.teamname;
整个表达式的值是第二个表达式的值。
2. 大括号操作符{};
大括号操作符用于创建表(数组)。使用大括号将元素括起来,元素之间使用逗号分隔开。例如:
{"mayun","liyanhong","mahuateng"}[1];
此表达式创建了一个带有三个元素的列表,并且访问其中第二个元素,在JSP页面中输出第二个元素值的代码如下:
<s:property value="{'mayun','liyanhong','mahuateng'}[1]"/>
3. in和not in的操作符
in和not in用来判断一个值是否属于一个集合中。例如:
teamname in {'team1','team2'};
此表达式判断teamname是否在数组{'team1','team2'}中,在返回true,不在返回false。
2.2.3 OGNL表达式
使用OGNL表达式可以访问属性、方法、静态属性和方法、构造方法、数组以及集合等。
1. 访问属性
OGNL访问属性示例代码如下:
<!--访问属性-->
<s:property value = "uname"/> <!--访问对象属性(get和set)-->
<s:property value = "user.age"/>
<s:property value = "employee.manager.uname"/>
2. 访问方法
OGNL访问方法示例代码如下:
<!--访问对象的方法-->
<s:property value = "employee.eat()"/>
<!--访问action的方法-->
<s:property value = "add()"/>
3. 访问静态属性和方法
OGNL支持调用类中的静态方法和静态字段,可以使用如下语法格式:@class@method(args);@class@field;其中,class必须给出完整的类名,如@java.lang.String@valueOf(5)。如果省略class,则默认使用类java.lang.Math。示例代码如下:
<!--访问静态方法-->
<s:property value = "@com.my.ognl.StaticSample@ma()"/>
<!--访问静态属性-->
<s:property value = "@com.my.ognl.StaticSample@STR"/>
<!--访问Math的静态方法-->
<s:property value = "@@max(4,7)"/>
需要注意的是,在配置文件(Struts.xml)中,添加如下常量(夹在<struts>标签中,<package>标签上方),OGNL才能访问静态属性和方法:
<constant name = "Struts.ognl.allowStaticMethodAccess" value = "true"/>
如下图所示:
4. 访问构造方法
OGNL访问构造方法的示例代码如下:
<!--访问构造方法-->
<s:property value = "new com.my.org.User(44)"/>
5. 访问集合和数值
可以使用OGNL语言直接生成集合元素(如List对象或Map对象);利用下式代码可以直接生成一个List对象:
{e1,e2,e3};
可以使用如下代码直接生成一个Map对象:
# {key1:value1 , key2:value2 , key3:value3};
Map集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间采用逗号隔开。对于集合类型OGNL可以使用in和not in两个元素符号,判断元素是否在指定的集合内。
需要注意的是,OGNL能够引用集合的一些特殊的属性,这些属性不是JavaBeans模式,如size。当表达式引用这些属性时, OGNL 会调用相应的方法,这就是伪属性。
OGNL中特殊的集合伪书性如下表所示:
集合类型 | 伪属性 | OGNL表达式 | Java代码 |
List,Set,Map | size;isEmpty | list.size;set.isEmpty | list.size();set.isEmpty |
List,Set | iterator | list.iterator;set.iterator | list.iterator();set.iterator() |
Map | keys,values | map.keys;map.values | map.keySet();map.values() |
Iterator | next,hasNext | it.next;it.hasNext | it.next();it.hasNext() |
6. 投影
OGNL中提供了一种简单的方式在一个集合中对每一个元素调用相同的方法,或抽取相同的属性,并将结果保存为一个新的集合,称为投影。
假设employees是一个包含了employee对象的列表,那么:
# employees.{name} // 表示返回所有雇员的名字的列表
在投影期间,使用 # this变量来引用迭代中的当前元素。例如:
Object.{#this instanceof String? #this: #this.toString()}
7. 选择
OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。其中选择表达式中的关于选择的特殊字符说明如下:
- ?:选取匹配逻辑的所有元素;
- ^:选取匹配选择逻辑的第一个元素;
- $:选取匹配的最后一个元素;
示例代码如下:
<!--将返回薪水大于3000雇员的列表-->
# employees.{?#this.salary > 3000}
<!--将返回第一个薪水大于3000的雇员-->
# employees.{^#this.salary > 3000}
<!--将返回最后一个薪水大于3000的雇员-->
# employees.{$#this.salary > 3000}
8. OGNL表达式符号
在Struts2 OGNL中的#和%符号用法说明如下:
(1) #符号
- 访问非根对象属性,如 #session.msg表达式,# 相当于ActionContext.getContext();
- 用于选择和投影集合,如person.{?#this.age>30};
- 用来构造Map集合,如 #{0:男,1:女}
(2) %符号
%符号的用途是,在标志的属性为字符串类型时,计算OGNL表达式的值。例如,下面的代码所示:
<s:set name = "foobar" value="# {'foo1':'bar','foo2':'bar2'}"/>
<s:url value="%{#foobar['fool']}"/>
2.3 OGNL基础
2.3.1 OGNL上下文
OGNL的计算都是围绕上下文进行的,OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类(实现了java. util. Map接口)来表示。
Struts2将OGNLContext设置为ActionContext,即在Struts2中OGNL上下文(Context)的实现为ActionContext。Struts2将ValueStack(值栈)作为OGNL的根对象。
当Struts2接受一个请求时,会迅速创建ActionContext(上下文),ValueStack(值栈),action。然后把action存进ValueStack,所以action的实例变量可以被OGNL访问。在Struts2中,OGNL表达式需要配合Struts2标签才可以使用,如下所示:
<s:property value = "uname"/>
2.3.2 值栈
值栈作为OGNL的根对象(root对象),类似于正常的栈,符合”后进先出“的特点,可以在值栈中放入、删除、查询对象,值栈是Struts2的核心。
如果要访问根对象(即ValueStack)中的对象的属性,则可以省略 # 命名空间,直接访问该对象的属性既可。如下,读取栈中的数据。
<!--按照后进先出的方式,读取栈中元素-->
<s:property value="#root[0].loginname"/>
<s:property value="#root[1].loginname"/>
<s:property value="#root[2].loginname"/>
2.3.3 OGNL的访问
由于ValueStack是Struts2中的OGNL的根对象。如果用户需要访问值栈中的对象,在JSP页面可以通过输入如下表达式语言(EL)访问ValueStack中对象的属性:
<!--获得值栈中某个对象的foo属性-->
$ {foo} <!--也可以通过Struts标签访问ValueStack中的对象-->
<s:property value="foo"/>
如果访问其他Context中的对象,由于它们不是根对象,所以在访问时,需要添加 # 前缀。具体如下:
- application对象:用于访问ServletContext,如 # application.userName 或者 # application['userName'],相当于调用了ServletContext 的 getAttribute("username");
- session对象:用来访问HttpSession,如 # session.userName 或者 # session['userName'],相当于调用了session .getAttribute('userName');
- request对象:用来访问HttpServletRequest属性的Map,如 # request.userName 或者 # request['userName'],相当于调用request.getAttribute("userName");
- parameters对象:用来访问HTTP的请求参数,如 # parameters.userName 或者 # parameters['userName'],相当于调用 requst.getParameter("userName")。
JavaWeb框架_Struts2_(四)----->表达式语言OGNL的更多相关文章
- JavaWeb框架SSH_Struts2_(四)----->表达式语言OGNL
1. 表达式语言OGNL OGNL简介 OGNL基本语法 常量 操作符 OGNL表达式 OGNL基础 OGNL上下文 OGNL值栈 OGNL的访问 2. 具体内容 2.1 OGNL简介 OGNL(Ob ...
- JavaWeb框架_Struts2_(六)----->Struts2的输入校验
1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...
- JavaWeb框架_Struts2_(二)----->Struts2的核心配置
2. Struts2的核心配置 2.1 配置Struts.xml文件 2.1.1 Struts.xml文件 Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和 ...
- JavaWeb框架_Struts2_(七)----->文件的上传和下载
这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量 ...
- JavaWeb框架_Struts2_(八)----->Struts2的国际化
这一篇博文拖了蛮久了,现在先把它完成,结束struts2这个版块,当然这只是最基础的部分,做项目还需要更深的理解.下一个web后端的版块准备做Spring框架的学习-嗯,加油! 1. Struts2的 ...
- JavaWeb框架_Struts2_(一)----->Struts2 框架入门
1. 框架入门 2.1 Struts2简介 (1). Struts2是一种基于MVC模式的的轻量级Web开发框架. MVC模式:MVC全名是Model View Controller,是模型(mo ...
- JavaWeb框架_Struts2_(五)----->Struts2的标签库
1. Struts2的标签库 1.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1 ...
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...
- JavaWeb框架之Struts2 ---- 系列学习
JavaWeb框架_Struts2_(七)----->文件的上传和下载 JavaWeb框架_Struts2_(六)----->Struts2的输入校验 JavaWeb框架_Struts2_ ...
随机推荐
- windows下载Mysql-python
Mysql-python第三方模块官方不支持windows系统,而国外大学提供了非官方 的支持windows系统的模块,可前往 https://www.lfd.uci.edu/~gohlke/pyth ...
- yuv转opencv中的IplImage
http://www.2cto.com/kf/201208/145559.html http://www.opencv.org.cn/forum.php?mod=viewthread&tid= ...
- CSS3 画点好玩的东西
虽然项目赶工还是挺忙的,但闲了总要找点乐子嘛,毕竟秃顶和猝死两座大山夹逼着编程员们. 好吧,其实是无聊起来我自己都怕,于是就做了点小玩意. .heart { position: relative; t ...
- 【鸟哥的Linux私房菜】笔记3
正确地开机 最好不要使用root账号登陆!GNOME图形界面 View items as a list X WindowShell 文本交互界面bash是Shell的名称,Linux的默认壳程序就是b ...
- FANCO工程机械云平台
此系统专门为工程机械设备使用单位定制合理的生产要求,监控生产状况,快速体现产值,通过算法计算绩效等
- win7 与 Ubuntu 16.04 文件传送
win7 与 Ubuntu 16.04 文件传送 环境:主机系统为win7,虚拟机为vmware12, 虚拟系统为ubuntu 16.04 方案一: 通过虚拟机vmware的共享文件夹实现. 方案二: ...
- Android系统开发--灯光系统之电池灯的流程分析
Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...
- 剑指Offer——链表中倒数第k个节点
Question 输入一个链表,输出该链表中倒数第k个结点. Solution 一种想法就是扫描两边,第一遍求出总的节点个数,第二遍从头开始走n-k个 第二种思想类似于fast-slow指针的方法,f ...
- ANT+JMETER集成1(生成报告)
配置build.xml文件时,网上找了各种版本的代码都会报错, 终于找到个可以生成报告的build源码了 链接: http://www.cnblogs.com/hanxiaomin/p/6731810 ...
- 如何破解mssql for linux 3.5G内存的限制
在上有篇博客中主要介绍了如何在CentOS 中安装和配置mssql ,在安装过程中遇到3.5G内存的限制,下面介绍如何去破解, 微软发布了SQLServer for Linux,但是安装竟然需要3.5 ...