什么是OGNL表达式

前言

 

    在经典的SSH框架中,我们在JSP页面经常会用到OGNL表达式来取值,然后赋值给页面元素,这种方式来赋值,JSP页面的代码看起来干净整洁,没有过多的Java代码。但是到底什么是OGNL表达式呢?

 

    说道OGNL表达式,我们可能会很快想到EL表达式。没错,他们都是很强大的表达式语言,但是EL表达式在Struts1中是比较常用的,Struts2则默认使用了OGNL表达式,结合Struts2的标签库,完成了页面的数据绑定。

 

OGNL表达式

 

    OGNL表达式是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换。在Struts1中,习惯使用的表达式语言是EL,在WebWork2和Struts2.x中使用OGNL来做页面数据绑定。利用表达式,可以直接利用对象曾的对象,更面向对象的操作使得项目不需要封装太多的FormBean。

 

    OGNL表达式是围绕OGNL上下文来进行的,OGNL上下文实际上是一个Map对象,由ognl.OgnlContext类表示,它可以存放多个JavaBean对象。OGNL上下文具有一个根对象,访问根对象可以直接用名称或者属性名访问,而不需要加任何符号。Struts2中将ActionContext作为OGNL上下文,并且将值栈作为OGNL上下文的跟对象,通过Struts2的标签,直接使用OGNL表达式来访问ActionContext中的对象或者属性。

 

    OGNL表达式中有三种符号,分别是#、%和$,但是常用的也就是#符号,%和$两种并不常用,只是在特殊情况下会使用。

 

#符号

 

    #符号的作用有三方面:

 

    1、取非根对象属性值

 

    在Struts2中,值栈被作为OGNL上下文的根对象,所以访问根对象或者根对象属性时只需要名字即可,不需要任何符号。但是访问非根对象或者非根对象的属性时,需要在前面加#符号,例如:

 

<s:property value="name"/>

这是获取值栈中的name属性,name属于根对象,所以取值时不用任何符号。

 

 

#session.msg

因为session对象并不在值栈中,所以属于非跟对象,取值时需要添加#符号,这时#相当于ActionContext.getContext(),所以#session.msg相当于

 

 

ActionContext.getContext().getSession().getAttribute("msg")

 

    2、用于过滤或投影集合

 

 

    通常我们会传递一个集合到页面上,那么在页面上通过一个条件来取出集合中的某些属性,就需要用到#符号,例如:

 

<s:property value="persons.{?#this.name=='张三'}.{age}[0]"/>

 

这句话就是从persons集合中取出name为张三的第一个对象的age属性值。

 

    3、构造Map

 

 

<s:radio name="gender" list="#{'男', '女'}"></s:radio>

这句话就是形成性别选项的单选框。

 

 

    %符号

 

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

 

<s:a action="department_delete?id=%{id}&parentId=%{parent.id}" onclick="return window.confirm('这将删除所有的下级部门,您确定要删除吗?')">删除</s:a>

这就是将id放到url中,作为id参数的值。

 

 

    $符号

 

    $符号有两个用途:

 

    1、在国际化资源文件中,采用OGNL表达式来传递参数。

 

    2、在struts2的xml中使用$符号做引用。

 

总结

 

    动态数据绑定通过OGNL表达式,可以在页面上代替很多代码,使得页面看起来整洁干净。另外,用OGNL表达式来赋值,可以方便的给页面元素赋值。对于OGNL表达式来说,Struts2中关键的也就是值栈了,对于根对象值栈,OGNL表达式在取值时不需要任何符号,对于值栈的结构,也是需要了解的,下篇博客就介绍一下值栈的结构。

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值