`

Ognl方法使用(利用表达式语言获取数据)

阅读更多

WebWork的EL-对象图导航语言(Object Graph Navigation Language, 缩写为OGNL)是作为Web页面脚本的最佳选择。

一. 基本特性

    1. 访问bean属性

       根据JavaBean的规范,bean属性使用诸如getXxx(), setXxx(), isXxx()或者hasXxx()这样标准形式的getter方法或
       setter方法。其中, isXxx()和hasXxx()形式用于boolean属性。在WebWork中,访问这些属性(不管是获取数据还是
       设置数据)都使用形式为xxx的属性引用。

       示例:

       a. action 

    package ch8;

    import ch4.User;
    import com.opensymphony.xwork.ActionSupport;

    public class OgnlTest extends ActionSupport{
        private User user;

        public String execute() {
            user = new User();
            user.setName("zs");
            user.setPassword("password");
            
            return SUCCESS;
        }
        //setter和getter方法
    }    

       b. result

        <action name="ognlTest" class="ch8.OgnlTest">
            <result name="success">ognl.jsp</result>
        </action> 

       c. jsp

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %> 
    <html>
        <body>
            <ww:property value="user.name"/>    <!--其中value中内容为ognl表达式-->
            <ww:property value="user.password"/>
        </body>
    </html>

    2. 常量

       OGNL表达式常量与EL类型,

       常量类型                    范例
       ------------                             --------------
       char                    'a'
       String                    "hello world"
       boolean                     true false

      另String常量可以使用单引号或双引号括起来,示例:

       <ww:property value="\"a\""/>并不等同于 <ww:property value='a'/>

    3. 操作符

       OGNL支持所有Java操作

       运算                    范例
       ------------                             --------------
       递增                    ++foo
       递减                    foo++
       等于                    foo == bar
       不等于                    foo != bar
       in                                       foo in someList
       not in                                   foo not in someList
       赋值(=)                    foo = 123

    4. 方法调用

       提供调用非属性相关的方法;

       示例:假设ch4.User类中有一方法(静态方法亦可) : 

             public String sayHello() {
               return "hello world";
         }

             使用以下形式可以在浏览器上输出:hello world

             <ww:property value="user.sayHello()"/>

    5. 设置数值及表达式列表

       在单条语句当中执行以逗号分隔的多个表达式,最后一个表达式的返回值作为整条语句的输出结果。

       例如foo值为123,而bar值为789,则以下形式输入 789: 

       <ww:property value="foo,bar"/>

    6. 访问静态方法和类变量

       使用@[className]@[Field Or Method]调用静态类变量和方法,类名必须使用包括包在内的完整类名;

       示例:假设ch4.User类中有一方法(静态方法亦可) : 

             public static String sayHello() {
               return "hello world";
         }

             使用以下形式可以在浏览器上输出:hello world

             <ww:property value="@ch4.User@sayHello()"/>
    
       另OGNL也可使用vs(vs代表Value Stack,就是值栈)前缀调用保存于值栈中的类的静态属性和静态方法;

       <ww:property value="@vs@sayHello()"/>
       
       一般来说,只有在一直了解值栈中包含什么对象的情况下,使用vs的形式才是有用的,否则建议使用完整的包
       名和类名比较好。

    7. 访问OGNL上下文及ActionContext

       示例:

       Java代码:                                                      OGNL表达式
       -------------------------------------------------------         ---------------------
       ActionContext().getContext().getParameters()                    #parameters
       ActionContext().getContext().getParameters().size()             #parameters.size
       ((Kermit)ActionContext().getContext().get("kermit")).getAge()   #kermit.age

       WebWork中另提供一些更短标识符方便访问:
       . parameters :    一个包含当前请求中所有HttpServletRequest参数的map;
       . request    :    一个包含当前请求中所有HttpServletRequest属性的map;
       . session    :    一个包含当前请求中所有HttpSession属性的map;
       . application:    一个包含当前请求中所有ServletContext属性的map;
       . attr       :    一个依次从请求、会话和应用程序的Map中搜索属性的map;

       示例:

       a. action 

    package ch8;

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;

    import com.opensymphony.webwork.interceptor.ServletRequestAware;
    import com.opensymphony.xwork.ActionSupport;

    public class ScopeTest extends ActionSupport implements ServletRequestAware{
        private HttpServletRequest request;
        
        @Override
        public void setServletRequest(HttpServletRequest arg0) {
            request = arg0;
        }

        @Override
        public String execute() {
            HttpSession session = request.getSession();
            ServletContext context = session.getServletContext();
            
            request.setAttribute("req","request0");
            session.setAttribute("ses","session1");
            context.setAttribute("app","application2");
            
            return SUCCESS;
        }
    }

       b. result

        <action name="scopeTest" class="ch8.ScopeTest">
            <result name="success">scopeTest.jsp</result>
        </action>

       c. jsp

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %> 
    Request parameter: <ww:property value="#parameters['name']"/><br>
    Request attribute: <ww:property value="#request['req']"/><br>
    Session attribute: <ww:property value="#session.ses"/><br>
    Application attribute: <ww:property value="#application.app"/><br>
    Request attribute: <ww:property value="#attr.req"/><br>
    Session attribute: <ww:property value="#attr.ses"/><br>
    Application attribute: <ww:property value="#attr.app"/><br>

二. 操作集合(Collections)

    1. 操作列表(list)和数组(array)

       Java代码                                         OGNL表达式
       -------------------------                        ----------------------------------
       list.get(0)                                      list[0]
       array[0]                                         array[0]
       ((User)list.get(0)).getName()                    list[0].name
       array.length                                     array.length
       list.size()                                      list.size
       list.isEmpty()                                   list.isEmpty

       除了访问列表的数值外,OGNL还可以动态地创建列表:使用大括号将元素括起来,元素间使用逗号分隔。

       Java代码                                         OGNL表达式
       -------------------------                        ----------------------------------
       List list = new ArrayList(3);                    {1,3,5}
       list.add(1);                     
       list.add(3);
       list.add(5);
       return list;
       -------------------------                        ----------------------------------
       List list = new ArrayList(2);                    {"foo","bar"}[1]
       list.add("foo");
       list.add("bar");
       return list.get(1); 
     
    2. 操作Map

       Java代码                                         OGNL表达式
       -------------------------                        ----------------------------------
       map.get("foo")                                   map['foo']
       map.get(new Integer(1))                          map[1]
       User user = (User)map.get("zs");                 map['zs'].name
       return user.getName();
       map.put("foo","bar");                            map['foo']='bar'
       map.size();                                      map.size
       map.isEmpty();                                   map.isEmpty

       除了访问Map的数值外,OGNL还可以动态地创建Map。必须在左边的大括号之前放置一个#号。

       Java代码                                         OGNL表达式
       -------------------------                        ----------------------------------
       Map map = new HashMap(2);                        #{"foo":"bar","baz":"whazzit"}
       map.put("foo","bar");
       map.put("baz","whazzit");
       return map;

       Map map = new HashMap(2);                        #{1:"one",2:"two"}
       map.put(new Integer(1),"one");
       map.put(new Integer(2),"two");
       return map; 

       Map map = new HashMap(2);                        #{#user1.name:#user1.mother.name,
       map.put(user1.getName(),user1.getMother()          #user2.name:#user2.mother.name}
    .getName());
       map.put(user2.getName(),user2.getMother()
    .getName());
       return map; 

       ActionContext.getContext().                      #parameters['id']
            getParameters().get("id");

       String name = user.getName();                    #session["user-"+name]
       Map map = ActionContext.getContext()
       .getSession();
       return map.get("user-"+name);

       session.put("user",user);                        #session['user'] = user

    3. 对集合进行筛选(filtering)和投影(projecting)

       筛选:以一个集合为基础生成一个新集合的技术,而新集合中只包含可以通过筛选的对象。语法:
             collection.{? expression}

             以上expression是真正意义上的筛选器, 会对集合中的每个对象进行求值。而#this这个特殊的变量
             则是用于标识正在进行求值的对象。例,要从Kemit的孩子们中筛选出年龄等于2或者小于2的孩子,表
             达式为:

             #this.age <= 2

       投影:根据投影规则对集合中的元素进行转换。语法:

             collection.{ expression }

             其中expression用来对原始集合中被循环迭代到的对象进行求值。

       筛选返回的集合中的元素与原始集合中的是一样的,但数量有可能要少;
       投影返回的集合中的元素与原始集合中的有可能不一样,但数量一样多;

       示例:

       OGNL表达式                                       描述 
       -------------------------                        ----------------------------------
       children.{name}                                  投影的结果为所有孩子的姓名
       children.{?#this.age > 2}                        筛选的结果为年龄大于2的孩子
       children.{?#this.age<=2}.{name}                  选筛选出年龄小于等于2的孩子,再对结果列进行投影操作,得
                                                        到孩子的名字
       children.{name +'->'+mother.name}                投影的结果为符合"名字->母亲名字"样式的字符串列表

    4. "#"的多种用途

       . 引用ActionContext中的值:     #foo
       . 动态构建Map                  #{1:'one',2:'two'}
       . 对集合进行筛选和投影操作     children.{?#this.age > 2}

三. 表达式语言的高级特性

    正是这些高级特性令WebWork能够在众多的MVC框架中脱颖而出。

    1. 将值栈和表达式语言联系起来

       在WebWork中,整个值栈就是上下文(context)中的根对象。WebWork提供了与OGNL特别的集成:根据表达式自动查找整
       个栈(从上而下),直至找到了一个包含了所需的属性的对象。

       举例:栈中有两个对象:Muppet和Person,两个对象都有name属性;Muppet有lifeSized属性而Person有salary属性。
             Muppet对象在栈顶,而Person对象在其下面。如下图:

             -------------------------------------
             |               Muppet              |
             |            ------------           |
             |              name                 |
             |              lifeSized            |
             |                                   |
             |               Person              |
             |            ------------           |
             |              name                 |
             |              salary               |
             |                                   |
             |                                   |
             -------------------------------------

       OGNL表达式                                       描述 
       -------------------------                        ----------------------------------
       lifeSized                                        调用muppet.isLifeSized()
       salary                                           调用person.getSalary()
       name                                             因为muppet位于person之上,所以调用muppet.getName()
       [1].name                                         由于[1]这个语法指明了WebWork将从位置1开始往下查找,所以
                                                        调用person.getName();
       top                                              返回muppet
       [1].top                                          由于[1]返回的是一个范围较小的值栈,而表达式top是基于它的,
                                                        所以整个表达式返回结果是person。因person位于这个新的,范围
                                                        较小的值栈的顶部。

    2. 数据类型转换

       OGNL表达式                                       描述 
       -------------------------                        ----------------------------------       
       #kermit.age = "25"                               为一个int型变量设置String值,该String值随后会被转换为25
       #kermit.name = 25                                为一个String型变量设置int值,该int值随后会被转为"25"

    3. 处理null属性的访问

       OGNL在检测出访问了一个null对象的属性时,就会提供一种方式将null对象转化为真实对象。

    4. 动态创建lambda表达式

       定义语法::[...]

                 lambda表达式只能使用一个参数,该参数可通过#this引用。示例:

                 #isKermit = :[#this.name == @vs@OG_MUPPET ? true : false]

                 定义好之后,可将其置于OGNL上下文中,然后通过以下形式调用:

       OGNL表达式                               描述 
       -------------------------                ----------------------------------   
       #isKermit(top)                           判断位于栈顶的对象是否拥有Kermit这样的名字;
       #isKermit(#kermit)                       kermit是Kermit类型吗?

分享到:
评论

相关推荐

    OGNL表达式

    在Struts2框架中,默认使用的表达式语言即为OGNL,这是因为相比于其他表达式语言(如JSTL、Groovy和Velocity等),OGNL具有以下显著优点: 1. **支持对象方法调用**:OGNL允许直接调用对象的方法,而无需显式创建...

    OGNL表达式的使用及文档

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于Spring框架和其他许多Java应用中,用于数据绑定和表达式评估。本篇将详细介绍OGNL的使用方法及其...

    OGNL - 功能强大的表达式语言

    OGNL,全称为Object-Graph Navigation Language,是一种功能强大的表达式语言,它在Java开发领域中被广泛用于获取、设置对象属性以及执行对象的方法。OGNL的强大之处在于其能够灵活地处理复杂的对象图导航,使得数据...

    ognl表达式案例

    而OGNL(Object-Graph Navigation Language)是Struts2中使用的一种强大的表达式语言,用于在视图层和模型层之间传递数据。在本案例中,我们将深入探讨OGNL表达式的用法及其在Struts2中的应用。 首先,OGNL是一种...

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

    其中,OGNL(Object-Graph Navigation Language)是Struts2中的核心表达式语言,用于数据绑定和表示层的数据操作。这篇深入学习的文章主要探讨了OGNL表达式的原理和使用。 首先,我们来理解一下OGNL是什么。OGNL是...

    实验4 Struts2的类型转换与OGNL表达式语言.doc

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。在Struts2框架中,OGNL被广泛应用于访问模型对象的属性,以及动态执行某些操作。 **4.2 OGNL的使用** 在实验内容...

    STRUTS2.1z中的OGNL的表达式

    OGNL是一种强大的表达式语言,用于在Struts2框架中处理对象图。它允许开发者以一种简洁的方式访问和操作对象的属性。OGNL不仅支持属性和方法的访问,还能进行条件判断、循环等复杂逻辑的处理,是Struts2中处理数据流...

    struts2-OGNL表达式测试

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于访问和操作对象图。这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式...

    OGNL表达式源码

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于Struts2框架中,用于视图和控制器之间的数据绑定。本篇文章将深入探讨OGNL表达式的源码,通过一个...

    OGNL(jar包)源代码(OGNL表达式实现代码)

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Apache Struts2框架中的核心组件,也被其他许多Java应用程序广泛使用。本篇文章将深入探讨OGNL的原理、功能...

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

    在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置对象的属性。这篇博客将深入探讨OGNL表达式的理解和用法。 OGNL的全称是对象图导航语言,它的主要功能是在对象模型...

    struts2官方表达式ognl源码

    同时,视图层使用OGNL来从Action对象中获取数据,渲染到页面上。这种数据绑定机制使得开发者无需编写繁琐的setter和getter方法,提高了开发效率。 **3. OGNL表达式** OGNL表达式的格式多样,以下是一些常见示例: ...

    `Strtus2 OGNL表达式的结合

    OGNL是一种强大的表达式语言,它允许开发者在运行时访问和修改Java对象的属性。 在Struts2中,OGNL与ActionContext和ValueStack紧密集成。ActionContext是一个上下文对象,它包含了当前请求的所有环境信息,包括...

    ognl API文档

    综上所述,OGNL API文档是理解和使用OGNL表达式语言的重要资源,它包含了详细的API参考、示例和教程,帮助开发者充分利用其强大功能,实现灵活的对象访问和数据绑定。通过深入学习和实践,开发者能够更高效地进行...

    ognl项目文件和源代码

    OGNL (Object-Graph Navigation Language) 是一个强大的表达式语言,主要用于在Java应用程序中获取和设置对象属性。它在Java社区中被广泛使用,尤其是在Struts2框架中,作为视图和模型之间的数据绑定工具。这个...

    精通struts2的ognl表达式

    OGNL是一种强大的表达式语言,它允许开发者通过简洁、灵活的方式访问和操作Java对象图。对于那些希望在Struts2项目中实现更高效、更灵活编程实践的人来说,精通OGNL是必不可少的能力之一。 #### OGNL表达式的应用...

    OGNL的使用

    **OGNL(Object-Graph Navigation Language)**是一种强大的表达式语言,主要用于获取和设置Java对象的属性。在Java开发中,特别是在Spring MVC框架中,OGNL被广泛用于视图层的表达式解析,使得我们可以方便地访问和...

    ognl-2.6.11.jar 官方源码

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于许多Java框架,如Struts2,因为它允许动态地访问和操作对象的属性,甚至在运行时构建复杂的表达式...

    ognl标签的使用案例

    OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,主要用于在Java应用程序中获取和设置对象属性。在Web开发领域,尤其是与Struts2框架结合时,OGNL标签被广泛用于视图层,允许开发者以简洁的方式...

    OGNL API文档

    OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置Java对象的属性。它在Java开发中广泛应用于MVC框架,如Struts2,因为它能方便地处理视图和模型之间的数据绑定。这篇文档将深入探讨...

Global site tag (gtag.js) - Google Analytics