JSTL请求重定向、包含、转发标签

导入内容

JSP 有两种内置机制可以将来自不同 URL 的内容合并到一个 JSP 页面: include 伪指令和 操作。不过,不管是哪种机制,要包含的内容都必须属于与页面本身相同的 Web 应用程序(或 servlet 上下文)。两个标记之间的主要区别在于: include 伪指令在页面编译期间合并被包含的内容,而 操作却在请求处理 JSP 页面时进行。

从本质上讲, core 库的 操作是更通用、功能更强大的 版本(好像是 “服用了兴奋剂”的)。和 一样, 也是一种请求时操作,它的基本任务就是将其它一些 Web 资源的内容插入 JSP 页面中。如清单 17 中所示,它的语法非常类似于 的语法。


清单 17. 操作的语法

通过 url 属性指定将要导入内容的 URL,这个属性是 的唯一一个必选属性。这里允许使用相对 URL,并且根据当前页面的 URL 来解析这个相对 URL。但是,如果 url 属性的值以斜杠开始,那么它就被解释成本地 JSP 容器内的绝对 URL。如果没有为 context 属性指定值,那么就认为这样的绝对 URL 引用当前 servlet 上下文内的资源。如果通过 context 属性显式地指定了上下文,那么就根据指定的 servlet 上下文解析绝对(本地)URL。

操作并不仅仅限于访问本地内容。也可以将包含协议和主机名的完整 URI 指定为 url 属性的值。实际上,协议甚至不仅局限于 HTTP。 url 属性值可以使用 java.net.URL 类所支持的任何协议。清单 18 中显示了这种能力。

其中, 操作用来包含通过 FTP 协议访问的文档内容。此外,还使用了 操作,以便在本地处理 FTP 文件传送期间可能发生的任何错误。错误处理是这样实现的:使用 var 属性为异常指定一个限定了作用域的变量,然后使用 检查其值。如果产生了异常,那么就会对那个限定了作用域的变量进行赋值:如清单 18 中的 EL 表达式所显示的那样,该变量的值将 会为空。由于 FTP 文档的检索将会失败,因此会显示有关这种情况的错误消息。


清单 18. 将 相结合的示例

操作的最后两个(可选的)属性是 varscopevar 属性会导致从指定 URL 获取的内容(作为 String 值)被存储在一个限定了作用域的变量中,而不是包含在当前 JSP 页面中。 scope 属性控制该变量的作用域,缺省情况下是页面作用域。如同我们在今后的文章中将要看到的那样,JSTL xml 库中的标记利用了 这种能力,即将整个文档存储在一个限定了作用域的变量中。

还要注意的是,可以使用(可选的)嵌套的 标记来为正在导入的 URL 指定请求参数。与在 中嵌套 标记一样,必要时也要对参数名称和参数值进行 URL 编码。



回页首


请求重定向

最后一个 core 库标记是 。该操作用于向用户的浏览器发送 HTTP 重定向响应,它是 JSTL 中与 javax.servlet.http.HttpServletResponsesendRedirect() 方法功能相当的标记。清单 19 中显示了该标记的 urlcontext 属性,它们的行为分别等同于 urlcontext 属性的行为,是嵌套任何 标记的结果。


清单 19. 操作的语法

清单 20 显示了 操作,它用一个到指定错误页面的重定向代替了清单 18 中的错误消息。在该示例中, 标记的用法与标准 操作的用法类似。不过请回忆一下:通过请求分派器进行转发是在服务器端实现的,而重定向却是由浏览器来执行的。从开发人员的角度来讲,转发比重定向更有效率,但 操作却更灵活一些,因为 只能分派到当前 servlet 上下文内的其它 JSP 页面。


清单 20. 响应异常的重定向

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

你可能感兴趣的:(J2EE)