一个JSP 页面(oa.wanda.cn main.jspp) ...

2013年10月 Java大版内专家分月排行榜第二2013年3月 Java大版内专家分月排行榜第二2013年2月 Java大版内专家分月排行榜第二
2013年7月 Java大版内专家分月排行榜第三2013年5月 Java大版内专家分月排行榜第三2013年4月 Java大版内专家分月排行榜第三
2013年5月 挨踢职涯大版内专家分月排行榜第二
2013年9月 Java大版内专家分月排行榜第三
2016年1月 Java大版内专家分月排行榜第二2015年12月 Java大版内专家分月排行榜第二2015年8月 Java大版内专家分月排行榜第二2015年3月 Java大版内专家分月排行榜第二2015年1月 Java大版内专家分月排行榜第二2014年12月 Java大版内专家分月排行榜第二2014年11月 Java大版内专家分月排行榜第二2014年6月 Java大版内专家分月排行榜第二2014年4月 Java大版内专家分月排行榜第二2014年1月 Java大版内专家分月排行榜第二2013年11月 Java大版内专家分月排行榜第二
2015年9月 Java大版内专家分月排行榜第三2015年6月 Java大版内专家分月排行榜第三2015年5月 Java大版内专家分月排行榜第三2015年2月 Java大版内专家分月排行榜第三2014年3月 Java大版内专家分月排行榜第三2013年12月 Java大版内专家分月排行榜第三
2012年3月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。developerWorks 社区
本文是 Java Brett McLaughlin 继第一篇 JSP 最佳实践文章后的后续文章,在文中,作者向您演示了如何扩展 JSP 技术中用于动态内容的包含功能。了解静态 include 伪指令和动态 jsp:include 元素之间的差异,搞清楚如何混合搭配这二者以获取最优性能。
(), 作家, O'Reilly and Associates
Brett McLaughlin 从 Logo 时代(还记得那个小三角吗?)就开始从事计算机工作了。他现在专门研究用 Java 和 Java 相关技术构建应用程序基础结构。过去几年,他一直在 Nextel Communications 和 Allegiance Telecom, Inc. 致力于实现这些基础结构。Brett 是 Java Apache 项目 Turbine 的共同创始人之一,该项目用 Java servlet 为 Web 应用程序开发构建可重用的组件体系结构。他还是 EJBoss 项目(一个开放源码的 EJB 应用程序服务器)和 Cocoon(一个开放源码的 XML Web 发布引擎)的志愿开发人员之一。可通过
与 Brett 联系。
JSP 最佳实践系列的前一篇文章中,您了解了如何使用 JSP
include 伪指令将诸如页眉、页脚和导航组件之类的静态内容包含到 Web 页面中。和服务器端包含一样,JSP
include 伪指令允许某个页面从另一个页面提取内容或数据。清单 1 重温了
include 伪指令。
清单 1. JSP include 伪指令&![CDATA[
&%@ page language="java" contentType="text/html" %&
&title&&/title&
&meta http-equiv="Content-Type"
content="text/ charset=iso-8859-1" /&
&link href="/styles/default.css"
rel="stylesheet" type="text/css" /&
&%@ include file="header.jsp" %&
&%@ include file="navigation.jsp" %&
&%@ include file="bookshelf.jsp" %&
&%@ include file="/mt-blogs/index.jsp" %&
&%@ include file="footer.jsp" %&
include 非常适于将静态内容并入 Web 页面,但对于动态内容却不尽如人意。我们在前一篇文章中在试图重新装入高速缓存文件时发现了这一问题。与大多数页眉文件及页脚文件不同,动态内容变化频繁,必须时刻更新。我们将首先扼要地重述一下
include 伪指令的局限性,然后我将向您演示如何用
jsp:include 标记来扩展 JSP 的包含能力。
高速缓存问题
include 伪指令的不足之处有一个是:它会导致 Web 浏览器高速缓存所有页面。在处理诸如页脚、版权声明或一组静态链接之类的静态组件时,这是有意义的。这些文件不会改变,因此没有理由让 JSP 解释器不断地重新轮询其中的数据。凡是可能的地方,都应该实现高速缓存,因为它改善了应用程序的性能。
但是,有时侯,进行高速缓存会得不偿失。如果提入的内容来自使用动态数据(如 Weblog 或数据库驱动的 JSP 文件)的程序,甚至如果所包含的内容是经常变化的 HTML(如时间戳记),那么每当装入 Web 页面时,都需要显示这些文件或程序的最新版本。遗憾的是,JSP
include 伪指令并不具备这一功能。在测试和开发周期(请参阅侧栏“
”)中,在浏览器中禁用高速缓存通常能够解决这一问题。但是,对于实际使用的应用程序而言,性能是任何设计决策过程中的一项重要因素,禁用高速缓存并不是一种可行的长远之计。更好的解决方案是使用
jsp:include 标记。
jsp:include 标记jsp:include 只不过是一个不同于
include 的伪指令而已。
jsp:include 的优点在于:它
总是会检查所含文件中的变化。过一会儿我们将研究这一新标记的工作方式。但首先看一下两种
include 各自的代码,以便能够看到二者之间的异同。
清单 2 显示了一个简单页面,它使用了原始的 JSP
include 伪指令。
清单 2. JSP include 伪指令&![CDATA[
&%@ page language="java" contentType="text/html" %&
&title&JSP include element test&/title&
This content is statically in the main JSP file.&br /&
&%@ include file="included.html" %&
]]&清单 3 是同一个页面,只不过这里转成使用
jsp:include 标记。
清单 3. 转成使用 jsp:include&![CDATA[
&%@ page language="java" contentType="text/html" %&
&title&JSP include element test&/title&
This content is statically in the main JSP file.&br /&
&jsp:include page="included.html" flush="true" /&
]]&您应该注意这两种代码类型之间的两大区别。首先,
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" %&
&title&&/title&
&meta http-equiv="Content-Type" content="text/ charset=iso-8859-1" /&
&link href="/styles/default.css" rel="stylesheet" type="text/css" /&
&jsp:include page="header.jsp" flush="true"&
&jsp:param name="pageTitle" value=""/&
&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" %&
]]&上面的代码显示了前一篇文章中的示例索引页面。导航链接和页脚是静态内容,一年最多更改一次。对于这些文件,我使用了
include 伪指令。内容窗格包含 Weblog 和“bookshelf”组件,它们是动态生成的。这两个组件需要一直更新,因此对它们,我使用了
jsp:include 标记。
header.jsp 文件有点奇怪。这个组件是从另一个本质上是静态的 JSP 页面提取的。但是,正如您将注意到的那样,它从包含页提取页“标语”,然后将它显示出来。要处理这一共享信息,我们必须向页眉文件传入参数。而要处理那些参数,就必须使用
jsp:include 元素。
如果您想了解有关那些参数的内容,请放心,后续文章不久就将能满足您的需要。在下一篇文章中,我将解释 JSP 参数以及它们是如何与 JavaBeans 组件交互的。届时,我们网上见。
参考资料 为了实践本系列文章中的练习,您需要与 JSP 兼容的 Web 容器,如
您可能也想研究一下使用符合 JSP 的 IDE。下面有几个 IDE 可供选择:
在本系列中的
中了解更多关于
include 伪指令的内容。请参阅
我们在这里只简单地讨论了 JSP 在开发和测试中的使用,但是“
developerWorks,2001 年 8 月)这篇文章中就这一主题进行了十分全面的讨论。
要获得对 JSP 技术的指导性简介,请试着学习 Noel Bergman 的教程“
developerWorks,2001 年 8 月)。
要了解 JSP 技术的实质,最好的办法是阅读
Hans Bergsten 的
(O'Reilly & Associates,2002 年)是学习 JSP 必不可少的参考资料。
”虽略显过时(
developerWorks,2001 年 6 月),但仍不失为一份对一些值得一读的 JSP 书籍所做的优秀书评。
如果您喜欢
JSP 最佳实践,那么您可能也想查阅
JSP 技术是基于 Java Servlet 技术。阅读 Jason Hunter 的
(O'Reilly & Associates,2002 年)以了解更多关于 Servlet 的知识。
,其中完整罗列了 developerWorks 上免费的 Java 技术教程。
中找到关于 Java 编程各个方面的数百篇文章(包括更多关于 JSP 技术方面的文章)。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technology, Web developmentArticleID=162847ArticleTitle=JSP 最佳实践: 用 jsp:include 控制动态内容publish-date=多种方法实现当jsp页面完全加载完成后执行一个js函数
字体:[ ] 类型:转载 时间:
实现jsp页面完全加载完成后执行一个js函数的方法有很多,在本文就简单为大家介绍下常用的几种,感兴趣的朋友不要错过
方法1:如下程序,当页面完全加载后执行openTheIndexPage()方法
代码如下: &html& &head& &meta http-equiv="Content-Type" content="text/ charset=gb2312" /& &title&Telecommunications Data Collection System&/title& &script type="text/javascript" src="&%=contextPath%&/js/baseframe.js"&&/script& &script type="text/javascript" src="&%=contextPath%&/js/cookies.js"&&/script& &script type="text/javascript" src="&%=contextPath%&/js/tag/tag.js"&&/script& &script language="javascript" for="window" event="onload"& function openTheIndexPage() { openMyURIWithCid(true, 'root', 'IDX', "iframe/dispatch.jsp?url=tdc/zhk/impctrlobjinf/index/index.jsp", '首页', 'top.tagmenu', 'top.maintop', true, 'system/accessPaths.do?currentModuleCode=IDX', 'mainmenu', true); }; if(document.readyState=="complete"){ openTheIndexPage(); } &/script& &/head& &body& &/body& &/html&
方法2:可以是以下几种,但是效果不如方法1.
代码如下: &body onload="function name()"& &/body & &script&window.onload=function name &/script& &script language="javascript" for="window" event="onload"&function name(); &/script&
第二种只能写入一个函数,而且无法给变量,其中最好用的是最后一种,可以独立写出来,怎么写都行。 方法3:&body onload="xxx()"& &/body& xxx()为你要执行的函数 方法4:在script标记里加defer 即 &script defer="defer" language="javascript"& 或者 &script defer language="javascript"& 在整个页面加载完后运行脚本。(没有效果)
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

参考资料

 

随机推荐