Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29337306
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2008-12-09 10:12:18

OGNL学习专题:

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好

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

  1. 支持对象方法调用,如xxx.doSomeSpecial()
  2. 支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 |  值名],例如:@java.lang.String@format('foo %s', 'bar')@tutorial.MyConstant@APP_NAME
  3. 支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
  4. 访问OGNL上下文(OGNL context)和ActionContext;
  5. 操作集合对象。

“#”主要有三种用途:

  1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
     名称 作用 例子
    parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id")
    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属性,直到找到为止
  2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100}
  3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}
[如果想要实现上面的需要的话就可以用# 来代替了的哦!]

   
   
       
            /Ognl.jsp
       
       
   


structs.xml配置文件是可以让这个Action类对应到一个JSP文件的哦!
先经过了这个Action处理之后才开始进入到这个JSP页面进行相对应的操作的!
Action中的所有操作集中在execute()方法中去了
request.setAttribute("userName", "Max from request");
则对应的在JSP页面中就得这样来提取出来的了!

request.userName:


只需要一个表达式#就可以搞定的哦!

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:

<hr />
   
<h3>%的用途h3>
   
<p><s:url value="#foobar['foo1']" />p>
   
<p><s:url value="%{#foobar['foo1']}" />p>
清单6 演示%用途的代码片段

“$”有两个主要的用途

  1. 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序
  2. 在Struts 2配置文件中,引用OGNL表达式,如
    <action name="AddPhoto" class="addPhoto">
               
    <intercep
第三个运算符为“$”

[第二份资料]

OGNL表达式的基本单位是导航链。最简单的链包含如下部分:

表达式组成部分 示例
属性名称 如上述示例中的name和headline.text
方法调用 hashCode()返回当前对象的哈希码。
数组元素 listeners[TEC:0]返回当前对象的监听器列表中的第一个元素。

所有的OGNL表达式都基于当前对象的上下文来评估,导航链的示例如下:

java 代码
  1. name.toCharArray()[0].numericValue.toString()  

评估步骤如下:

  • 解析根对象的name属性。
  • 调用上一步返回的结果字符串的toCharArray()方法。
  • 获取返回的结果数组的第一个字符,是一个Character对象。
  • 获取字符的数字值表示,Character有一个getNumericValue()方法。
  • 调用结果Integer对象的toString()方法

list的语法: {e1,e2}. 它创建一个List, 包含字符串"name1"和"name2".
"'lebal'" name="'nmae'" list="{'name1','name2'}" />
map的语法: #{key1:value1,key2:value2}. 它创建一个Map,
将"foo"映射到"foovalue", "bar"映射到"barvalue":
"'lebal'" name="'nmae'" list="#{'foo':'foovalue', 'bar':'barvalue'}" />
MAP是名值映射的哦!一个名对应 一个值 的!
在python中经常用到的!

muhaha


ooo

可以用ONGL语言写到我们的JSP页面中去的实现业务逻辑的哦!而不是用<%%>来写的哦!
一个表达式为in not in

选择集合的一个子集(称为投影), 可以在集合中使用通佩符(wildcard).
  • ? - 所有匹配选择逻辑的元素
  • ^ - 第一个匹配选择逻辑的元素
  • $ - 最后一个匹配选择逻辑的元素
通过一些通配符来进行运算处理的哦!

OGNL支持基本的lamba表达式语法可以用来编写简单的函数.

OGNL的集合操作

可以使用如下代码直接生成一个List对象:

{e1,e2,e3…}

该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。

如下代码可以直接生成一个Map对象:

#{key1:value1,key2:value2,…}

Map类型的集合对象,使用key-value格式定义,每个key-value元素使用冒号标识,多个元素之间使用逗号隔开。

对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中

除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。

—    ?:获得所有符合逻辑的元素。

—    ^:获得符合逻辑的第一个元素。

—    $:获得符合逻辑的最后一个元素。

例如代码:

person.relatives.{? #this.gender == 'male'}

该代码可以获得person的所有性别为male的relatievs集合。

使用了OGNL表达式的JSP视图,视图用来显示Action中处理的各种信息,读者可以看到,使用OGNL表达式,代码更加简洁和直观。
[视图的作用是用来显示Action中的各种信息的哦!]

 

The value of key "foo1" is


上面是用ONGL语言生成一个MAP对象,然后通过#运算符来调用出来这个值了!

8.3.4  OGNL中的#、%和$符号


1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。

—    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

[有点类似于正则表达式一样的哦!]

这个总结的比较好哦!有三种用途。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:

构造Map

   

   

The value of key "foo1" is

   

不使用%:

   

使用%:

页面输出哈哈:

不使用%的话:#foobar['foo1']

使用了的话:bar1

%:当你的标志为字符串的时候可以计算出来这个值的哦!

3.$符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—    在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

   

           

            10

            100

            BAction-test校验:数字必须为${min}为${max}之间!

       

   






阅读(784) | 评论(0) | 转发(0) |
0

上一篇:Structs2.0入门学习7

下一篇:ASP实例学习五

给主人留下些什么吧!~~