JSTL入门:表达式语言

JSTL 1.0发布于 2002 年 6 月,由四个定制标记库( coreformatxmlsql)和一对通用标记库验证器( ScriptFreeTLVPermittedTaglibsTLV )组成。 core标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作URL 的标记。顾名思义, format标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行JSP 页面的国际化。 xml库包含一些标记,这些标记用来操作通过 XML 表示的数据,而sql 库定义了用来查询关系数据库的操作。

隐式对象

表 1 中列出了 11 个 EL隐式对象的标识符。不要将这些对象与 JSP隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。

表 1. EL隐式对象

类别标识符描述
JSPpageContextPageContext实例对应于当前页面的处理
作用域pageScope与页面作用域属性的名称和值相关联的Map
requestScope与请求作用域属性的名称和值相关联的Map
sessionScope与会话作用域属性的名称和值相关联的Map
applicationScope与应用程序作用域属性的名称和值相关联的Map
请求参数param按名称存储请求参数的主要值的Map
paramValues将请求参数的所有值作为String 数组存储的 Map
请求头header按名称存储请求头主要值的Map
headerValues将请求头的所有值作为String 数组存储的 Map
Cookiecookie按名称存储请求附带的 cookie 的Map
初始化参数initParam按名称存储 Web应用程序上下文初始化参数的 Map

表 2. EL运算符

类别运算符
算术运算符+-*/ (或 div )和% (或 mod
关系运算符== (或eq )、 != (或 ne )、< (或 lt )、 > (或gt )、 <= (或 le )和>= (或 ge
逻辑运算符&& (或and )、 || (或 or )和! (或 not
验证运算符empty

表 3. EL运算符优先级(自顶到底,从左到右)

[] ,.
()
unary -not!empty
*/div%mod
+ 、binary-
() <</code>><=>=ltgtlege
==!=eqne
&&and
||or

Taglib 伪指令
用于 JSTL core 库EL 版本的 taglib 伪指令

<%@ tagliburi="http://java.sun.com/jstl/core" prefix="c" %>

用于 JSTL core 库 RT 版本的taglib 伪指令

<%@ tagliburi="http://java.sun.com/jstl/core_rt" prefix="c_rt"%>

变量标记

我们首先要考虑的 JSTL 定制标记是 <c:set>操作。正如已经说明的,限制了作用域的变量在 JSTL 中起关键作用,<c:set>操作提供基于标记的机制来创建和设置限制了作用域的变量。清单 9中显示了该操作的语法,其中 var属性指定了限制了作用域的变量的名称, scope属性表明了该变量驻留在哪个作用域中, value属性指定了分配给该变量的值。如果指定变量已经存在,则简单地将所指明的值赋给它。如果不存在,则创建新的限制了作用域的变量,并用该值初始化这个变量。


清单 9. <c:set>操作的语法
<c:set var="name" scope="scope"value="expression"/>

scope 属性是可选的,其缺省值是 page

清单 10 中显示了 <c:set>的两个示例。在第一个示例中,将会话作用域变量设置成String值。在第二个示例中,用表达式来设置数值:将页面作用域内名为square 的变量赋值为名为 x的请求参数的值的平方。
JSTL入门:表达式语言
清单 10. <c:set>操作示例
<c:set var="timezone" scope="session" value="CST"/>
<c:set var="square" value="${param['x'] * param['x']}"/>

您还可以将限制了作用域的变量的值指定为<c:set>操作的主体内容,而不是使用属性。使用这种方法,您可以重新编写清单 10中的第一个示例,如清单 11 所示。此外,正如我们马上可以看到的,<c:set> 标记的主体内容本身也可以使用定制标记。<c:set> 主体内生成的所有内容都将作为一个String 值赋给指定变量。
清单 11. 通过主体内容指定<c:set> 操作的值

<c:set var="timezone"scope="session">CST</c:set>

JSTL core 库包含第二个用于管理限制了作用域的变量的标记 ―<c:remove> 。顾名思义,<c:remove>操作是用来删除限制了作用域的变量的,它获取两个属性。var 属性指定待删除变量的名称, scope属性是可选的,它表示待删除变量来自哪个作用域,缺省为page ,如清单 12 所示。

清单 12. <c:remove>操作示例

<c:remove var="timezone" scope="session"/>

尽管 <c:set>操作允许将表达式结果赋给限制了作用域的变量,但开发人员通常会希望只显示表达式的值,而不存储它。JSTL<c:out> 定制标记承担这一任务,其语法如清单 13所示。该标记对由其 value属性指定的表达式进行求值,然后打印结果。如果指定了可选属性default ,那么,在对 value属性的表达式求值所得结果为 null 或空String 的情况下, <c:out>将打印其值。
清单 13. <c:out>操作的语法

<c:out value=" expression" default="expression"escapeXml="boolean"/>

escapeXml 属性也是可选的。它控制当用<c:out>标记输出诸如“<”、“>”和“&”之类的字符(在 HTML 和 XML中具有特殊意义)时是否应该进行转义。如果将 escapeXml设置为 true,则会自动将这些字符 转换成相应的 XML实体(此处提到的字符分别转换成 <>& )。

例如,假定有一个名为 user的会话作用域变量,它是一个类的实例,该类为用户定义了两个特性:usernamecompany。每当用户访问站点时,这个对象被自动分配给会话,但直到用户实际登录后,才会设置这两个特性。假定是这种方案,请考虑清单14 中的 JSP片段。在用户登录之后,这个片段将显示单词“Hello”,其后是他/她的用户名和一个惊叹号。但是,在用户登录之前,由这个片段生成的内容则是短语“HelloGuest!”。在这种情况下,因为 username特性还有待初始化,所以 <c:out> 标记将转而打印出default 属性的值(即字符串“Guest”)。
清单 14. 带缺省内容的<c:out> 操作示例

Hello <c:out value="${user.username}"default="Guest"/>

接下来,考虑清单 15,它使用了 <c:out> 标记的escapeXml 属性。如果在这种情况下已经将company 特性设置成 Java String"Flynn & Sons" ,那么,实际上该操作生成的内容将是Flynn & Sons 。如果这个操作是生成 HTML 或 XML内容的 JSP页面的一部分,那么,这个字符串中间的“&”符号最终可能被解释为HTML 或 XML 控制字符,从而妨碍了对该内容的显示或解析。但是,如果将escapeXml 属性值设置成 true,则所生成的内容将是 Flynn & Sons。浏览器或解析器不会因在解释时遇到这种内容而出问题。假定 HTML 和XML 是 JSP 应用程序中最常见的内容类型,所以 escapeXml属性的缺省值是 true 就不足为奇了。
清单 15. 禁用转义的<c:out> 操作示例

<c:out value="${user.company}" escapeXml="false"/>
了简化动态数据的显示之外,当通过 <c:set>设置变量值时, <c:out>指定缺省值的能力也很有用。正如 清单 11 所示,用来赋给限制了作用域的变量的值可以指定为<c:set>标记的主体内容,也可以通过其值属性来指定。通过将<c:out> 操作嵌套在 <c:set>标记的主体内容中,变量赋值就可以利用其缺省值能力。

清单 16 中说明了这种方法。外部 <c:set>标记的行为非常简单:它根据其主体内容设置会话作用域timezone 变量的值。但是,在这种情况下,主体内容是通过<c:out> 操作生成的。这个嵌套操作的值属性是表达式${cookie['tzPref'].value} ,它尝试通过cookie 隐式对象返回名为 tzPref 的 cookie值。( cookie 隐式对象将 cookie 名称映射到相应的Cookie 实例,这意味着必须通过对象的 value特性使用点运算符来检索储存在 cookie 中的实际数据。)


清单 16. 合并 <c:set> 和<c:out> 以提供缺省变量值

<c:set var="timezone" scope=="session">   <c:out value="${cookie['tzPref'].value}" default=="CST"/></c:set>

但是,请考虑以下情况,用户是第一次尝试使用这段代码的 Web应用程序。结果是,请求中没有提供名为 tzPref 的cookie。这意味着使用隐式对象的查找将返回 null,在这种情况下整个表达式将返回 null 。因为对<c:out> 标记的 value属性求值的结果是 null ,所以<c:out> 标记会转而输出对其 default属性求值的结果。在这里是字符串 CST。因此,实际的结果是将 timezone限制了作用域的变量设置成用户的 tzPref cookie中存储的时区,或者,如果没有,则使用缺省时区 CST

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/252773.html

更多阅读

股票入门中长线最赚钱的六大技巧 短线比中长线赚钱

股票入门 中长线最赚钱的六大技巧  操盘技巧:中长线最赚钱的六大技巧  不同个股要采取不同的操作斑略,长线品种持股为主,不必在意短线震荡,根据上升通道进行操作。中线品种要重视量能,需要根据时间周期进行波段操作。短线品种操作上

五线谱入门基础教程 五线谱快速记忆法

五线谱入门基础教程——简介五线谱是记录音乐的一种语言,是一种记谱方法。五线谱,顾名思义是由五条平行线组成的,当然还包括每相邻两条平行线之间的“间”。五条线的顺序是由下往上数的。最下面第一条线叫做“第一线”,往上数第二条线

日语学习如何入门

日语学习如何入门——简介学习一门外语对于年轻人,尤其是希望获得更好的发展机会的大学生来说,是非常重要的提高自身素质,获得新的筹码,谋求新的发展机会的途径,而在学习语言的过程中,选择一门好的小语种是非常重要的。除去作为全民外语的

怎么学习MySQL?:1 MySQL入门

怎么学习MySQL?:[1]MySQL入门——简介MySQL的第一节内容:已经讲述了如何安装mysql的程序, 然后现在讲解一下mysql怎么学习. 怎么才能快速的去做一些东西出来. 这里基本上都是一些理论性的东西, 在后期, 会加上一些实例. 包括, .net j

声明:《JSTL入门:表达式语言》为网友少年快长大分享!如侵犯到您的合法权益请联系我们删除