`

struts2 ognl表达式

 
阅读更多

推荐阅读:

http://developer.51cto.com/art/201203/322509.htm

 

OGNL:(Object Graphic Navigation Language)对象图导航语言。

 

OgnlContext:ognl上下文对象,实现Map接口。把对象放到OgnlContext中,就可以通过ognl表达式很容易的操纵对象。

 

ROOT:OgnlContext有一个唯一的根对象,访问根对象下的成员变量可以省略#root。


一个简单的示例:

OgnlContext context = new OgnlContext(); 
context.put("person",person); 
//解析表达式为ognl的ASTProperty对象 
Object obj = Ognl.parseExpression("#person.name"); 
//获取表达式的值,本质上就是调用name的set方法 
Object objVal = Ognl.getValue(obj, context, context.getRoot()); 

//设置person为根对象
 context.setRoot(person); 
//会首先到根对象中去查找name 
System.out.println(Ognl.getValue("name", context, context.getRoot()));

 
ognl支持对对象树、成员变量、方法、数组、集合、映射的访问。

 

package ognl;

import java.util.List;
import java.util.Map;

//get和set方法没在此列出
public class People
{
	private String name;
	private String gender;
	private List<String> interest;
	private Address address;
	private Map<String,String> map;	

	public String toString()
	{
		return this.name;
	}
}

class Address
{
	private String homeAddress;
	private String companyAddress;	
}

 

package ognl;  
  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
  
import ognl.Ognl;  
import ognl.OgnlContext;  
import ognl.OgnlException;  
  
public class OgnlTest  
{  
    public static void main(String[] args) throws OgnlException  
    {  
        People people = new People();  
          
        Address address = new Address();  
        address.setHomeAddress("HuBei");  
        address.setCompanyAddress("HangZhou");  
  
        List<String> list = new ArrayList<String>();  
        list.add("basketball");  
        list.add("movie");  
        list.add("music");  
          
        Map<String,String> map = new HashMap<String,String>();    
        map.put("A","a");  
        map.put("B","b");  
        map.put("C","c");  
  
        people.setGender("male");  
        people.setName("lisi");  
        people.setInterest(list);  
        people.setAddress(address);  
        people.setMap(map);  
      
        OgnlContext context = new OgnlContext();  
        context.put("people", people);  
        context.setRoot(people);  
      
        //操作OgnlContext中的对象
        System.out.println(Ognl.getValue("#people.gender", context, context.getRoot()));               //Member  
        System.out.println(Ognl.getValue("#people.address.homeAddress", context, context.getRoot()));  //Object Tree  
        System.out.println(Ognl.getValue("#people.interest[1]", context, context.getRoot()));          //List or Array  
        System.out.println(Ognl.getValue("#people.toString()", context, context.getRoot()));           //Method  
        System.out.println(Ognl.getValue("#people.map.A", context, context.getRoot()));                //Map  
  
        System.out.println("----------------------------");  
          
        //访问类的静态方法和成员变量:@class@member,class默认为java.lang.Math类  
        System.out.println(Ognl.getValue("@@E", context, context.getRoot()));  
        System.out.println(Ognl.getValue("@java.lang.Math@PI", context, context.getRoot()));     //Static Member  
        System.out.println(Ognl.getValue("@java.lang.Integer@toBinaryString(10)", context,context.getRoot())); //Static Method  
          
        System.out.println("----------------------------");  
                  
        //创建对象  
        System.out.println(Ognl.getValue("new Object()", context, context.getRoot()));  
        System.out.println(Ognl.getValue("new String('hello').toUpperCase()", context,  
                context.getRoot()));        
        System.out.println("----------------------------");  
                  
        //创建数组或集合  
        System.out.println(Ognl.getValue("{1,2,3,4}", context,context.getRoot()));    
        System.out.println(Ognl.getValue("{'A','B','C','D'}[2]", context, context.getRoot()));    
          
        //创建映射Map,可用三种方式访问Map中值
        System.out.println(Ognl.getValue("#{'K1':'V1','K2':'V2','K3':'V3'}", context,context.getRoot()));  
        System.out.println(Ognl.getValue("#{'K1':'V1','K2':'V2','K3':'V3'}.K1", context,context.getRoot()));  
        System.out.println(Ognl.getValue("#{'K1':'V1','K2':'V2','K3':'V3'}['K1']", context,context.getRoot()));  
        System.out.println(Ognl.getValue("#{'K1':'V1','K2':'V2','K3':'V3'}.get('K1')", context,context.getRoot()));  
    }  
} 

ognl支持两种操作来返回一个集合的子集:过滤和投影。过滤用于行,投影用于列。

 

过滤(filtering)
collection.{? expression}  返回满足的条件一个子集    
collection.{^ expression}  返回子集的第一个元素,也是一个collection
collection.{$ expression}  返回子集的第二个元素

#persons.{? #this.name.length() > 4}.size()        //返回name长度大于4的person的集合

投影(projection)
collection.{? expression}   返回列的集合
#persons.{name}          //返回所有person中name组成的集合

 

分享到:
评论

相关推荐

    struts2 OGNL表达式

    Struts2 OGNL表达式是Java开发中一个重要的知识点,尤其在Web应用程序设计中扮演着核心角色。OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它被Struts2框架广泛用于视图层与模型层之间的数据...

    struts2 OGNL表达式使用

    struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...

    struts2 OGNL 表达式及各种标签的使用

    - 在Struts2的Action类中,可以使用OGNL表达式来动态地处理请求参数,如`String name = (String)params.get("user.name");` - 在JSP页面上,使用OGNL标签显示和处理数据,如`管理员界面&lt;/s:if&gt;`。 通过理解并熟练...

    Struts2 使用OGNL表达式

    以下是一些关于Struts2中OGNL表达式的关键知识点: 1. **基础语法**:OGNL表达式的格式通常为`object.property`或`object[index]`,用于访问对象的属性或数组/集合的元素。例如,`user.name`将获取名为`user`的对象...

    struts2 中 OGNL表达式的使用

    struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用

    struts2OGNL表达式ActionContext及valuesStack.pdf

    在Struts2中,OGNL表达式的使用大大提升了代码的可读性和维护性。 首先,`#`字符在OGNL中扮演着关键角色。它主要用于访问OGNL上下文和Action上下文。`#`前缀可以用来获取`ActionContext`,这包含了四个重要的域:...

    Struts2 OGNL表达式实例详解

    Struts2 OGNL表达式实例详解 Struts2 OGNL表达式实例详解主要介绍了Struts2 OGNL表达式实例详解,相关实例代码,需要的朋友可以参考。Object Graph Navigation Language(对象图导航语言),就是用点来访问成员变量...

    ognl表达式 ognl表达式

    在Struts2框架中,OGNL表达式被广泛应用于视图层,比如在JSP页面中用来获取数据。OGNL表达式的语法简洁明了,例如: - **直接调用方法**:`xxx.sayHello()`。 - **访问静态方法和常量**:`@java.lang.String@format...

    Struts2 如何使用OGNL表达式(三十八)

    本文将深入探讨如何在Struts2中有效地使用OGNL表达式。 首先,OGNL是Struts2的核心组成部分,它允许开发者在Action类和JSP页面之间灵活地传递和访问数据。在Action类中,你可以设置属性,然后在JSP页面上通过OGNL...

    ognl表达式java使用案例详解(测试通过)

    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1、 支持对象方法调用,如xxx.doSomeSpecial(); 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@...

    struts2-OGNL表达式测试

    这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...

    Struts2深入学习----OGNL表达式原理

    Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。

    Struts2的标签库及OGNL表达式语言

    本篇文章将详细探讨Struts2中的OGNL表达式语言以及标签库。 **OGNL(对象图导航语言)** OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性。在Struts2框架中,OGNL扮演着至关重要的...

    JS:ognl表达式

    - **框架集成**:许多 Java 框架,如 Struts2、Hibernate Validator 等,都集成了 OGNL 表达式用于数据绑定和验证。 - **模板引擎**:在模板引擎中使用 OGNL 表达式来动态渲染页面。 - **业务逻辑处理**:在复杂的...

    OGNL表达式

    - **#**:通常用于表示OGNL表达式,在Struts2中作为OGNL表达式的开头标记。 - **%**:用于指定JSP页面的编码格式,如`;charset=utf-8" pageEncoding="utf-8" %&gt;`。 - **$**:在JSP页面中表示EL表达式的开头,但在...

    struts2_OGNL表达式ActionContext及valuesStack

    本文将深入探讨Struts2中的OGNL表达式,ActionContext以及valuesStack。 首先,OGNL表达式是Struts2中不可或缺的一部分,它允许开发者以一种声明式的方式访问和修改对象的属性。比如,`myBean.getMyProperty()`这样...

    struts2中ognl表达式的理解和用法

    3. 结果类型配置:在Struts2的配置文件中,结果类型可以通过OGNL表达式动态决定,例如,`resultType="#attr.resultType"`。 4. JSP标签库:Struts2提供了丰富的JSP标签库,这些标签内部也大量使用了OGNL来获取和显示...

    精通struts2的ognl表达式

    ### 精通Struts2中的OGNL表达式 在深入探讨Struts2框架的核心功能时,理解并熟练掌握OGNL(Object-Graph Navigation Language)表达式的应用是至关重要的一步。OGNL是一种强大的表达式语言,它允许开发者通过简洁、...

    struts2 ognl的用法

    在Struts2中使用OGNL表达式主要涉及以下几种符号:“#”、“%”和“$”。 ##### 1. “#”符号的使用 - **访问Struts2上下文**: - `#`可用于访问当前的`ActionContext`,如`#ActionContext.getContext()`。 - ...

Global site tag (gtag.js) - Google Analytics