EL JSTL OGNL

一、EL表达式:

1、语法结构
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:

 ${user.My-Name}应当改为 ${user["My-Name"] }

如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:

 ${sessionScope.user[data]}中data 是一个变量

3、变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传”“。
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
4、特别强调:
1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。
2、 注意 <%@ page isELIgnored=”true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

5.EL之11个内置对象
不要和jsp的9大内置对象相混淆,jsp的9大内置对象是域对象,而EL的11个内置对象是对应的map.即时一个集合。

!pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
!pageScope -- page域中属性组成的Map
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
!param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
!cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map

二、JSTL

1.JSTL的逻辑组成
JSTL 1.1中包含四个标签库和一组EL函数。

标签库功能描述标签库的URI建议前缀
核心标签库http://java.sun.com/jsp/jstl/corec
XML标签库http://java.sun.com/jsp/jstl/xmlx
国际化/格式化标签库http://java.sun.com/jsp/jstl/fmtfmt
数据库标签库http://java.sun.com/jsp/jstl/sqlsql
EL自定义函数http://java.sun.com/jsp/jstl/functionsfn

2.JSTL的各个标签库的简单介绍:
(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的标签、用于条件判断的标签、用于迭代循环的标签。
(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。

三、OGNL

OGNL能够访问系统中OgnlContext中的对象, OgnlContext对象是OGNL表达式的下上文对象,OGNL上下文实际上就是一个Map对象,即所有通过OGNL表达式取出的数据都是从上下文对象取出来的, OGNL的上下文环境是一个Map结构,称之为OgnlContext。

OGNL中重要的3个符号:#、%、$:
1.#符号

(1) 访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(“msg”) 。
(2) 用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==’pla1’}.{age}[0]。
(3) 用来构造Map,例如示例中的#{‘foo1’:’bar1’, ‘foo2’:’bar2’}。
2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.
例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText(‘key’)}的方式可以拿出国际化信息.
3.$符号

(1) 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在 min {max}之间。
(2) 在Struts 2框架的配置文件中引用OGNL表达式

OgnlContext中包括以下几个内置对象:
(1)ValueStack:
存放在OgnlContext的第一位,是根对象,访问这里面的内容有点特殊,不用指定范围, Struts2框架总是把Action实例放在栈顶。因为Action在值栈中,而值栈又是OGNL中的根,所以引用Action的属性可以省略“#”标记,这也是为什么我们在结果页面中可以直接访问Action的属性的原因。
(2)request:
模拟了HttpServletRequest对象,取这里面的值就相当于调用了request.getAttribute(“key”),访问这里面的属性形式: #request[‘user’]或#request.user
(3)session:
模拟了HttpServletSession对象,取这里面的值就相当于调用了session.getAttribute(“key”),
访问这里面的属性形式: #session[‘user’]或#session.user
(4)application:
模拟了HttpServletApplication对象,取这里面的值就相当于调用了servletContext.getAttribute(“key”),访问这里面的属性形式: #application[‘user’]或#application.user
(5)attr:
如果PageContext可用,则访问PageContext,否则依次搜索request、session和application对象。访问形式: #attr[‘user’]或#attr.user
(6)parameters:
用于访问请求参数,相当于调用了HttpServletRequest对象的getParameter()方法。也相当于JSTL中的 ${ param.id },访问形式: :#parameters[‘id’]或#parameters.id
记住一点,不要和EL表达式混用,如果你用了EL表达式,就全用EL表达式,如果用了OGNL,就全用OGNL.

按道理来说,EL表达式只能访问request/session/page/application中的数据,但是我们现在又说了,Action中的属性值都是放在ValueStack中的,那为什么我们在先前的示例中,EL表达式能够访问ValueStack中的数据呢?
原因是:Struts2对request对象进行装饰, 它重写了getAttribute()方法,首先在reuqest中查找属性值,如果没有找到,再从 ValueStack中查找。这就说明了为什么Struts2中EL表达式能够取出Action中的值了,但是一定要记住Action中的值是存储在ValueStack中的。

一些比较特殊的用法:
1、访问静态方法和静态字段
  @class@method(args)     //调用静态方法
  @class@field         //调用静态字段
其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如:
  @@min(5,3)
  @@max(5,3)
  @@PI

2、投影
OGNL提供了一种简单的方式在一个集合中对每一个元素闻调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。
  假如employees是一个包含了employee对象的列表,那么#employees.{name}将返回所有雇员的名字的列表。
  在投影期间,使用#this变量来引用迭代中的当前元素。如:objects.{#this instanceof String? #this: #this.toString()}
3、选择
  OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。如:
  #employees.{?#this.salary>3000} 将返回薪水大于3000的所有雇员的列表。
  #employees.{^#this.salary>3000} 将返回第一个薪水大于3000的雇员的列表。
  #employees.{$#this.salary>3000} 将返回最后一个薪水大于3000的雇员的列表。
4、索引:Struts 2允许在值栈中使用索引。
假设值栈中存在两个对对象实例:Man和Animal,这两个对象实例都有一个name属性示例代码如下所示:
[0].name // 调用animal.getName()
[1].name // 调用man.getName()

5, Lambda表达式 :[…]
OGNL支持基本的Lambda表达式语法,通过Lambda表达式语法,可以在OGNL中使用一些简单的函数。例如:

Fibonacci:
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89

开发者可以使用Lambda表达式语法:

<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值