第四节 Struts2 - OGNL详解
Posted JAVA的学习之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四节 Struts2 - OGNL详解相关的知识,希望对你有一定的参考价值。
1. 什么是 OGNL
OGNL(Object-Graph Navigation Language,对象图导航语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性以及调用对象的方法。它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。
OGNL是Struts2的默认表达语言,OGNL表达式的计算是围绕OGNL上下文(Context)进行的,相当于一个Map对象,见下图的结构:
刚刚这种传统的定义,可能你看完还是不太理解。没关系,还记得Struts-Hello World这节课吗?输入一个名字,然后显示Hello。这个名字在页面中怎么显示的呢?我们可以再来看一下:
<body>
Hello World, Welcome! <s:property value="name"/></body>
<s:property value="name"/>
这便是OGNL的一种应用,访问action的普通属性。
2 .OGNL中重要的3个符号:#
、%
、$
#
符号
通常有三种用法:
访问非root对象。
用于过滤和投影集合。
构造Map,例如:#{'key1':'value1', 'key2':'value2'}。
%
符号
用途是告诉标签的处理类将它包含的字符串,强行按照OGNL表达式处理。例如:
<s:set name="mySet" value="#{'key1':'value1','key2':'value2'}" />
<s:property value="#mySet['key1']"/> //输出的是value1
<s:url value="#mySet['key1']" /> //输出的是#mySet['key1']<s:url value="%{#mySet['key1']}"/> //输出的是value1
$
符号
通常在struts.xml配置文件中的使用方式如下:
<field-validator type="stringlength">
<param name="maxLength">18</param>
<param name="minLength">6</param>
<param name="trim">true</param>
<message>密码强度必须在 ${minLength}到${maxLength} 之间!</message>
</field-validator>
3. 访问普通方法、属性、构造方法
<!-- 1. 访问Value Stack中action的普通属性 --><s:property value="name"/><!-- 2. 访问Value Stack中对象的普通属性(要有get set方法) --><!-- 第一种方式 --><s:property value="user.age"/> <!-- 第二种方式 --><s:property value="user['age']"/><!-- 错误方法 --><!-- <s:property value="user[age]"/> --><!-- 3.调用Value Stack中对象的普通方法 --><s:property value="user.setName('master')" /> | 结果显示: <s:property value="user.name"/> //输出结果为 “结果显示:master”<!-- 4.调用Value Stack中action属性的方法 --><s:property value="name.length()"/><!-- 5.调用Value Stack中action的普通方法 --><s:property value="add()" /><!-- 6.调用普通类的构造方法 --><s:property value="new user.User()"/> //实例化一个对象
4. 访问静态方法
注意:在访问静态方法、静态变量之前,要先在struts2.xml中配置 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
,设置静态方法调用为true,否则访问不到数据。
访问静态属性
/* 访问静态属性表达式的格式为:@[类全名(包括包路径)]@[值名] */<s:property value="@action.UserAction@index"/>
调用静态方法
/* 调用静态方法表达式的格式为:@[类全名(包括包路径)]@[方法名] */<s:property value="@action.UserAction@getInstance()"/>
调用 Math 类的静态方法
<s:property value="@@max(2, 3)" />
5. 访问集合对象
集合对象比如List,Set,Map等。List和数组的访问形式类似,这里以List为例。假设有一个List名为 userlist。
(1)List
访问List对象
<s:property value="userlist"/>
访问List对象中某个元素
<s:property value="userlist[1]"/>
访问List中元素某个属性的集合
<s:property value="userlist.{age}"/>
访问List中元素某个属性的集合中的特定值
<!-- 第一种方法( 不常用 ) --><s:property value="userlist.{age}[0]"/><!-- 第二种方法 --><s:property value="userlist[0].age"/>
(2)Set
访问Set对象
<s:property value="userSet"/>
Set集合的访问方式与List集合类似,这里不再重复演示,但要注意的是,Set是无序的集合,所以不能获取某个特定的元素值:
<!-- 错误方法 --><s:property value="userSet[0]"/>
(3)Map
访问Map对象
<s:property value="userMap"/>
访问Map中某个元素
<!-- 第一种方式 --><s:property value="userMap.user1"/> <!-- 第二种方式 --><s:property value="userMap['user1']"/> | <s:property value="userMap[\"user1\"]"/>
访问Map中所有的keys
<s:property value="userMap.keys"/>
访问Map中所有的values
<s:property value="userMap.values"/>
访问Map的大小
<s:property value="userMap.size()"/> | <s:property value="userMap.size"/>
6. 投影与过滤
注意细节,不同的符号代表不同含义:
?
- 满足条件的所有元素
^
- 满足条件的第一个元素
$
- 满足条件的最后一个元素
过滤集合
<!-- OGNL过滤集合的语法为:collection.{?expression} --><s:property value="userlist.{?#this.age>1}"/> //获取到的是age>1的对象集合
投影集合
<s:property value="userlist.{^#this.age>1}.{age}"/> //获取到满足age>1集合的第一个对象的age<s:property value="userlist.{$#this.age>1}.{age}"/> //获取到满足age>1集合的最后一个对象的age
Java学习之路(Javawl)
长按二维码
关注Javawl
以上是关于第四节 Struts2 - OGNL详解的主要内容,如果未能解决你的问题,请参考以下文章
[struts2学习笔记] 第四节 学着使用struts 2的tag标签
[CVE-2013-2251] Apache Struts 2远程代码执行漏洞复现(第四弹)