使用jsp:include控制动态内容的方法

本文实例讲述了使用jsp:include控制动态内容的方法。分享给大家供大家参考,具体如下:

清单 1. JSP include 伪指令

<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>newInstance.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@ include file="header.jsp" %>
<%@ include file="navigation.jsp" %>
<%@ include file="bookshelf.jsp" %>
<%@ include file="/mt-blogs/index.jsp" %>
<%@ include file="footer.jsp" %>
</body>
</html>
]]>

虽然 include 非常适于将静态内容并入 Web 页面,但对于动态内容却不尽如人意。我们在前一篇文章中在试图重新装入高速缓存文件时发现了这一问题。与大多数页眉文件及页脚文件不同,动态内容变化频繁,必须时刻更新。我们将首先扼要地重述一下 include 伪指令的局限性,然后我将向您演示如何用 jsp:include 标记来扩展 JSP 的包含能力。

高速缓存问题

JSP include 伪指令的不足之处有一个是:它会导致 Web 浏览器高速缓存所有页面。在处理诸如页脚、版权声明或一组静态链接之类的静态组件时,这是有意义的。这些文件不会改变,因此没有理由让 JSP 解释器不断地重新轮询其中的数据。凡是可能的地方,都应该实现高速缓存,因为它改善了应用程序的性能。

但是,有时侯,进行高速缓存会得不偿失。如果提入的内容来自使用动态数据(如 Weblog 或数据库驱动的 JSP 文件)的程序,甚至如果所包含的内容是经常变化的 HTML(如时间戳记),那么每当装入 Web 页面时,都需要显示这些文件或程序的最新版本。遗憾的是,JSP include 伪指令并不具备这一功能。在测试和开发周期(请参阅侧栏“ JSP 测试和开发”)中,在浏览器中禁用高速缓存通常能够解决这一问题。但是,对于实际使用的应用程序而言,性能是任何设计决策过程中的一项重要因素,禁用高速缓存并不是一种可行的长远之计。更好的解决方案是使用 jsp:include 标记。

jsp:include 标记

jsp:include 只不过是一个不同于 include 的伪指令而已。 jsp:include 的优点在于:它 总是会检查所含文件中的变化。过一会儿我们将研究这一新标记的工作方式。但首先看一下两种 include 各自的代码,以便能够看到二者之间的异同。

清单 2 显示了一个简单页面,它使用了原始的 JSP include 伪指令。

清单 2. JSP include 伪指令

<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>JSP include element test</title>
</head>
<body>
This content is statically in the main JSP file.<br />
<%@ include file="included.html" %>
</body>
</html>
]]>

清单 3 是同一个页面,只不过这里转成使用 jsp:include 标记。

清单 3. 转成使用 jsp:include

<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>JSP include element test</title>
</head>
<body>
This content is statically in the main JSP file.<br />
<jsp:include page="included.html" flush="true" />
</body>
</html>
]]>

您应该注意这两种代码类型之间的两大区别。首先, jsp:include 元素不使用属于 include 伪指令的 %@ 语法。实际上, jsp 前缀让 JSP 编译器知道:它应该寻找标准 JSP 标记集中的元素。其次,指定要包含的文件的属性从 file 变成了 page 。如果愿意,可以自己测试一下新标记的结果。只需更改上一篇文章(请参阅 参考资料)中 included.html 文件的内容,然后重新装入浏览器页面,就会立即看到新内容。

jsp:include 是如何工作的

如果您有点爱刨根问底,那么可能十分想知道 jsp:include 标记的行为为什么与 include 伪指令不同。道理其实十分简单: jsp:include 包含的是所包含 URI 的 响应,而不是 URI 本身。这意味着:对所指出的 URI 进行 解释,因而包含的是 生成的响应。如果页面是 HTML,那么将得到一点也没有变化的 HTML。但是,如果是 Perl 脚本、Java servlet 或者 CGI 程序,那么得到的将是从该程序解释而得的结果。虽然页面通常就是 HTML,但实际程序恰好是达到目的的手段。而且,由于每次请求页面的时候都会进行解释,因此从来不会象使用 include 伪指令时那样高速缓存结果。虽然这只是很小的变动,但它却导致了您所见到的行为中的全部差异。

一种混合搭配的解决方案

include 伪指令在某些网站上有其用武之地。例如,如果站点包含一些(如果有变化,也很少)几乎没有变化的页眉、页脚和导航文件,那么基本的 include 伪指令是这些组件的最佳选项。由于 include 伪指令采用了高速缓存,因此只需放入包含文件一次,其内容就会被高速缓存,其结果会是极大地提高了站点的性能。

然而,对于现在许多 Web 应用程序或站点而言,地毯式的高速缓存并不能解决问题。虽然页眉和页脚可能是静态的,但是不可能整个站点都是静态的。例如,从数据库提取导航链接是很常见的,并且许多基于 JSP 技术的站点还从其它站点或应用程序上的动态 JSP 页面提取内容。如果正在处理动态内容,那么需要采用 jsp:include 来处理该内容。

当然,最好的解决方案是经常把这两种方法混合搭配使用,将每种构造用到最恰当的地方。清单 4 是混合搭配包含解决方案的一个示例。

清单 4. 混合搭配解决方案

<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>newInstance.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>
<body>
<jsp:include page="header.jsp" flush="true">
<jsp:param name="pageTitle" value="newInstance.com"/>
<jsp:param name="pageSlogan" value=" " /></jsp:include>
<%@ include file="/navigation.jsp" %>
<jsp:include page="bookshelf.jsp" flush="true" />
<jsp:include page="/mt-blogs/index.jsp" flush="true" />
<%@ include file="/footer.jsp" %>
</body>
</html>
]]>

上面的代码显示了前面文章中的示例索引页面。导航链接和页脚是静态内容,一年最多更改一次。对于这些文件,我使用了 include 伪指令。内容窗格包含 Weblog 和“bookshelf”组件,它们是动态生成的。这两个组件需要一直更新,因此对它们,我使用了 jsp:include 标记。 header.jsp 文件有点奇怪。这个组件是从另一个本质上是静态的 JSP 页面提取的。但是,正如您将注意到的那样,它从包含页提取页“标语”,然后将它显示出来。要处理这一共享信息,我们必须向页眉文件传入参数。而要处理那些参数,就必须使用 jsp:include 元素。

希望本文所述对大家jsp程序设计有所帮助。

(0)

相关推荐

  • JSP编译指令page、include详解

    1. JSP指令 分类:1).page  2).include  3).taglib 语法:  <%@ 指令名称  属性1="值1" .....%> 2. Page编译指令: • 作用:利用Page编译指令可以设置JSP的页面属性.通常位于JSP页面的顶端,对同一个页面可以有多个page指令.• page指令语法格式: 复制代码 代码如下: <%@page [language="Java"]    //声明JSP页面使用语言的种类 [extends

  • JSP常见的三个编译指令page、include、taglib

    JSP常见的三个编译指令 1.page指令 是针对当前页面的指令 2.include指令 用于指定包含另一个页面 3.taglib指令 用于定义和访问自定义标签

  • JSP指令元素(page指令/include指令/taglib指令)复习整理

    今天复习了JSP指令元素部分,整理了下,跟大家一起分享: 一.page指令:设定JSP页面的全局属性,该配置作用于整个JSP页面,设置包括静态包含的文件. <%@ page 属性1="属性值1" 属性2="属性值2" %> 1.language属性:申明所使用的脚本语言种类,目前只有java一种,不排斥以后有其他语言的加入. <%@ page language="java" %> 2.extends属性:指定该JSP页面生

  • jsp中include指令静态导入和动态导入的区别详解

    1.什么是静态导入? 静态导入指的是,将一个外部文件嵌入到当前JSP文件中,同时解析这个页面的JSP语句,它会把目标页面的其他编译指令也包含进来.include的静态导入指令使用语法: 复制代码 代码如下: <%@include file="relativeURLSpec"%> 静态导入使用范例include1.jsp: 复制代码 代码如下: <%@ page contentType="text/html; charset=utf-8" langu

  • JSP中include指令和include行为的区别

    < %@ include file=" "%> < jsp:include page=" " flush="true"/> 前者是指令元素.后者是行为元素.具体它们将在何处用?如何用及它们有什么区别?这应该是很多人看到它都会想到的问题.下面一起来看看吧. 通常当应用程序中所有的页面的某些部分(例如标题.页脚和导航栏)都相同的时候,我们就可以考虑用include.具体在哪些时候用< %@ include file=&q

  • JSP中动态include与静态include的区别介绍

    动态INCLUDE 用法:<jsp:include page="included.jsp" flush="true" /> 说明:它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数,先编译之后再进行处理. 原因:1.静态include的结果是把其他jsp引入当前jsp,两者合为一体. 2.静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设

  • jsp include文件时的一个乱码解决方法

    一般我是用<%@ include %>方式来包含这个文件,主要是这样能够被包含页面会跟包含页面在编译时被编译成一个文件,里面的变量可以相互通用,而<jsp:include>方式则会分别编译,变量不能相互使用. 而在tomcat4.x版本中,只要在包含页面中定义了<%@ page contentType="text/html; charset=gbk" %>,被包含页面中就不能也不用再次声明就会显示正常的中文,否则会出现 Page directive:

  • JSP中的include有几种形式?都有什么区别?

    JSP中的include有哪些?有什么区别? 1.JSP中的include有哪些 (1)<%@include file="" %> (2)<jsp:include page="" flush="true"/> 2.两者区别 (1)前者是指示元素,后者是行为元素 (2)前者合成一个页面,后者合成一个文件后被JSP容器转化成Servlet

  • jsp include引用非本级目录网页实现代码

    采用相对路径 假设当前目录名为a, 目标文件夹为b (1)如果b是a的上级目录, 复制代码 代码如下: <%@ include file="../xxx.jsp"%> (2)如果b是a的下级目录, 复制代码 代码如下: <%@ include file="b/xxx.jsp"%>

  • 基于jsp:included的使用与jsp:param乱码的解决方法

    如果jsp:include 中的page页面存在乱码,则需要在使用<jsp:include page=""> 的页面中的<body>后加上<%    request.setCharacterEncoding('UTF-8") ;//或者指定的编码(GBK或其他)%>如下面所示: 复制代码 代码如下: jsp-include.jsp<%@ page language="java" contentType="

  • JSP下动态INCLUDE与静态INCLUDE的区别分析

    动态INCLUDE     用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数. 静态INCLUDE    用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %> ================

随机推荐