OGNL表达式

本文详细介绍了Struts2框架中的OGNL表达式语言,包括其基本语法、优势及如何在JSP页面中使用OGNL访问各种类型的对象属性和方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达式语言

EL(Expression Language)表达式语言。

    目的就是避免在JSP页面中出现过多的<%%>的语句,使页面与后台代码分离


表达式语言主要有以下几大好处:

1、避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
2、支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
3、简单明了地表达代码逻辑,使用代码更可读与便于维护。

Struts2中的表达式语言

Struts 2支持以下几种表达式语言:
1、OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2、JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3、Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4、Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。

Struts 2默认的表达式语言是OGNL

OGNL的优势

OGNL相对其它表达式语言具有下面几大优势:
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 |  值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作作用域对象。


OGNL原理

OGNL 有一个上下文(Context)概念,就是一个MAP结构,它实现了java.utils.Map接口;

OGNL访问值栈中对象属性

1、Action中有username和password两个属性;<s:property value=“username”/>
    <s:property value=“password”/>


2、Action中有User对象
    <s:property value="user.username"/>


3、Action中有Cat对象,Cat对象有个friend属性是Dog对象,Dog有名字属性;
    <s:property value="cat.friend.name"/>

OGNL访问值栈中对象方法

访问值栈中对象的普通方法
    <s:property value="username.length()"/>
    <s:property value="cat.say()"/>


访问值栈中Action的普通方法
    <s:property value="methodName()"/>


访问普通类的构造方法(new 对象)
    <s:property value="new 构造方法()"/>


OGNL访问静态方法或静态属性

访问静态方法
    <s:property value="@全类名@静态方法名()"/>

    注意:访问静态方法要配置常量
<constant name="struts.ognl.allowStaticMethodAccess"
    value="true"/>

访问静态属性
    <s:property value="@全类名@静态属性"/>

特例---------访问Math类的方法
    <s:property value="@@静态方法()"/>

OGNL访问集合

1、List集合(数组与List通用)
访问整个List    
    <s:property value="users"/>

访问List中某个元素
    <s:property value="users[0]"/>

访问List中元素某个属性的集合
    <s:property value="users.{age}"/>

访问List中元素某个属性的集合中的特定值
    <s:property value="users.{age}[0]"/>
    或
    <s:property value="users[0].age"/>

2、Set集合

访问整个Set
        <s:property value="users"/>

访问Set中的某个元素
    <s:property value="users[1]"/>

3、Map集合
访问Map
    <s:property value="usersMap"/>
访问Map中的某个元素
    <s:property value="usersMap.keyName"/>
    或
    <s:property value="usersMap['keyName']"/>
    或
    <s:property value="usersMap[\"keyName\"]"/>

访问Map中所有的键
    <s:property value="usersMap.keys"/>
访问Map中所有的值
    <s:property value="usersMap.values"/>

OGNL投影(projecting)

<s:property value="users.{?#this.age==1}"/>
            -------?表示所有的

<s:property value="users.{^#this.age>1}"/>
            -------^表示第一个


<s:property value="users.{$#this.age>1}"/>
            -------$表示最后一个


OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 in, not in等

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

1、#符号
访问作用域对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

 用来构造Map,例如<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />


2、%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值


3、$符号
在国际化资源文件中,引用OGNL表达式;
在Struts 2框架的配置文件中引用OGNL表达式



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值