9.3.10 <c:url>标签
<c:url>标签主要用于对URL的重写。重写URL其实就是为URL增加Session ID和请求参数。<c:url>标签有如下两种语法格式:
1 语法1:没有标签体的情况
<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]/>
2 语法2:有标签体的情况,使用标签体设置请求参数
<c:url value="value" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]>
0个或多个<c:param>标签
</c:url>
其中黑体字部分为属性的默认值。
<c:url>标签的属性说明如表9.10所示。
表9.10 <c:url>标签的属性
属性名 | 是否支持动态属性值 | 属性类型 | 属性描述 |
value | true | String | 指定要重写的URL。 |
context | true | String | 当要重写同一服务器的其他Web应用程序中的资源的URL时,该属性指定了其他Web应用程序的名称。 |
var | false | String | 将重写后的URL保存在指定Web域中的属性名。 |
scope | false | String | 指定重写后的URL要保存到的Web域。 |
在使用<c:url>标签时应注意如下几点:
l value属性可以是绝对路径,也可以是相对路径。
l 如果指定context属性,var属性和context属性的值必须以“/”开头,否则<c:url>标签会抛出异常。
l 如果为URL指定的请求参数中包含中文,应在<c:url>标签中使用<c:param>子标签指定请求参数。而不要直接将请求参数放到URL后面。因为<c:param>标签会自动对中文请求参数进行编码,而<c:url>标签并不会对中文请求参数进行编码。
l 如果指定scope属性,必须指定var属性,否则<c:url>标签会抛出异常。
l 如果未指定var属性,<c:url>标签会将重写后的URL直接输出到客户端。如果指定了var属性,则<c:url>标签会将重写后的URL保存在指定的Web域中,并不会将重写后的URL输出到客户端。要想输出或引用重写后的URL,可以使用EL或其他方法从Web域中读取被重写的URL。
l 如果value属性指定的URL中包含的请求参数名和<c:param>标签指定的请求参数重名,<c:url>标签会使用两个重名的请求参数来重写URL,而不会使用其中一个请求参数值来覆盖另外一个请求参数值。
url.jsp页面是一个使用<c:url>标签重写URL的例子,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
重写绝对路径,并生成链接<br>
<a href='<c:url value="http://nokiaguy.blogjava.net"/>'>
http://nokiaguy.blogjava.net
</a>
<hr>
使用context属性重写相对路径<br>
<c:url value="/chapter9/url.jsp" context="/demo" />
<hr>
将重写后的URL保存在session域中,并通过param标签指定中文请求参数<br>
<c:url var="newURL" value="http://localhost:8080/demp/chapter9/url.jsp" >
<c:param name="name">超人</c:param>
</c:url>
使用EL输出session域中被重写的URL<br>
${newURL}
<hr>
指定重名的请求参数<br>
<c:url value="http://localhost:8080/demp/chapter9/url.jsp?name=bill" >
<c:param name="name">超人</c:param>
</c:url>
<hr>
假设本地的IP地址是192.168.17.127(读者需要使用自己机器的IP地址),在浏览器地址栏中输入如下的URL:
http://192.168.17.127:8080/demo/chapter9/url.jsp
浏览器显示的结果如图9.17所示。
图9.17 使用<c:url>标签重写URL
从图9.17所示的输出结果可以看出,在重写相对路径的URL时,<c:url>标签会将Session ID作为请求参数自动添加在URL的后面。当刷新图9.17所示的页面后,这个Session ID将消失。这说明浏览器使用了Cookie来传递Session ID。读者可以使用5.4.5节中的方法关闭浏览器对Cookie支持。在新的浏览器窗口多次访问上面的URL,每次都会在被重写的相对路径后面出现Session ID,而且每次都不相同。这说明当关闭浏览器的Cookie功能时,Session ID将通过URL来传递。