OGNL与Struts2

一、OGNL概述

    OGNL的全称是Object Graph Navigattion Language,即对象导航图语言。它是一个开源项目,工作在视图层,用来取代页面中的Java脚本,简化 数据的访问操作
    与JSP2.0内置的EL相比,它们都属于表达式语言,用于进行数据访问,但是OGNL的功能更加强大,提供了EL所不具备的功能,比如强大的类型转换功能、访问方法、操作集合对象、跨集合投影灯。
    OGNL是一种很强大的技术,它被集成在Struts2框架中,用来帮助实现数据转移和类型转换。OGNL在Struts2中就是基于字符串的HTTP输入/输出与Java对象内部处理之间的“粘合剂”。
    OGNL在框架中主要做两件事:表达式语言和类型转换器

二、OGNL表达式

    使用OGNL表达式将Java的数据和基于文本的视图中的字符串绑定起来,这通常出现在表单输入的name属性或者Struts2标签的各种属性中。OGNL提供一个简单的语法,将表单或Struts2标签与特定的JAVA数据绑定起来,用来将数据移入,移出框架。如<input type="text" name="user.username" />的输入对应Action类中User对象的name属性。
    OGNL要结合Struts标签来使用,由于比较灵活,也容易把人弄晕,尤其是“%”,“#”,“ 使 “广泛应用于EL中,这里重点介绍“%”,“#”的用法

2.1、“#”符号有三种用途

  •   访问非根对象,如OGNL上下文和Action上下文,由于Struts2中值栈视为根对象,所以访问你其他非根对象时,需要加“#”前缀
      例如#session.msg表达式,实际上,相当于ActionContext.getContext();#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute(“msg”);
  • 用于过滤和投影集合,例如person.{?#this.age>20},books.{?#this.price>35}
  • 用来构造Map,例如“#{‘key1’:’value1’,’key2’:’value2’,’key3’:value3’}”,这种方式常用在给radio或select、checkbox等标签赋值上,如果要在页面上取一个Map值,可以这样写
<s:property value="#myMap['1001']" />
<s:property value="#myMap['1002']" />

2.2、“%”符号的用途

  ”%”符号实在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。%符号的用途实在标志的属性为字符串类型时,计算OGNL表达式的值,如下代码所示

<h3>构造Map</h3>
<s:set name="foobar" value="#{'foo1':'bar','foo2':'bar2'}" />
<p>The value of key "fool" is
<s:property value="#foobar['fool']" /></p>
<p>不使用%:<s:url value="#foobar['fool']" /></p>
<p>使用%:  <s:url value="%{#foobar['fool']}" /></p>

//运行结果如下
The value of key "fool" is bar1
不使用%:#foobar['fool']
使用%:  bar1

  这说明Struts2里不同的标签对OGNL表达式的理解是不一样的。当有的标签”看不懂“类似”#foobar[‘foo1’]”的语句时,就要用%{}来吧这括进去,“翻译”一下

2.3、“%”符号的用途

  • 在国际化资源文件中,引用OGNL表达式。例如,国际化资源文件中的代码
reg.agerange=国际化资源信息:年龄必须在${min}${max}之间
  • 在Struts2配置文件中,引用OGNL表达式,例如下面的配置
<action name="saveUser" class="userAction" method="save" >
    <result type="redirect">listUser.action?msg=${msg}</result>
</action>

猜你喜欢

转载自blog.csdn.net/chenyonken/article/details/80850213