- 浏览: 105418 次
- 性别:
- 来自: 南京
文章分类
最新评论
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修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通页面布局和图形设计的设计人员来开发和维护 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 的支持。 表达式语言 在 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 还可以通过使用标识符和存取器,遍历包含应用程序数据(通过限制了作用域的变量公开)或关于环境的信息(通过 EL 隐式对象)的对象层次结构。但是,只是访问这些数据,通常不足以实现许多 JSP 应用程序所需的表示逻辑。 最终,EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。 表 2. EL 运算符 类别 运算符 算术运算符 +、-、*、/(或 div)和 %(或 mod) 关系运算符 ==(或 eq)、!=(或 ne)、<</code>(或 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=" (user.getRole() == "member")) { %> <p>Welcome, member!</p> <% } else { %> <p>Welcome, guest!</p> <% } %> http://java.sun.com/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.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 的请求参数的值的平方。 清单 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 $ {timezone}</p>。 这个 JSP 2.0 功能(就象 JSTL 本身一样)将支持页面作者进一步减少对 JSP 编制脚本元素的依赖,从而改进 JSP 应用程序的可维护性。 结束语 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 应用程序的维护。 |
发表评论
-
规范的模板化项目架构管理
2012-05-03 23:31 892总在寻找项目开发简单化、标准化、统一化的开发管理方法,在项目 ... -
Java的ftp上传下载工具
2012-04-05 22:17 1774自己写的利用apache的net包写的ftp的上传、下 ... -
SmartGWT学习注意事项(一)
2012-03-31 20:42 1581首先表明,我 ... -
J2ME程序开发全方位基础讲解汇总
2007-08-03 14:19 626一、J2ME中需要的Java基础知识现在有大部分人,都是从零开 ... -
使用J2ME技术开发RPG游戏
2007-08-03 14:24 556RPG(角色扮演游戏)是手机游戏中的一类主要类型,也是相对来说 ... -
移动视频: QuickTime for Java API 入门
2007-08-05 12:45 625在 Java 平台上创建 iPod 视频内容 ... -
技术交流:QuickTime流媒体和Java(图)
2007-08-05 12:46 633这并不是即将问世的Quic ... -
JMF下载安装与支持格式
2007-08-05 12:47 859JMF开发进度不是很快,所以目前还是比较薄弱。 JMF,全名 ... -
搭建J2ME开发环境
2007-08-05 12:48 569由于WTK并没有提供代码编辑的功能,因此本文讲述如何使用Ecl ... -
JMF系统介绍
2007-08-09 15:18 723一.简介 1.1JMF 体系结构 ... -
Experiments in Streaming Content in Java ME(一)
2007-08-13 13:43 583Since my book on Mobile Media A ... -
Experiments in Streaming Content in Java ME(二)----Creating an RTSP Protocol Handler
2007-08-13 13:44 1451Recall that RTSP is the actual ... -
Experiments in Streaming Content in Java ME(三)-----Back to RTPSourceStream and StreamingDataSource
2007-08-13 13:46 1032With the protocol handler in pl ... -
java中文件操作大全
2007-08-22 15:40 557一.获得控制台用户输入的信息 /***//**获得控 ... -
Pocket PC、Pocket PC Phone、Smartphone的区别
2007-08-23 16:59 662首先说明几个概念: 1、什么是Pocket PC?Pocket ... -
Struts配置文件详解(来自csdn)
2007-11-30 08:35 499Struts应用采用两个基于X ... -
jBPM开发入门指南(5)
2007-11-30 08:45 538jBPM开发入门指南(5) 前篇说起要讲在JBPM中实现用 ... -
jBPM开发入门指南(4)
2007-11-30 08:48 614jBPM开发入门指南(4) 7 jBPM 的客户端 ... -
jBPM开发入门指南(3)
2007-11-30 08:51 6415 安装 jBPM 的 Eclipse 开发插件 有 ... -
jBPM开发入门指南(2)
2007-11-30 08:52 6534 数据库初始化 jBPM 需要数据库支持, jBPM ...
相关推荐
### JSP_JSTL基础教程 #### JSTL 1.1 简介 JSTL(JavaServer Pages Standard Tag Library),即JSP标准标签库,是专门为Java Web开发者设计的一套标准化标签集合,旨在简化JSP页面的编写工作。最新版本1.1由JCP...
Core标签库**:这是JSTL的基础,提供了用于控制流程、数据管理、URL生成等操作的标签。例如,`<c:forEach>`用于迭代集合,`<c:if>`和`<c:choose>`用于条件判断,`<c:set>`和`<c:remove>`用于变量的设置和移除。 **...
无论你是初学者还是有经验的开发者,JSTL教程都能帮助你巩固基础,进一步提升你的技能水平。 总之,JSTL是JSP开发中的一个重要工具,它通过提供标准化的标记库,简化了Web应用程序的开发流程,让开发者能够更加专注...
- **Core**:基础标签库,包括用于控制流程、页面导航、输出文本等的标签。 - **Format**:格式化标签库,用于日期、数字、货币等的格式化。 - **I18N**:国际化标签库,支持多语言环境。 - **Function**:函数标签...
1. **Core Tag Library**: 这个库提供了基础的控制结构标签,如`<c:if>`(条件判断)、`<c:forEach>`(循环)和`<c:out>`(输出)。`<c:out>`标签用于安全地输出数据,可以防止XSS攻击,例如: ```jsp ${userList....
这份教程可能详细介绍了JSTL的基础概念、核心标签库的用法以及示例,帮助初学者快速掌握JSTL的基本操作。内容可能包括条件标签(如`<c:if>`、`<c:choose>`)、迭代标签(如`<c:forEach>`)、URL处理(如`<c:url>`、`...
JSTL的核心库(core library)是其基础,包含了用于控制流程(如if和for-each)、数据管理(如设置和获取变量)以及URL处理的标记。例如,`<c:if>`和`<c:forEach>`分别用于条件判断和循环,而`<c:set>`和`<c:out>`则...
### JSTL 教程(繁体字版本) #### JSTL 概述 JSTL,全称为 JavaServer Pages Standard Tag Library(JavaServer 页面标准标签库),是为简化 JavaServer Pages (JSP) 页面开发而设计的一组标签库。JSTL 的引入极...
本教程将引导您了解JSTL的基础知识,并通过实例进行讲解。 ### 一、JSTL概述 1. **定义**: JSTL是由Apache软件基金会的Jakarta项目开发的一个开源库,旨在提高JSP的可维护性和可读性,通过使用预定义的标签而不是...
1. **Core标签库**:这是JSTL最基础的部分,包含了一系列处理页面流程控制、条件判断、迭代等任务的标签。例如`<c:if>`用于条件判断,`<c:forEach>`用于遍历集合,`<c:choose>`、`<c:when>`和`<c:otherwise>`用于多...
1. **JSTL的核心库(core)**提供了基础的控制结构,如循环和条件语句,以及变量管理。例如,`<c:forEach>`标签用于迭代集合,`<c:if>`用于执行条件判断,还有`<c:set>`和`<c:remove>`分别用于设置和清除变量。 2. ...
**JSTL(JavaServer Pages Standard ...通过这个压缩包,你将拥有开发JSTL应用所需的基础工具,开始你的Web开发之旅吧!记住,实践是检验真理的唯一标准,多动手,多思考,你会发现JSTL能为你的Web开发带来极大的便利。
**JSTL(JavaServer Pages Standard Tag Library)入门标准教程** **一、JSTL概述** JSTL是由Apache软件基金会开发的一个JavaServer Pages(JSP)标准标签库,它提供了一系列标签来简化JSP页面的开发,使代码更加...
本教程聚焦于Core JSTL,它是JSTL中最基础也最常用的部分。 Core JSTL标签库提供了许多用于控制流程、处理URL、导入页面、输出数据、进行条件判断和循环操作的标签。这些标签极大地简化了JSP开发,使代码更易于阅读...
Core标签集是JSTL中最基础的部分,包括了与控制流程、URL处理、页面导航等相关的标签。例如: - `<c:if>`:用于条件判断,根据指定的表达式来决定是否执行某段代码。 - `<c:choose>`, `<c:when>`, `<c:otherwise>`:...
### JSTL Java 教程 #### 一、引言 JSTL(JavaServer Pages Standard Tag Library)是一种用于简化JSP...对于初学者来说,掌握JSTL的基础知识是非常重要的,这将有助于提高开发效率并创建出更为优雅的Web应用程序。
**PDF文档** 很可能是JSTL的官方文档或者教程,对于初学者来说非常有价值。它会详细介绍JSTL的各种标签及其用法,包括如何在JSP页面中导入JSTL库,如何配置web.xml文件,以及如何使用各个标签进行编程。 在Eclipse...
正确配置这两个库,特别是将它们放置在`WEB-INF/lib`目录下,是构建高效、易维护的Java Web应用的基础。理解并熟练使用JSTL可以极大地提升开发效率,同时降低代码的复杂度。在开发过程中,应该养成良好的项目结构...
在"jstl库-tomcat10"这个压缩包中,可能包含了JSTL库的jar文件,以及一些示例或教程,帮助开发者更好地理解和使用JSTL与Tomcat 10的集成。通过学习和实践这些内容,开发者可以更加熟练地在JSP页面中运用JSTL标签,...