Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5018629
  • 博文数量: 891
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8636
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(891)

文章存档

2020年(8)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Java

2011-09-28 22:30:12

    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 代码name.toCharArray()[0].numericValue.toString()

    评估步骤如下:

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

    集合 (Maps, Lists, Sets)

    list的语法: {e1,e2}. 它创建一个List, 包含字符串"name1"和"name2".

   

    map的语法: #{key1:value1,key2:value2}. 它创建一个Map,

    将"foo"映射到"foovalue", "bar"映射到"barvalue":MAP是名值映射的哦!一个名对应一个值的!在python中经常用到的!


  muhaha
 

 
    ooo
 

    可以用ONGL语言写到我们的JSP页面中去的实现业务逻辑的哦!而不是用<%%>来写的哦!

    一个表达式为in  not in

    选择集合的一个子集(称为投影), 可以在集合中使用通佩符(wildcard)。

    ●  ? - 所有匹配选择逻辑的元素
    ●  ^ - 第一个匹配选择逻辑的元素
    ●  $ - 最后一个匹配选择逻辑的元素

    通过一些通配符来进行运算处理的哦!  Lambda表达式

    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}之间!

       

   

阅读(1971) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~