9.3.12 <c:import>标签
<c:import>标签用于在JSP页面中导入一个由URL指定的Web资源的内容。该标签和<jsp:include>标签(详见6.5.1节的内容)的功能类似,但要比<jsp:include>标签的功能更强大。<c:import>标签有如下两种语法格式:
1 语法1:将URL指向的Web资源的内容以字符串形式输出
<c:import url="url" [context="context"]
[var="varName"] [scope="{page|request|session|application}"]
[charEncoding="charEncoding"]>
0个或多个<c:param>标签
</c:import>
2 语法2:将URL指向的Web资源的内容保存在一个Reader对象中
<c:import url="url" [context="context"] varReader="varReaderName"
[charEncoding="charEncoding"]>
只能在标签体内使用Reader对象
</c:import>
<c:import>标签的属性说明如表9.12所示。
表9.12 <c:import>标签的属性
属性名 | 是否支持动态属性值 | 属性类型 | 属性描述 |
url | true | String | 指定要导入的Web资源的URL。 |
context | true | String | 当要导入同一服务器的其他Web应用程序中的资源的URL时,该属性指定了其他Web应用程序的名称。 |
var | false | String | 指定要导入资源保存到Web域中的属性名称。 |
scope | false | String | 指定要导入资源保存的Web域。 |
charEncoding | true | String | 指定要导入资源内容转换成字符串时所使用的字符集编码。 |
varReader | false | String | 如果将导入的资源内容保存在Web域中的java.io.Reader对象中,该属性指定保存在Web域中的java.io.Reader对象的属性名称。 |
在使用<c:import>标签时应注意如下几点:
1 url属性指定的要导入资源的URL可以是相对路径(如abc.jsp),也可以是绝对路径(如http://nokiaguy.blogjava.net)。当被导入的资源文件是相对路径时,相对路径的首字符可以是“/”,也可以不是“/”。如果是“/”,表示相对于当前JSP页面所在的Web应用程序的根路径;如果相对路径的首字符不是“/”,表示相对于当前JSP页面的路径。
2 在使用<c:import>标签导入Web资源时相当于在浏览器中直接访问该Web资源。也就是说,<c:import>标签导入的资源内容是Web资源在服务端执行后输出到客户端的内容。例如,如果导入的是JSP页面,导入后的结果是JSP页面输出到客户端的内容。如果要想将导入的资源按原样进行导入,需要将资源文件的扩展名修改成非服务端程序的扩展名,如.txt。
3 如果使用语法1,在未指定var属性的情况下,<c:import>标签将导入的资源内容以字符串形式直接输出;如果指定了var属性,<c:import>标签将导入的资源内容保存在scope属性指定的Web域中,var属性指定了将导入的资源内容保存在Web域中的属性名。
4 如果导入的资源中包含有非西欧字符(如GBK、UTF-8),必须使用charEncoding属性指定相应的字符集编码,否则在导入资源内容后会出现乱码。
5 如果使用语法2,<c:import>标签导入的资源内容保存在page域中的java.io.Reader对象中,varReader属性指定了该Reader对象在page域中的属性名。
6 由于在<c:import>标签结束时就会自动将java.io.Reader对象关闭,并从page域中删除。因此,在使用语法2时,必须在<c:import>的标签体内使用Reader对象。而且在<c:import>的标签体内不能有<c:param>标签,否则<c:import>标签会抛出异常。如果要给URL传参数,必须直接在url属性中设置好这些参数,这时可以使用<c:url>标签来生成带参数的URL。
7 如果url属性值是null、空串或指定的URL无效,<c:import>标签会抛出异常。
8 如果指定了charEncoding属性,但charEncoding属性值是null或空串,<c:import>标签会忽略charEncoding属性。
下面的例子演示了如何使用<c:import>标签来导入Web资源。在实现这个例子之前,先将在9.2节建立的myjstl.jsp文件复制一份,并改名为myjstl.txt。
import.jsp是一个使用<c:import>标签导入Web资源的例子,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
使用语法1导入JSP页面,并直接输出导入的内容<p/>
<c:import url="myjstl.jsp" />
<hr>
使用语法1导入txt文件,并将导入的内容保存在request域中<p/>
<c:import var="myjstl" url="myjstl.txt" charEncoding="UTF-8" scope="request" />
<c:out value="${myjstl}" />
<hr>
使用语法2导入JSP页面,并将导入的内容保存在page域中<p/>
<c:url var="url" value="choose.jsp" >
<c:param name="price" value="${param.price}"/>
</c:url>
<c:import varReader="reader" url="${url}">
<c:out value="${reader}" />
</c:import>
<hr>
使用语法2导入txt文件,并将导入的内容保存在page域中<p />
<c:import varReader="reader" url="myjstl.txt" charEncoding="UTF-8">
<c:out value="${reader}" />
</c:import>
<hr>
使用语法2导入跨域Web资源(使用绝对路径)<p/>
<c:import varReader="reader" url="http://www.csdn.net" charEncoding="UTF-8">
<c:out value="${reader}" />
</c:import>
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter9/import.jsp?price=230
浏览器显示的结果如图9.19所示。
图9.19 使用<c:import>标签导入资源内容