JSTL core
库中的其余标记主要是关于 URL。这些标记中的第一个被适当地命名为 <c:url>
标记,用于生成 URL。尤其是, <c:url>
提供了三个功能元素,它们在为 J2EE Web 应用程序构造 URL 时特别有用:
- 在前面附加当前 servlet 上下文的名称
- 为会话管理重写 URL
- 请求参数名称和值的 URL 编码
清单 12 显示了 <c:url>
标记的语法。 value
属性用来指定基本 URL,然后在必要时标记对其进行转换。如果这个基本 URL 以一个斜杠开始,那么会在它前面加上 servlet 的上下文名称。可以使用 context
属性提供显式的上下文名称。如果省略该属性,那么就使用当前 servlet 上下文的名称。这一点特别有用,因为 servlet 上下文名称是在部署期间而不是开发期间决定的。(如果这个基本 URL 不是以斜杠开始的,那么就认为它是一个相对 URL,这时就不必添加上下文名称。)
清单 12. <c:url> 操作的语法
|
URL 重写是由 <c:url>
操作自动执行的。如果 JSP 容器检测到一个存储用户当前会话标识的 cookie,那么就不必进行重写。但是,如果不存在这样的 cookie,那么 <c:url>
生成的所有 URL 都会被重写以编码会话标识。注:如果在随后的请求中存在适当的 cookie,那么 <c:url>
将停止重写 URL 以包含该标识。
如果为 var
属性提供了一个值(还可以同时为 scope
属性提供一个相应的值,这是可选的),那么将生成的 URL 赋值给这个限定了作用域的指定变量。否则,将使用当前的 JspWriter
输出生成的 URL。这种直接输出其结果的能力允许 <c:url>
标记作为值出现,例如,作为 HTML <a>
标记的 href
属性的值,如清单 13 中所示。
清单 13. 生成 URL 作为 HTML 标记的属性值
|
最后,如果通过嵌套 <c:param>
标记指定了任何请求参数,那么将会使用 HTTP GET 请求的标准表示法将它们的名称和值添加到生成的 URL 后面。此外,还进行 URL 编码:为了生成有效的 URL,将对这些参数的名称或值中出现的任何字符适当地进行转换。清单 14 演示了 <c:url>
的这种行为。
清单 14. 生成带请求参数的 URL
|
清单 14 中的 JSP 代码被部署到一个名为 blog
的 servlet 上下文,限定了作用域的变量 searchTerm
的值被设置为 "core library"
。如果检测到了会话 cookie,那么清单 14 生成的 URL 将类似于清单 15 中的 URL。注:在前面添加上下文名称,而在后面附加请求参数。此外, keyword
参数值中的空格和 month
参数值中的斜杠都被按照 HTTP GET 参数的需要进行了编码(确切地说,空格被转换成了 +
,而斜杠被转换成了 %2F
序列)。
清单 15. 有会话 cookie 时生成的 URL
|
当没有会话 cookie 时,生成的结果如清单 16 中所示。同样,servlet 上下文被添加到了前面,而 URL 编码的请求参数被附加到了后面。不过,除此以外还重写了基本 URL 以包含指定的会话标识。当浏览器发送用这种方式重写的 URL 请求时,JSP 容器自动抽取会话标识,并将请求与相应的会话进行关联。这样,需要会话管理的 J2EE 应用程序就无需依赖由应用程序用户启用的 cookie 了。
清单 16. 没有会话 cookie 时生成的 URL
|