OGNL表达式

什么是OGNL

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

  • OGNL:对象导航语言,比EL强大很多倍的语言。
    • EL:从域对象中获取数据,从EL的11个对象中获取。{pageContext.request.contextPath}。
    • OGNL:调用对象的方法,获取Struts2的值栈中获取数据。OGNL是第三方表达式语言。

为什么学习OGNL

  • 支持运算符(如±*/),比普通的标志具有更高的自由度和更强的功能;

  • Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

  • 支持对象方法调用,如xxx.doSomeSpecial();

  • 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;

  • 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80;

  • 访问OGNL上下文(OGNL context)和ActionContext;
    操作集合对象。

  • 可以直接new一个对象

使用OGNL的要素

  • 表达式
  • 根对象
  • context对象

1、OGNL的Struts2环境入门

标签库的引入

<%@ taglib uri="/struts-tags" prefix="s" %>
1.1访问对象的方法
<h3>调用对象的方法</h3>
<!-- value中写OGNL表达式 -->
<s:property value="'struts'.length()"/>
1.2访问对象的静态方法
<h3>调用对象静态的方法</h3>
<!--struts2中默认把访问静态方法关闭-->
<!--
    开启
    <constant name="struts.ognl.allowStaticMethodAccess" value="true">
-->
<s:property value="@java.Lang.Math@random()"/> 

2、 OGNL中的特殊字符

2.1 #号
  • 获取context的数据
    <% reuqest.setAttribute("name","a") %>
    
    <s:property value="#request.name"/>
    
    
  • 构建Map集合
    <s:iterator value="list">
        <s:property value=""/>
    </s:iterator>
    
    
    <s:iterator var="i" value="{'a','b','c'}">
        <s:property value="i"/> -- <s:property value="#i"><br/>    
    </s:iterator>
    
    <s:iterator var="i" value="#{'a':'1','b':'2','c':'3'}">
        <s:property value="key"/> -- <s:property value="value"><br/> 
    </s:iterator>
    
    
2.2 %号
  • 强制解析OGNL

     <% reuqest.setAttribute("name","a") %>
     <!--强制识别{#request.name}为OGNL表达式-->
     <s:textfield name="name" value="%{#request.name}"/>
    
  • 强制不解析OGNL

2.3 $号
  • 在配置文件中使用OGNL
    • 属性文件(国际化中)
    • XML
      • 文件下载
        • 配置:
          <action name="download" class="xxx.downloadAction">
              <result type="stream">
                  <param name="Content-Type"/></param>
                  <param name="Content-Disposition"/></param>
              </result>
          </action>
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值