Ognl表达式

来源:互联网 发布:everspace 优化 编辑:程序博客网 时间:2024/04/30 06:18

Ognl表达式的概念与特点

一、什么是OGNL,有什么特点?

OGNLObject-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL)。

作用:通过它简单一致的表达式语法,可以存取对象的任意属性调用对象的方法遍历整个对象的结构图,实现字段类型转化等功能。

特点:

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

   2、支持对象方法调用,形式如:objName.methodName();     

  3、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名  值名]。

    例如:    @com.test.UserConstant@getInfo()@com.test.UserConstant@MALE

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

  5、访问OGNL上下文(OGNL context)和ActionContext

       操作集合对象。

      可以直接new一个对象

==============================================================================================

Ognl表达式的用途:

  OGNL是通常要结合Struts 2的标志一起使用。主要是#%$这三个符号的使用;

使用方法如下:

  #”主要有三种用途:    --------------访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()

名称                                         作用                                                       使用方式

parameters           包含当前HTTP请求参数的Map                  #parameters.id[0]作用相当于request.getParameter("id"   

=======================================例子==========================================

访问url:http://localhost:8088/Test/hello/mystruts5?id=1986&&name=zhangsan

 

栈上下文的存储如下:

   

com.opensymphony.xwork2.ActionContext.parameters{id=[Ljava.lang.String;@efae3b,name=[Ljava.lang.String;@197d63b}

前端页面获取操作:

   <s:property   value="#parameters.id[0]"/>
   <s:property   value="#parameters.name[0]"/>

显示效果:

     1986      zhangsan

============================================================================================

request            包含当前HttpServletRequest的属性(attribute)的Map                 #request.userName相当于request.getAttribute("userName"   

session           包含当前HttpSession的属性(attribute)的Map                          #session.userName相当于session.getAttribute("userName"   

application      包含当前应用的ServletContext的属性(attribute)的Map       #application.userName相当于application.getAttribute("userName"   

================================================================================================================

注:attr 用于按request session application顺序访问其属性(attribute),

#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。

用于过滤和投影(projecting)集合,如books.{?#this.price<100};

构造Map,如#{'foo1':'bar1''foo2':'bar2'}。   

                     #{'foo1':'bar1''foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。

如果要在页面中取一个map的值可以这样写:    

       <s:property value="#myMap['foo1']"/>     

       <s:property value="#myMap['foo1']"/>   

2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。      

实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :   

var oDiv eval_r("document.all.div"+index)     

var oDiv eval_r("document.all.div"+index)   

当index变量为1时,语句就会被当作var oDiv document.all.div1  var oDiv document.all.div1来执行。%{}就是起这个作用。举例:    

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      

<s:property value="#myMap['key1']"/>      

<s:url value="#myMap['key1']" />    

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   

<s:property value="#myMap['key1']"/>   

<s:url value="#myMap['key1']"/>   

上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:    

<s:url value="%{#myMap['key1']}"/>     

<s:url value="%{#myMap['key1']}"/>     

则输出为“value1”。   

这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。   

3、“$”有两种用途   

(1)、在国际化资源文件中,引用OGNL表达式。   

(2)、在Struts 2配置文件中,引用OGNL表达式:    

   <action name="saveUser" class="userAction" method="save">   

              <result type="redirect">listUser.action?msg=${msg}</result>   

   </action>   

================================================================== 

下面让我们看看具体写法,首先是Action类代码:

package tutorial.action;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import org.apache.struts2.interceptor.SessionAware;

import org.apache.struts2.util.ServletContextAware;

import tutorial.model.Book;

import com.opensymphony.xwork2.ActionSupport;

public classOgnlAction extendsActionSupport implementsServletRequestAware, SessionAware, ServletContextAware{

private static final long serialVersionUID = 1L;

              private   HttpServletRequest   request;

              private    Map        session;

              private    ServletContext    application;

              private      List    books;

          public   void setServletRequest(HttpServletRequest request) {

                      this.request = request;

           }

        @SuppressWarnings("unchecked")

           public void setSession(Map session) {

                          this.session = session;

             }

           public void setServletContext(ServletContext application) {

                          this.application = application;

              }

           public List getBooks() {

                    return books;

            }

         @Override

                public String execute() {

                       request.setAttribute("userName", "Max From request");

                                     session.put("userName", "Max From session");

                 application.setAttribute("userName", "Max From application");

                          books = new  LinkedList();

                             books.add(new Book("978 0735619678", "Code Complete, Second Edition", 32.99));

                             books.add(new Book("978 0596007867", "The Art of Project Management", 35.96));

                             books.add(new Book("978 0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));

                            books.add(new Book("978 0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));

                            books.add(new Book("978 0735605350", "Software Estimation: Demystifying the Black Art", 25.19));

                         return SUCCESS;

           }

}

以上代码分别在requestsessionapplication的范围内添加“userName”属性,然后再在JSP页面使用OGNL将其取回。

下面是Ognl.jsp的代码,内容如下:

                 访问OGNL上下文和Action上下文

            parameters.userName:

                   request.userName:

                  session.userName:

              application.userName:

                            attr.userName:

用于过滤和投影(projecting)集合

Books more than  $35

            <s:iterator value="books.{?#this.price > 35}">

                        <s:property  value="title" /> - $<s:property  value="price" /><br>

               </s:iterator>

The price of "Code Complete, Second Edition" is:

构造Map

The value of key "foo1" is

===================================

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。

“$”有两个主要的用途,用于在国际化资源文件中,引用OGNL表达式。在Struts 2i18n中配置文件

=====================================================================================

OGNL支持各种纷繁复杂的表达式。但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成,返回最后得到的对象。OGNL则针对这条基本原则进行不断的扩充,从而使之支持对象树、数组、容器的访问,甚至是类似SQL中的投影选择等操作。

1.基本对象树的访问

对象树的访问就是通过使用点号将对象的引用串联起来进行。

例如:xxxxxxxx.xxxxxxxx. xxxx. xxxx. xxxx. xxxx

2.对容器变量的访问

对容器变量的访问,通过#符号加上表达式进行。

例如:#xxxx#xxxx. xxxx#xxxx.xxxxx. xxxx. xxxx. xxxx

3.使用操作符号

OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。

4.容器、数组、对象

OGNL支持对数组ArrayList等容器的顺序访问:例如:group.users[0]

同时,OGNL支持对Map的按键值查找:

例如:#session['mySessionPropKey']

不仅如此,OGNL还支持容器的构造的表达式

例如:{"green", "red", "blue"}构造一个List#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map

你也可以通过任意类对象的构造函数进行对象新建:

例如:new Java.net.URL("xxxxxx/")

5.静态方法变量的访问

要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args)

例如:@com.javaeye.core.Resource@ENABLE@com.javaeye.core.Resource@getAllResources

6.方法调用

直接通过类似Java的方法调用方式进行,你甚至可以传递参数:

例如:user.getName()group.users.size()group.containsUser(#requestUser)

7.投影和选择

OGNL支持类似数据库中的投影(projection和选择(selection)。

投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX是这个集合中每个元素的公共属性。

例如:group.userList.{username}将获得某个group中的所有username的列表。

选择就是过滤满足selection条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:

?选择满足条件的所有元素

^选择满足条件的第一个元素

$选择满足条件的最后一个元素

例如:group.userList.{? #txxx.xxx != null}将获得某个groupusername不为空的user的列表。

 

     

     

     

     

     

     

     

     

    原创粉丝点击