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> 操作的语法
|
通过 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> 相结合的示例
|
<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> 操作的语法
|
清单 20 显示了 <c:redirect>
操作,它用一个到指定错误页面的重定向代替了清单 18 中的错误消息。在该示例中, <c:redirect>
标记的用法与标准 <jsp:forward>
操作的用法类似。不过请回忆一下:通过请求分派器进行转发是在服务器端实现的,而重定向却是由浏览器来执行的。从开发人员的角度来讲,转发比重定向更有效率,但 <c:redirect>
操作却更灵活一些,因为 <jsp:forward>
只能分派到当前 servlet 上下文内的其它 JSP 页面。
清单 20. 响应异常的重定向
|
从用户的角度来看,主要区别在于重定向会更新浏览器所显示的 URL,并因此影响书签的设置。转发却不这样,它对最终用户是透明的。这样,选择 <c:redirect>
还是 <jsp:forward>
还取决于所期望的用户体验。