JSTL


JSTL

JSTL(JSP Standard Tag   Library,JSP标准 标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的 容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制 标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了 作用域变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML   表示的数据,而 sql 库定义了用来查询关系 数据库的操作。
如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到 classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。
中文名
JSP标准 标签库
外文名
JSP Standard Tag  Library
简    称
JSTL
维护人员
apache的jakarta小组

1使用条件编辑

jstl带来的优雅 编程体验人所皆知,在java社区蒸蒸日上的今天使用jstl已无需考虑很多问题,我们可以用myeclipse等java 集成开发环境轻松搭建一个jstl的web项目。即便有了myeclipse这么得力的工具帮我们快速开发web项目,但是有一些知识我们必须了解的 ---- 那就是jstl与servlet版本,以及jsp版本之间的依赖关系。
以下列出jstl各个 版本与jsp及servlet版本之间的依赖关系。
版本号
JSTL 版本
要求(必须满足此条件)
获取Taglib途径
Standard 1.2
JSTL 1.2 (尚未经过JCP认证)
Servlet 2.5, JavaServer Pages 2.1
subversion
Standard 1.1
JSTL 1.1
Servlet 2.4, JavaServer Pages 2.0
下载
Standard 1.0
JSTL 1.0
Servlet 2.3, JavaServer Pages 1.2
下载

2优点编辑

1、 在 应用程序 服务器之间提供了一致的接口,最大程度地提高了WEB应用在各应用服务器之间的移植。
2、 简化了JSP和WEB 应用程序的开发。

3详细介绍编辑

JSP 标准 标签库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及 数据库访问。在 developerWorks 上其新系列的第一篇文章中, 软件工程师Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用 脚本编制元素。您还将了解如何通过从 表示层删除源 代码来简化 软件维护。最后,您将了解 JSTL 经过简化的 表达式语言,它允许在不必使用功能齐全的 编程语言的情况下对 JSTL 操作指定动态属性值。
JavaServer Pages(JSP)是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算(这些计算用来动态地生成页面内容)的 脚本编制元素和操作。脚本编制元素允许在 JSP 页面中包括程序 源代码,在为响应用户请求而呈现页面时可以执行这些源代码。操作将计算操作封装到很象 HTML 或 XML 标记的标记中,JSP 页面的模板文本通常包含这些标记。JSP 规范只将几种操作定义成了标准,但从 JSP 1.1 开始,开发人员已经能够以定制标记库的方式创建其自己的操作了。
JSP 标准标记库(JSTL)是 JSP 1.2 定制标记库集,这些标记库实现大量 服务器端 Java 应用程序常用的基本功能。通过为典型 表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使 JSP 作者可以专注于特定于 应用程序的开发需求,而不是为这些通用操作“另起炉灶”。
当然,您可以使用 JSP 脚本编制元素(scriptlet、 表达式和声明)来实现此类任务。例如,可以使用三个 scriptlet 实现条件内容,清单 1 中着重显示了这三个 scriptlet。但是,因为 脚本编制元素依赖于在页面中嵌入程序源代码(通常是 Java 代码),所以对于使用这些脚本编制元素的 JSP 页面,其 软件维护任务的复杂度大大增加了。例如,清单 1 中的 scriptlet 示例严格地依赖于花括号的正确匹配。如果不经意间引入了一个 语法错误,则条件内容中的嵌套其它   scriptlet可能会造成严重破坏,并且在 JSP 容器编译该页面时,要使所产生的 错误信息有意义可能会很困难。
清单 1. 通过 scriptlet 实现条件内容
<% if (user.getRole() == "member")) { %>
<p>Welcome, member!</p>
<% } else { %>
<p>Welcome, guest!</p>
<% } %>
修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通 页面布局和图形设计的设计人员来开发和维护 JSP,但是同一页面中的 脚本编制元素出现问题时,需要程序员的介入。这种状况将单个文件中 代码的责任分担给多人,因而使得开发、调试和增强此类 JSP 页面成为很麻烦的任务。通过将常用功能包装到定制标记库的标准集合中,JSTL 使 JSP 作者可以减少对编制 脚本元素的需求,甚至可以不需要它们,并避免了相关的维护成本。
JSTL 1.0
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库( core 、 format 、 xml 和 sql )和一对通用标记库验证器( ScriptFreeTLV 和 PermittedTaglibsTLV )组成。 core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行 页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义, format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。 xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。
两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素― scriptlet、表达式和声明。类似地, PermittedTaglibsTLV 验证器可以用来限制可能由 应用程序的 JSP 页面访问的定制标记库集(包括 JSTL 标记库)。
尽管 JSTL 最终将会成为 J2EE 平台的必需组件,但只有少数 应用程序 服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会(Apache Software Foundation)的 Jakarta Taglibs项目(请参阅 参考资料)的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器,以添加对 JSTL 的支持。
在JSTL1.0的时候,在页面显示数据必须用<c:out>来进行,然而在JSTL1.1中,由于JSP2.0规范已经默认支持EL 表达式,因此可以直接在JSP页面使用表达式,看下面一个例子
<c:out value="${sessionScope.anyValue}" default="no value" escapeXml="false"/>
在EL表达式尚未出现之前,Struts1中一直用<bean:write>输出变量内容
表达式语言
在 JSP 1.2 中,可以使用静态字符串或 表达式(如果允许的话)指定 JSP 操作的属性。例如,在清单 2 中,对 <jsp:setProperty> 操作的 name 和 property 属性指定了静态值,而用 表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的 表达式被称为 请求时属性值(request-time attribute value),这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。
清单 2. 合并请求时属性值的 JSP 操作
<jsp:setProperty name="user" property="timezonePref"
value='<%= request.getParameter("timezone") %>'/>
因为请求时属性值是用 表达式指定的,所以它们往往有和其它 脚本元素一样的 软件维护问题。因此,JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的 表达式语言(EL)而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些 标识符、存取器和 运算符,用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript(请参阅 参考资料)和 XML 路径语言(XML Path Language,XPath)为基础,因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性,然后对它们执行简单操作;它不是编程语言,甚至不是 脚本编制语言。但是,与 JSTL 标记一起使用时,它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,如清单 3 所示。
清单 3. 说明 EL 表达式定界符的 JSTL 操作
<c:out value="${user.firstName}"/>
此外,您可以将多个 表达式与静态文本组合在一起以通过字符串并置来构造动态属性值,如清单 4 所示。单独的 表达式标识符、存取器、文字和 运算符组成。 标识符用来引用存储在 数据中心中的 数据对象。EL 有 11 个保留 标识符,对应于 11 个 EL 隐式对象。假定所有其它 标识符都引用 限制了 作用域的变量。存取器用来检索对象的特性或集合的元素。文字表示固定的值 ― 数字、 字符、字符串、 布尔型空值运算符允许对数据和文字进行组合以及比较。
清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
限制了作用域变量
JSP API 通过 <jsp:useBean> 操作允许从 JSP 容器内的四个不同 作用域中存储和检索数据。JSTL 通过提供用于指定和除去这些 作用域中的对象的附加操作来扩展这一能力。此外,EL 提供将这些对象作为限制了 作用域的变量进行检索的内置支持。特别地,任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的 标识符,都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象,这四个作用域是:
页面作用域
请求作用域
会话作用域
您可能还记得,只有在为特定请求处理页面期间才能检索存储在该页面 作用域中的对象。如果对象是存储在请求 作用域中的,可以在处理所有参与处理某请求的页面期间检索这些对象(譬如在对某个请求的处理中遇到了一个或多个 <jsp:include> 或 <jsp:forward> 操作)。如果对象是存储在会话 作用域中的,则在与 Web 应用程序的交互式会话期间,可以由用户访问的任何页面检索它(即,直到与该用户交互相关联的 HttpSession 对象无效为止)。可以由任何用户从任何页面访问存储在 应用程序 作用域中的对象,直到卸载 Web 应用程序本身为止(通常是由于关闭 JSP 容器所致)。
通过将字符串映射为期望 作用域中的对象来将对象存储到该 作用域。然后,就可以通过提供相同字符串来从该 作用域检索该对象。在 作用域的映射中查找字符串,并返回被映射的对象。在 Servlet API 中,将此类对象称为相应 作用域的 属性。但是,在 EL 的上下文中,也将与属性相关联的字符串看作 变量的名称,该 变量通过属性映射的方式获得特定的值。
在 EL 中,与隐式对象无关联的 标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面 作用域检查是否存在这样的 标识符,其次对请求作用域、然后对会话作用域、最后对 应用程序作用域依次进行这样的检查,然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法,可以将 EL 标识符看作引用限制了作用域的变量。
从更技术的方面来说,没有映射到隐式对象的 标识符是用 PageContext 实例的 findAttribute() 方法求值的,该实例表示对页面的处理,在该页面上,当前正在处理用于请求的 表达式标识符的名称作为 参数传递给这个方法,然后该方法依次在四个 作用域中搜索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个 作用域中找到这样的属性,则返回 null 。
最终,限制了作用域的 变量是四个 JSP 作用域的属性,这些属性具有可以用作 EL 标识符的名称。只要对限制了 作用域的变量赋予由字母数字组成的名称,就可以通过 JSP 中提供的用于设置属性的任何机制来创建它们。这包括内置的 <jsp:useBean> 操作,以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外,四个 JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的 变量使用的属性值。

隐式对象

表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。
表 1. EL 隐式对象
类别 标识符描述
JSP pageContext PageContext 实例对应于当前页面的处理
作用域pageScope 与页面作用域属性的名称和值相关联的 Map 类
requestScope 与请求作用域属性的名称和值相关联的 Map 类
sessionScope 与会话作用域属性的名称和值相关联的 Map 类
applicationScope 与 应用程序作用域属性的名称和值相关联的 Map 类
请求参数 param 按名称存储请求参数的主要值的 Map 类
paramValues 将请求参数的所有值作为 String 数组存储的 Map 类
请求头 header 按名称存储请求头主要值的 Map 类
headerValues 将请求头的所有值作为 String 数组存储的 Map 类
Cookie cookie 按名称存储请求附带的 cookie 的 Map 类
初始化参数 initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类
尽管 JSP 和 EL 隐式对象中只有一个公共对象( pageContext ),但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上,这是将它包括在 EL 隐式对象中的主要理由。
其余所有 EL 隐式对象都是映射,可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的 标识符,而不用依赖于 EL 在缺省情况下使用的 顺序查找过程。
接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值,所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值,通常是恰巧在实际请求中首先指定的那个值。每对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称,但这些值是 String 对象的 数组,其中的每个元素都是单一参数值或头值。
cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie 对象。
最后一个 EL 隐式对象 initParam 是一个映射,它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml部署描述符文件指定的,该文件位于 应用程序的 WEB-INF 目录中。

存取器

因为 EL 标识符是作为隐式对象或限制了 作用域变量(通过属性来实现)解析的,因此有必要将它们转换成 Java 对象。EL 可以自动包装和 解包其相应的 Java 类中的基本类型(例如,可以在 后台将 int 强制转换成 Integer 类,反之亦可),但大多数的 标识符将成为指向完整的 Java 对象的 指针
结果是,对这些对象的特性或(在对象是 数组和集合的情况下)对其元素的访问通常是令人满意的。就为了实现这种用途,EL 提供了两种不同的存取器(点运算符( . )和方括号运算符( [] )),也支持通过 EL 操作特性和元素。
点运算符通常用于访问对象的特性。例如,在 表达式${user.firstName} 中,使用点 运算符来访问 user 标识符所引用对象的名为 firstName 的特性。EL 使用 Java bean 约定访问对象特性,因此必须定义这个特性的 getter 方法(通常是名为 getFirstName() 的方法),以便 表达式正确求值。当被访问的特性本身是对象时,可以递归地应用点运算符。例如,如果我们虚构的 user 对象有一个实现为 Java 对象的 address 特性,那么也可以用点运算符来访问这个对象的特性。例如, 表达式${user.address.city} 将会返回这个地址对象嵌套的 city 特性。
方括号 运算符用来检索 数组和集合的元素。在 数组和有序集合(也即,实现了 java.util.List 接口的集合)的情况下,把要检索的元素的下标放在方括号中。例如, 表达式${urls[3]} 返回 urls 标识符所引用的 数组或集合的第四个元素(和 Java 语言以及 JavaScript 中一样,EL 中的下标是 从零开始的)。
对于实现 java.util.Map 接口的集合,方括号 运算符使用关联的键查找存储在映射中的值。在方括号中指定键,并将相应的值作为 表达式的值返回。例如, 表达式${commands["dir"]} 返回与 commands 标识符所引用的 Map 中的 "dir" 键相关联的值。
对于上述两种情况,都可允许 表达式出现在方括号中。对嵌套 表达式求值的结果将被作为下标或键,用来检索集合或 数组的适当元素。和点 运算符一样,方括号运算符也可以递归应用。这使得 EL 能够从 多维数组、嵌套集合或两者的任意组合中检索元素。此外,点 运算符和方括号运算符还可以互操作。例如,如果 数组的元素本身是对象,则可以使用方括号运算符来检索该数组的元素,并结合点运算符来检索该元素的一个特性(例如 ${urls[3].protocol} )。
假定 EL 充当指定动态属性值的简化语言,EL 存取器有一个有趣的功能(与 Java 语言的存取器不同),那就是它们在应用于 null 时不 抛出异常。如果应用 EL 存取器的对象(例如, ${foo.bar} 和 ${foo["bar"]} 中的 foo 标识符)是 null ,那么应用存取器的结果也是 null 。事实证明,在大多数情况下,这是一个相当有用的行为,不久您就会了解这一点。
最后,点运算符和方括号运算符可能实现某种程度的互换。例如,也可以使用 ${user["firstName"]} 来检索 user 对象的 firstName 特性,正如可以用 ${commands.dir} 获取与 commands 映射中的 "dir" 键相关联的值一样。
以下是el 表达式对javabean组件、 数组,Map集合、List集合中数据调用方法的简要总结:
数据类型
示例用法
实际调用方法
JavaBean组件
${colorBean.red}
${colorBean["red"]}
colorBean.getRed()
数组
${colorArray[2]}
${colorArray["2"]}
Array.get(colorArray, 2)
List
colorList[2]
colorList["2"]
colorList.get(2)
Map
colorMap[red]
colorMap["red"]
colorMap.get(pageContext.findAttribute("red"))
colorMap.get("red")

运算符

EL 还可以通过使用 标识符和存取器,遍历包含 应用程序数据(通过限制了 作用域变量公开)或关于环境的信息(通过 EL 隐式对象)的对象层次结构。但是,只是访问这些数据,通常不足以实现许多 JSP 应用程序所需的表示逻辑。
最终,EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。
表 2. EL 运算符
类别 运算符
算术运算符 + 、 - 、 * 、 / (或 div )和 % (或 mod )
关系运算符== (或 eq )、 != (或 ne )、 < (或 lt )、 > (或 gt )、 <= (或 le )和 >= (或 ge )
逻辑运算符 && (或 and )、 || (或 or )和 ! (或 not )
验证运算符 empty
算术运算符支持数值的加法、减法、乘法和除法。还提供了一个求余运算符。注:除法和求余运算符都有替代的、非符号的名称(为的是与 XPath 保持一致)。清单 5 中显示了一个演示算术运算符用法的示例 表达式。对几个 EL 表达式应用算术运算符的结果是将该算术运算符应用于这些表达式返回的数值所得的结果。
清单 5. 利用算术运算符的 EL 表达式
${item.price * (1 + taxRate[user.address.zipcode])}
关系运算符允许比较数字或文本数据。比较的结果作为布尔值返回。 逻辑运算符允许合并布尔值,返回新的布尔值。因此,可以将 EL 逻辑运算符应用于嵌套的关系或逻辑运算符的结果,如清单 6 所示。
清单 6. 利用关系和 逻辑运算符的 EL 表达式
${(x >= min) && (x <= max)}
最后一种 EL 运算符是 empty ,它对于验证数据特别有用。 empty 运算符采用单个 表达式作为其变量(也即, ${empty input} ),并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的 表达式被认为是空,即无元素的集合或 数组。如果参数是对长度为零的 String 求值所得的结果,则 empty 运算符也将返回 true 。
表 3 显示了 EL 运算符的优先级。正如清单 5 和 6 所示,可以用圆括号对 表达式分组,高于普通的优先级规则。
表 3. EL 运算符优先级(自顶到底,从左到右)
[] , .
()
unary - 、 not 、 ! 、 empty
* 、 / 、 div 、 % 、 mod
+ 、binary -
() <</code> 、 > 、 <= 、 >= 、 lt 、 gt 、 le 、 ge
== 、 != 、 eq 、 ne
&& 、 and
|| 、 or

文字

在 EL 表达式中,数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false 。
Taglib伪指令
正如我们先前讨论的,JSTL 1.0 包括四个定制标记库。为了演示 JSTL 标记和 表达式语言的交互,我们将研究几个来自 JSTL core 库的标记。和使用任何 JSP 定制标记库一样,必须在您想要使用这个库标记的任何页面中包括 taglib 伪指令。清单 7 显示了用于这个特定库的 伪指令
清单 7. 用于 JSTL core 库 EL 版本的 taglib 伪指令
<%@ taglib uri="http://java.suncom/jstl/core" prefix="c" %>
实际上,对应于 JSTL core 库的 taglib 伪指令有两种,因为在 JSTL 1.0 中,EL 是可选的。所有四个 JSTL 1.0 定制标记库都有使用 JSP 表达式(而不是 EL)指定动态属性值的备用版本。因为这些备用库依赖于 JSP 的更传统的请求时属性值,所以它们被称为 RT库,而那些使用 表达式语言的则被称为 EL 库。开发人员用不同的 taglib 伪指令来区分每个库的这两个版本。清单 8 显示了使用 core 库的 RT 版本的 伪指令。但是,由于我们讨论的重点是 EL,所以首先需要这些 伪指令
清单 8. 用于 JSTL core 库 RT 版本的 taglib 伪指令
<%@ taglib uri="http://java.suncom/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 的请求参数的值的平方。
清单 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 的会话 作用域 变量,它是一个类的实例,该类为用户定义了两个特性: username 和 company 。每当用户访问站点时,这个对象被自动分配给会话,但直到用户实际登录后,才会设置这两个特性。假定是这种方案,请考虑清单 14 中的 JSP 片段。在用户登录之后,这个片段将显示单词“Hello”,其后是他/她的用户名和一个惊叹号。但是,在用户登录之前,由这个片段生成的内容则是短语“Hello Guest!”。在这种情况下,因为 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 。
EL 和 JSP 2.0
表达式语言仅可用于指定 JSTL 定制标记中的动态属性值。但 JSTL 1.0 表达式语言的一个扩展已经被提出,会把它包括到 JSP 2.0 中去,眼下正在进行最后评审。这个扩展将允许开发人员通过自己的定制标记来使用 EL。页面作者将可以在当前允许使用 JSP 表达式的任何地方使用 EL 表达式,譬如将动态值插入模板文本中: <p>Your preferred time zone is $</p> 。
这个 JSP 2.0 功能(就象 JSTL 本身一样)将支持页面作者进一步减少对 JSP 编制 脚本元素的依赖,从而改进 JSP 应用程序的可维护性。

常用函数

fn:contains(string, substring)
如果参数string中包含参数substring,返回true
fn:containsIgnoreCase(string, substring)
如果参数string中包含参数substring(忽略大小写),返回true
fn:endsWith(string, suffix)
如果参数 string 以参数suffix结尾,返回true
fn:escapeXml(string)
将有特殊意义的XML (和HTML)转换为对应的XML实体字符,并返回转义后的字符
fn:indexOf(string, substring)
返回参数substring在参数string中第一次出现的位置
fn:join(array, separator)
将一个给定的 数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。
fn:length(item)
返回参数item中包含元素的数量。
参数Item类型是普通对象、 数组、Collection、Map、Iterator 迭代器、Enumeration枚举对象、
或者String。
如果是String类型,返回值是String中的字符数。
如果是 数组类型,返回值是数组的长度。
如果是Collection 容器类的子类,返回值是该容器类的包含元素的个数。
如果是Map类型,返回值是此映射中的键-值映射关系数。
如果是Iterator类型,返回值是Iterator中的元素个数。
如果是Enumeration类型,返回值是Enumeration中的元素个数
fn:replace(string, before, after)
返回一个String对象。
用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果
fn:split(string, separator)
返回一个 数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素
fn:startsWith(string, prefix)
如果参数string以参数prefix开头,返回true
fn:substring(string, begin, end)
返回参数string部分 字符串, 从参数begin开始到参数end位置,包括end位置的字符
fn:substringAfter(string, substring)
返回参数substring在参数string中后面的那一部分字符串
fn:substringBefore(string, substring)
返回参数substring在参数string中前面的那一部分字符串
fn:toLowerCase(string)
将参数string所有的 字符变为小写,并将其返回
fn:toUpperCase(string)
将参数string所有的字符变为大写,并将其返回
fn:trim(string)
去除参数string 首尾的空格,并将其返回

结束语

EL(与四个 JSTL 定制标记库提供的操作结合起来)允许页面作者不使用 脚本元素即可实现表示层逻辑。例如,对比本文开头 清单 1 中的 JSP 代码和清单 17 中显示的通过 JSTL 实现的同样功能。(JSTL core 库中其余的标记,包括 <c:choose> 及其子标记,将在本系列的下一篇文章中讨论。)尽管显然执行了条件逻辑,但是 JSTL 版本中没有 Java 语言 源代码,并且标记之间的关系(尤其是关于嵌套需求)对于任何精通 HTML 语法的人都应该是熟悉的。
清单 17. 合并 <c:set> 和 <c:out> 以提供缺省变量值
<c:choose><c:when test="${user.role == 'member'}">
<p>Welcome, member!</p>
</c:when><c:otherwise>
<p>Welcome, guest!</p>
</c:otherwise></c:choose>
通过提供大多数 Web 应用程序常用功能的标准实现,JSTL 有助于加速开发周期。与 EL 结合起来,JSTL 可以不需要对 表示层程序编写 代码,这极大地简化了 JSP 应用程序的维护。

4版本更新历史编辑

Date
Item
2009/04/22
Moved to a Maven based build system.
2008/12/21
A patch from Robert Goff has moved the trunk of the Standard Taglib up towards JSTL 1.2 level.
10/25/2004
Standard Taglib version 1.1.2 - A minor bug fix update - is now available.
07/20/2004
Standard Taglib version 1.1.1 released - A minor bug fix update - is now available.
01/30/2004
Standard Taglib version 1.1.0 - First official release of our implementation of JSTL 1.1 - is now available.
09/25/2003
Standard Taglib version 1.1.0-B1 - early access (Beta 1) of our implementation of JSTL 1.1 - is now available.
参考资料:JSTL官方网站 [1]  
参考资料
词条标签:
计算机学  ,  计算机术语
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值