第四节 Struts2 - OGNL详解

Posted JAVA的学习之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四节 Struts2 - OGNL详解相关的知识,希望对你有一定的参考价值。

1. 什么是 OGNL

       OGNL(Object-Graph Navigation Language,对象图导航语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性以及调用对象的方法。它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。

       OGNL是Struts2的默认表达语言,OGNL表达式的计算是围绕OGNL上下文(Context)进行的,相当于一个Map对象,见下图的结构:

第四节 Struts2 - OGNL详解

刚刚这种传统的定义,可能你看完还是不太理解。没关系,还记得Struts-Hello World这节课吗?输入一个名字,然后显示Hello。这个名字在页面中怎么显示的呢?我们可以再来看一下:

<body>
    Hello World, Welcome! <s:property value="name"/></body>

<s:property value="name"/> 这便是OGNL的一种应用,访问action的普通属性。

2 .OGNL中重要的3个符号:#%$

  • # 符号

通常有三种用法:

  1. 访问非root对象。

  2. 用于过滤和投影集合。

  3. 构造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标签

Struts2 OGNL

[CVE-2013-2251] Apache Struts 2远程代码执行漏洞复现(第四弹)

基于初学者的SSHstruts2 值栈的详解与struts2标签库+ognl表达式

C#关键字详解第四节

JAVAEE学习——struts2_03:OGNL表达式OGNL与Struts2的结合和练习:客户列表