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