OGNL

来源:互联网 发布:jave编程app 编辑:程序博客网 时间:2024/06/05 18:09

OGNL

Object-Graph Navigation Language的缩写,全称为对象图导航语言,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。


  OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:

  1. 属性名称(property) 
  2. 方法调用(method invoke) 
  3. 数组元素

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好


OGNL 表达式 和 s:property 标签来读取值栈中的属性值
(注意:在使用 s 标签的时候,要进行引入 <%@ taglib prefix="s" uri="/struts-tags" %>)
1). 读取对象栈中对象的属性:
 
 > 若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一: 
<s:property value="object.propertyName"/>

<s:property value="object['propertyName']"/>

<s:property value=" object["propertyName"]"/>

> ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用, 
    它下面的那个对象可以用 [1] 引用. 
  <s:property value="[0].productDesc"/>  //从栈顶开始搜索对象属性
    
> [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象

> 若从栈顶对象开始搜索, 则可以省略下标部分: message 

> 结合 s:property 标签: 
          <s:property value="[0].message" />  等同于<s:property value="message" />(推荐此写法)
 
 2). 默认情况下, Action 对象会被 Struts2 自动的放到值栈的栈顶.
事例:
<action name="tag_save" class="com.struts.OGNLtag.Product" method="save">
      <result name="save">/ognlTag/details.jsp</result>
</action>


public String save() {
System.out.println("asdasdsadasd");
// 1.获取值栈信息
ValueStack valueStack = ActionContext.getContext().getValueStack();
// 2.设置属性
Test test = new Test();
test.setProductName("AAAAA");
test.setProductDesc("BBBBB");
// 3.把信息压入值栈顶部
valueStack.push(test);
return "save";
}


 <s:debug></s:debug>

<body>
     <s:debug></s:debug>
     <br><br>
  productName: ^<s:property value="productName"/>
      <br><br>    
  productDesc: ^<s:property value="productDesc"/>
      <br><br>
      <hr>
  productName: ^^<s:property value="[1].productName"/>
      <br><br>
  productDesc: ^^<s:property value="[1].productDesc"/>
      <br><br>
  productPrice:^^<s:property value="productPrice"/>
      <br><br>
       <hr>
  productPrice:${productName}  
      <br><br>
  productPrice:${productDesc}
      <br><br>
  productPrice:${productPrice}
      <br><br>
</body>


结果:


2.读取 Context Map 里的对象的属性

1.若希望访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #.
   如果没有前缀字符 #, 搜索将在 ObjectStack 里进行.
代码:
public class Product implements RequestAware,SessionAware,ApplicationAware{

private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;

@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public String execute(){
request.put("request", "AASSS");
session.put("session", "英雄联盟");
application.put("application", "app穿越");
return "success";
}
}

 <!-- ognlMap读取测试 -->
<action name="input_Map" class="com.struts.OGNLtag.map.Product" method="execute">
   <result name="success">/OGNLMap/detais.jsp</result>
</action>

   <s:debug></s:debug>
   <br><br>
   <!-- 使用EL表达式 -->
    request:${requestScope.request}
     <br><br>
   session:${sessionScope.session}
     <br><br>
   application:${applicationScope.application}
     <br><hr><br>
  <!--访问值栈中 ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符 #.
                如果没有前缀字符 #, 搜索将在 ObjectStack 里进行.  -->
   request:^^<s:property value="#request.request"/>
    <br><br>
   session:^^<s:property value="#session.session"/>
     <br><br>
   application:^^<s:property value="#application.application"/> 
     
</body>

运行结果:

3.Struts2中使用OGNL表达式访问静态属性和方法  

1.访问静态方法:@包.类名@方法名(),如:
    @cn.edu.ahau.mgc.struts2.model.Magci@method();
2.访问静态属性:@包.类名@属性名,如:
    @cn.edu.ahau.mgc.struts2.model.Magci@NAME
3.第一个@后面的类可以省略,默认为Math类,如:
    @@floor(1.32342);
4.访问静态方法必须在struts.xml文件中添加如下配置:(注意:不配置,调用方法就使用不了)
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />

代码:
 访问方法

调用值栈中对象的普通方法:<s:property value="user.get()"/><br>

访问静态属性和方法

调用Action中的静态方法:<s:property value="@struts.action.LoginAction@get()"/>

调用JDK中的类的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br>

调用JDK中的类的静态方法(同上):<s:property value="@@floor(44.56)"/><br>

调用JDK中的类的静态方法:<s:property value="@java.util.Calendar@getInstance()"/><br>

调用普通类中的静态属性:<s:property value="@struts.vo.Address@TIPS"/><br>

                          

访问构造方法

调用普通类的构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>

 


获取数组:
    <%
    String[] names = new String[]{"AA","CC","FF","DD"};
    request.setAttribute("names",names);
    %>
    <br><br>
    获取数组长度:<s:property value="#attr.names.length"/> 
      <br><br>
    获取数组值:<s:property value="#attr.names[2]"/> 


结果:


OGNL中的#号可以取出堆栈上下文中存放的对象

名称作用例子attr用于按request>>session>>application顺序访问其属性#attr.userName相当于按顺序从三个范围读取userName属性直
到找到为止
request包含当前HttpServletRequest的属性的Map#request.userName相当于request.getAttribute("userName")session包含当前HttpSession的属性的Map#session.userName相当于session.getAttribute("userName")application包含当前应用的ServletContext的属性的Map#application.userName相当于application.getAttribute("userName")parameters包含当前HTTP请求参数的Map#parameters.id[0]相当于request.getParameter
jsp值获取方式
    <s:property value="list[0]"/><!--访问下标为0的元素  -->
    <s:property value="list[0].name"/><!-- 访问第一个元素的属性 -->
    <s:property value="list.isEmpty()"/> <!-- 获取集合是否为空  -->
    <s:property value="map['s1']"/><!-- 获取key为s1的值 -->
    <s:property value="map.s1"/><!-- 获取key为s1的值 -->
    <s:property value="map.keys"/><!-- 获取map的键集合 -->
    <s:property value="map.values"/><!-- 获取map的值集合 -->
    <s:property value="map.size()" /><!-- 获取map的键值对数量 -->
    <s:property value="map.isEmpty()"/><!-- 获取map是否为空 -->
    <s:property value="set.toArray()[0]"/> <!-- 转化数组,拿第一个元素 -->
    <s:property value="set.size()"/> <!-- 获取set的大小 -->
    <s:property value="set.isEmpty()"/> <!-- 获取set是否为空 -->


0 0
原创粉丝点击