9.3.10 <c:url>标签

优质
小牛编辑
122浏览
2023-12-01

<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所示。

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来传递。