Board logo

标题: JSTL 入门 探讨 core(6)导入内容 [打印本页]

作者: look_w    时间: 2018-7-15 08:46     标题: JSTL 入门 探讨 core(6)导入内容

导入内容JSP 有两种内置机制可以将来自不同 URL 的内容合并到一个 JSP 页面:         include 伪指令和         <jsp:include> 操作。不过,不管是哪种机制,要包含的内容都必须属于与页面本身相同的 Web 应用程序(或 servlet 上下文)。两个标记之间的主要区别在于:         include 伪指令在页面编译期间合并被包含的内容,而         <jsp:include> 操作却在请求处理 JSP 页面时进行。      
从本质上讲,         core 库的         <c:import> 操作是更通用、功能更强大的         <jsp:include> 版本(好像是         <jsp:include> “服用了兴奋剂”的)。和         <jsp:include> 一样,         <c:import> 也是一种请求时操作,它的基本任务就是将其它一些 Web 资源的内容插入 JSP 页面中。如清单 17 中所示,它的语法非常类似于         <c:url> 的语法。      
清单 17. <c:import> 操作的语法
1
2
3
4
5
6
7
8
9
10
11
12
<c:import url="
        expression" context="
        expression"
    charEncoding="
        expression" var="
        name" scope="
        scope">
  <c:param name="
        expression" value="
        expression"/>
  ...
</c:import>




通过         url 属性指定将要导入内容的 URL,这个属性是         <c:import> 的唯一一个必选属性。这里允许使用相对 URL,并且根据当前页面的 URL 来解析这个相对 URL。但是,如果         url 属性的值以斜杠开始,那么它就被解释成本地 JSP 容器内的绝对 URL。如果没有为         context 属性指定值,那么就认为这样的绝对 URL 引用当前 servlet 上下文内的资源。如果通过         context 属性显式地指定了上下文,那么就根据指定的 servlet 上下文解析绝对(本地)URL。      
但         <c:import> 操作并不仅仅限于访问本地内容。也可以将包含协议和主机名的完整 URI 指定为         url 属性的值。实际上,协议甚至不仅局限于 HTTP。         <c:import> 的         url 属性值可以使用         java.net.URL 类所支持的任何协议。清单 18 中显示了这种能力。      
其中,         <c:import> 操作用来包含通过 FTP 协议访问的文档内容。此外,还使用了         <c:catch> 操作,以便在本地处理 FTP 文件传送期间可能发生的任何错误。错误处理是这样实现的:使用         <c:catch> 的         var 属性为异常指定一个限定了作用域的变量,然后使用         <c:if> 检查其值。如果产生了异常,那么就会对那个限定了作用域的变量进行赋值:如清单 18 中的 EL 表达式所显示的那样,该变量的值将        会为空。由于 FTP 文档的检索将会失败,因此会显示有关这种情况的错误消息。      
清单 18. 将 <c:import> 与 <c:catch> 相结合的示例
1
2
3
4
5
6
<c:catch var="exception">
  <c:import url="ftp://ftp.example.com/package/README"/>
</c:catch>
<c:if test="${not empty exception}">
  Sorry, the remote content is not currently available.
</c:if>




<c:import> 操作的最后两个(可选的)属性是         var 和         scope 。         var 属性会导致从指定 URL 获取的内容(作为         String 值)被存储在一个限定了作用域的变量中,而不是包含在当前 JSP 页面中。         scope 属性控制该变量的作用域,缺省情况下是页面作用域。如同我们在今后的文章中将要看到的那样,JSTL         xml 库中的标记利用了         <c:import> 这种能力,即将整个文档存储在一个限定了作用域的变量中。      
还要注意的是,可以使用(可选的)嵌套的         <c:param> 标记来为正在导入的 URL 指定请求参数。与在         <c:url> 中嵌套         <c:param> 标记一样,必要时也要对参数名称和参数值进行 URL 编码。      
请求重定向最后一个         core 库标记是         <c:redirect> 。该操作用于向用户的浏览器发送 HTTP 重定向响应,它是 JSTL 中与         javax.servlet.http.HttpServletResponse 的         sendRedirect() 方法功能相当的标记。清单 19 中显示了该标记的         url 和         context 属性,它们的行为分别等同于         <c:import> 的         url 和         context 属性的行为,是嵌套任何         <c:param> 标记的结果。      
清单 19. <c:redirect> 操作的语法
1
2
3
4
5
6
7
8
<c:redirect url="
        expression" context="
        expression">
  <c:param name="
        expression" value="
        expression"/>
  ...
</c:redirect>




清单 20 显示了         <c:redirect> 操作,它用一个到指定错误页面的重定向代替了清单 18 中的错误消息。在该示例中,         <c:redirect> 标记的用法与标准         <jsp:forward> 操作的用法类似。不过请回忆一下:通过请求分派器进行转发是在服务器端实现的,而重定向却是由浏览器来执行的。从开发人员的角度来讲,转发比重定向更有效率,但         <c:redirect> 操作却更灵活一些,因为         <jsp:forward> 只能分派到当前 servlet 上下文内的其它 JSP 页面。      
清单 20. 响应异常的重定向
1
2
3
4
5
6
<c:catch var="exception">
  <c:import url="ftp://ftp.example.com/package/README"/>
</c:catch>
<c:if test="${not empty exception}">
  <c:redirect url="/errors/remote.jsp"/>
</c:if>




从用户的角度来看,主要区别在于重定向会更新浏览器所显示的 URL,并因此影响书签的设置。转发却不这样,它对最终用户是透明的。这样,选择         <c:redirect> 还是         <jsp:forward> 还取决于所期望的用户体验。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0