当前位置: 首页 > 工具软件 > OGNL > 使用案例 >

什么是OGNL表达式

贺英悟
2023-12-01

前言


    在经典的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上下文的根对象,所以访问根对象或者根对象属性时只需要名字即可,不需要任何符号。但是访问非根对象或者非根对象的属性时,需要在前面加#符号,例如:

[html]  view plain  copy
  1. <s:property value="name"/>  
这是获取值栈中的name属性,name属于根对象,所以取值时不用任何符号。

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

[java]  view plain  copy
  1. ActionContext.getContext().getSession().getAttribute("msg")  


    2、用于过滤或投影集合


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

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

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


    3、构造Map


[java]  view plain  copy
  1. <s:radio name="gender" list="#{'男', '女'}"></s:radio>  
这句话就是形成性别选项的单选框。


    %符号


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

[html]  view plain  copy
  1. <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表达式在取值时不需要任何符号,对于值栈的结构,也是需要了解的,下篇博客就介绍一下值栈的结构。

 类似资料: