8.3.9 URL相关的标签概述
JSTL核心标签库中提供了如下一些与URL操作相关的标签:
l <c:import>
l <c:url>
l <c:redirect>
l <c:param>
在举例讲解上面的某些标签时,要引用另外一个JSP文件,这里先创建好这个JSP文件,如例程8-20所示。
例程8-20 register.jsp
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
String name = request.getParameter("name");
name = new String(name.getBytes("iso-8859-1"),"gb2312");
session.setAttribute("name",name);
String country = request.getParameter("country");
country = new String(country.getBytes("iso-8859-1"),"gb2312");
session.setAttribute("country",country);
%>
name=${name};
country=${country}<br />
8.3.10 <c:param>标签
在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处。<c:param>标签有两种语法格式:
语法1,使用value属性指定参数的值:
<c:param name="name" value="value" />
语法2,在标签体中指定参数的值:
<c:param name="name">
parameter value
</c:param>
<c:param>标签的属性说明如表8.8所示。
表8.8 <c:param>标签的属性
8.3.11 <c:url>标签
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面,详细细节请参看笔者编著的《深入体验java Web开发内幕——核心基础》一书中的第7.4.8的讲解。<c:url>标签有两种语法格式:
语法1,没有标签体的情况:
<c:url value="value"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"] />
语法2,有标签体的情况,在标签体中指定构造的URL的参数:
<c:url value="value"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"]>
<c:param>标签
</c:url>
<c:url>标签的属性说明如表8.9所示。
表8.9 <c:url>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
value | true | String | 指定要构造的URL |
context | true | String | 当要使用相对路径导入同一个服务器下的其他WEB应用程序中的URL地址时,context属性指定其他WEB应用程序的名称 |
var | false | String | 指定将构造出的URL结果保存到Web域中的属性名称 |
scope | false | String | 指定将构造出的URL结果保存到哪个Web域中 |
value属性所指定的URL可以是相对路径和绝对路径,其具体细节与8.3.12节的<c:import>标签的url属性的细节相同。使用<c:url>标签构造URL时,可以通过嵌套的<c:param>标签指定参数,或在value属性中直接指定参数。
例程8-21是一个使用<c:url>标签的例子程序。
例程8-21 c_url.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
使用绝对路径构造URL:
<c:url value="http://localhost:8080/JSTL/URL/register.jsp" var="myUrl1">
<c:param name="name" value="张三" />
<c:param name="country" value="${param.country}" />
</c:url>
<a href="${myUrl1}">Register1</a><hr />
使用相对当前JSP页面的路径构造URL:
<c:url value="register.jsp?name=wangwu&country=France" var="myUrl2" />
<a href="${myUrl2}">Register2</a><hr />
使用相对当前WEB应用的路径构造URL:
<c:url value="/URL/register.jsp?name=zhaoliu&country=England" var="myUrl3" />
<a href="${myUrl3}">Register3</a>
在浏览器地址栏输入如下地址访问例程8-21:
http://localhost:8080/JSTL/c_url.jsp?country=China
查看例程8-21的运行结果的源文件,内容如例程8-22所示。
例程8-22 c_url.jsp运行结果的源文件
使用绝对路径构造URL:
<a href="http://localhost:8080/JSTL/URL/register.jsp?name=%d5%c5%c8%fd&country=China">Register1</a><hr />
使用相对当前JSP页面的路径构造URL:
<a href="register.jsp?name=wangwu&country=France">Register2</a><hr />
使用相对当前WEB应用的路径构造URL:
<a href="/JSTL/URL/register.jsp?name=zhaoliu&country=England">Register3</a>
8.3.12 <c:import>标签
<c:import>标签用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似<jsp:include>这个JSP标准标签,但功能更强大。<c:import>标签标签有两种语法格式:
语法1,将URL地址指向的资源内容以字符串形式输出或以字符串形式保存到一个变量中:
<c:import url="url"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"]
[charEncoding="charEncoding"]>
optional body content for <c:param> subtags
</c:import>
语法2,将URL地址指向的资源内容保存到一个Reader对象中:
<c:import url="url"
[context="context"]
varReader="varReaderName"
[charEncoding="charEncoding"]>
body content where varReader is consumed by another action
</c:import>
<c:import>标签的属性说明如表8.10所示。
表8.10 <c:import>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
url | true | String | 指定要导入的资源的URL地址 |
context | true | String | 当要使用相对路径导入同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称 |
var | false | String | 指定将导入的资源内容保存到Web域中的属性名称 |
scope | false | String | 指定将导入的资源内容保存到哪个Web域中 |
charEncoding | true | String | 将导入的资源内容转换成字符串时所使用的字符集编码 |
varReader | false | String | 指定将导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。 |
使用<c:import>标签导入其他资源文件时,如果被导入的资源文件中含有非ASCII码字符,必须注意指定charEncoding属性,否则可以不设置这个属性。
当使用第1种语法格式时,如果指定了var属性,导入的资源内容以字符串形式保存到一个变量中,var属性指定了这个变量保存在Scope属性指定的Web域中的名称;如果没有指定var属性,导入的资源内容将以字符串形式直接输出。第1种语法格式的标签体内中可以嵌套<c:param>标签来给导入的资源传递参数。
使用第2种语法格式时,导入的资源内容保存到page域中的一个java.io.Reader对象中,varReader属性指定了该Reader对象在page这个Web域中的属性名称。因为<c:import>标签在标签结束时将关闭Reader对象对应的输入流,所以varReader属性指定的变量只在标签内有效。第2种语法格式的标签体内中应该且只能嵌套调用varReader属性指定的reader对象的其他标签。当使用第2种语法格式时,<c:import>标签体内不能嵌套<c:param>标签,如果要给导入的资源传递参数,则必须在url属性值中设置好这些参数,这时可以使用<c:url>标签来创建一个带参数的URL地址,此时如果有必要,<c:import>标签将删除导入资源中的所有URL重写后产生的session id信息。
使用<c:import>标签导入外部资源文件时,url属性可以设置为被导入资源的相对URL或绝对URL。
1.使用相对URL导入其他资源文件
(1)当被导入的外部资源文件与当前JSP文件属于同一个WEB应用程序时,JSP容器对资源路径的处理与<jsp:include>标签相同,这时路径可以以“/”字符开始,也可以以文件名或目录名开始。如果路径以“/”字符开始,则被导入资源文件的路径是相对于JSP页面所在的WEB应用的根路径;如果路径以文件名或目录名开始,则被导入的资源文件的路径就是相对于当前的JSP页面的路径。
(2)当被导入的外部资源文件与JSP文件属于同一个服务器下的不同的WEB应用时,如果要使用相对路径,路径必须以“/”开始。此时,<c:import>标签的context属性必须被设置为被导入的资源文件所在的WEB应用程序的名称。注意:使用相对路径导入其它WEB应用程序中的资源时,必须在<TOMCAT_HOME>\conf\server.xml配置文件中将使用<c:import>标签的WEB应用程序的<Context>元素的crossContext属性设置为true,如下所示:
<Context path="/JSTL" docBase="JSTL" crossContext="true"/>
2.使用绝对URL导入其他资源
使用绝对路径导入外部资源文件时,即使被导入的文件与当前JSP文件属于同一个WEB应用程序,被导入的资源文件也不会共享当前JSP页面的request和session对象。因为在这种情况下,当前JSP文件所属的Web服务器充当了一个Http客户端程序,去访问绝对路径所指定的外部资源文件,然后将响应结果的实体内容加入到当前JSP页面中,此时,访问当前JSP页面的客户端是浏览器,而访问绝对路径所指定的外部资源文件的客户端是当前JSP文件所属的Web服务器,这显然属于两个不同的客户端,所以,被导入的资源文件和当前JSP页面不可能共享request和session对象。
例程8-23是使用<c:import>标签的一个应用举例。
例程8-23 c_import.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
使用相对路径导入同一个WEB应用中的资源:<br />
<c:import url="/register.jsp?name=zhangsan">
<c:param name="name" value="zxx" />
</c:import><hr />
使用相对路径导入同一个服务器下的不同WEB应用中的资源:<br />
<c:import url="/hello.jsp" context="/EL" /><hr />
使用绝对路径导入资源示例1:
<c:import url="http://localhost:8080/EL/hello.jsp" /><hr />
使用绝对路径导入资源示例2:
<c:import url="http://localhost:8080/JSTL/register.jsp" var="myImport"
charEncoding="gb2312">
<c:param name="name" value="${param.name}" />
<c:param name="country" value="中国" />
</c:import>
${myImport}
在浏览器地址栏输入如下地址访问例程8-23,其运行结果如图8.20 所示:
http://localhost:8080/JSTL/c_import.jsp?name=zxx&country=China
图8.20
在<c:import>标签中使用相对路径导入其他资源时,其工作原理与<jsp:include>标签相同,所以,在被导入的资源文件中可以获得传递给当前JSP页面的请求参数,例如,例程8-23中的第一个<c:import>标签并没有在目标url后增加country参数,但是,在register.jsp页面中获得了country参数。
8.3.13 <c:redirect>标签
<c:redirect>标签用于将当前的访问请求转发或重定向到其他资源,它可以根据url属性所指定的地址,执行类似<jsp:forward>这个JSP标准标签的功能,将访问请求转发到其他资源;或执行response.sendRedirect()方法的功能,将访问请求重定向到其他资源。<c:redirect>标签有两种语法格式:
语法1,没有标签体的情况:
<c:redirect url="value" [context="context"] />
语法2,有标签体的情况,在标签体中指定重定向时的参数:
<c:redirect url="value" [context="context"]>
<c:param>subtags
</c:redirect>
<c:redirect>标签的属性说明如表8.11所示。
表8.11 <c:redirect>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
url | true | String | 指定要转发或重定向到的目标资源的URL地址 |
context | true | String | 当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称 |
url属性指定将要重定向的资源的URL时,可以使用相对路径和绝对路径,其具体细节与<c:import>标签的url属性相同。例程8-24是一个使用<c:redirect>标签的应用例子。
例程8-24 c_redirect.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:url value="http://localhost:8080/JSTL/URL/register.jsp" var="myUrl">
<c:param name="name" value="张三" />
<c:param name="country" value="中国" />
</c:url>
<c:redirect url="${myUrl}" />
例程8-24的运行结果如图8.21 所示。
图8.21