级别: 初级 Brett McLaughlin (brett@oreilly.com), 作者, O'Reilly and Associates
2003 年 8 月 19 日 表面上,JSTL的
c:import 在模仿JSP的include原理。但是,如果深入研究
c:import (或任何JSTL标记),您将发现许多其它功能。除了分配参数并管理本地文件内容以外,
c:import 还可以引入外部站点的内容。本期
JSP最佳实践中,经验丰富的Web开发员Brett McLaughlin将向您演示如何引入外部站点的内容。
上一期
JSP最佳实践简要了介绍JSTL,我已经演示如何在Web容器上装入JSTL以及如何转换JSP文件以便采用JSTL标记,并且还简单介绍了
c:import 标记。类似于
jsp:include ,
c:import 使用各种参数以便可在Web站点灵活移动内容。但与include指令不同,
c:import 并不限制访问本地文件。
我这次将向您演示如何将
jsp:params 转化为
c:params ,以便可以使用import标记来传递参数,并正如使用include标记一样来管理本地内容。除了这些基本功能之外,您还将学习如何使用
c:import 来引入其它Web站点的内容。在您的站点得到文件后,将很容易使其符合自己站点的外观和风格,并可轻松导入以及时增强您的站点。
 |
感到有些迷惑吗?
如果您没有从头参与
JSP最佳实践系列,那么这里的有些讨论可能会难于理解。这些最佳实践大部分都相互关联,而且大部分实例都从第一期逐渐演变到这一期。请访问
JSP最佳实践系列清单,您将很快跟上本教程。
|
|
JSTL转换粘结剂(redux)
在上一期的最后 "
借助JSTL来更新JSP页面",我们正好转换了Web站点主页,并采用
c:import 而不是
jsp:include 来标记。不过,我已避免更改包括代码的头文件,因为它包含传递请求数据的各种参数。清单1简要地显示我们剩下的JSP页:
清单 1. 经常转换索引页(请注意jsp:include元素)
<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<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" %>
<c:import url="bookshelf.jsp" />
<c:import url="/mt-blogs/index.jsp" />
<%@ include file="/footer.jsp" %>
</body>
</html>
|
转换参数标记
由于已经转换了使用
c:import 而不是
jsp:include 标记的几乎整个索引文件,因此,我们最后的工作就是转变仍然传递
jsp:include 元素的参数,即采用
c:import 标记来模仿
jsp:include 的特性。如清单2所示,我们需要将
jsp:param 转换为
c:param ;因为
c:param 函数类似于JSP的相应功能,因而我们可以轻松处理。
清单2表明,清单1的索引文件已完全转换为JSTL:
清单 2. 完整的JSTL转换
<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<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>
<c:import url="header.jsp">
<c:param name="pageTitle" value="newInstance.com"/>
<c:param name="pageSlogan" value=" " />
</c:import>
<%@ include file="/navigation.jsp" %>
<c:import url="bookshelf.jsp" />
<c:import url="/mt-blogs/index.jsp" />
<%@ include file="/footer.jsp" %>
</body>jsp:include
</html>
|
如果您希望更详细了解JSP页中的参数传递,请检查该系列第三期"
组合 JavaBean 组件和 JSP 技术"。不过您一定要记着,
c:param 和
jsp:param 非常相似。现在,让我们进一步研究
c:import 的更多新功能。
导入外部内容
使用
c:import 的真正优势在于,它可以引入外部Web站点的内容或Web应用程序。在前面学习jsp:includes时,您可能已经注意到,我们使用file(文件)属性来为include指定静态内容。file(文件)属性正如其名称所示:使您可以引入本地文件的内容。
c:import 的相应属性为
url ,它也正如其名称所示:使您能够引入任何URL。
c:import 不仅可以使用本地文件的内容来填充您的站点网页,而且还允许您引入任何URL的内容,使其它站点的内容可以真正灵活地适应您自己站点的外观和风格。
让我们举一个实例。我把马达加斯加岛红木吉他的一些美丽图片放到我的Web站点。当我制作自己的网页并完成一些图像文件和相关链接之后,我可以轻松地引入另一个站点的内容,然后使其适合自己站点的外观和风格。清单3表明,使用
c:import 的
url 属性,可以多么容易地引入我所相中的吉他站点的图像文件:
清单 3. 导入外部内容
<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<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>
<c:import url="header.jsp">
<c:param name="pageTitle"
value="newInstance.com :: True North Guitars"/>
<c:param name="pageSlogan" value="...building it from scratch" />
</c:import>
<%@ include file="/navigation.jsp" %>
<c:import url="bookshelf.jsp" />
<c:import
url="http://www.truenorthguitars.com/Clients/Richman/index.htm" />
<%@ include file="/footer.jsp" %>
</body>
</html>
|
这些代码看上去没有问题——但是,如果您试着在自己站点运行,您很快就会发现问题。所有图像都不显示,并且相关链接全部出现故障。当然,如果仔细想想,原因很很简单。因为外部资源(本例中是图像文件)被解释(interpreted),而您将解释结果直接导入您的输出流。外部图像文件链接如
/images/guitar-01-24.jpg 将显示不存在。解决该问题的唯一方法是将原图像复制到您的站点,与简单的导入相比,这是一项完全不同(并且消耗更多时间)的技术。
因此,最好知道要导入的外部内容是否是纯文本。例如,要考虑连接到系统管理员的站点及其本身的头文件、脚注文件、外观和风格。该站点的网页详细说明如何设置
README 文件,以便用户可以查看如何使用该站点。您可以参考以下现有FTP站点的说明:
<c:import url="ftp://ftp.oreilly.com/pub/README.ftp" />
|
请注意,这非常简单,就如同引入HTTP材料一样导入FTP服务器内容。您可以使用同样的HTTPS命令以及您的站点和目标站点可以识读的任何其它协议。
为什么要采用JSTL?
在核心JSP标记上使用JSTL有以下几大优势。首先,JSTL现在采用独立于JSP标记的规范来定义。因此,即使JSP规范发生改动,也可以保证JSTL标记的一致性。容易受到JSP容器变更影响的许多应用程序都将受益于JSTL规范.其次,JSTL具有比核心JSP标记更强大的功能,正如您在最佳实践系列中所视,
c:import不仅 可以导入其它站点的URL,而且,它还可以导入
jsp:include 标记不可用的更为复杂的内容。最后,JSTL使用自己的表达式语言(通常简称为EL)。JSTL EL可以相当灵活地写入JSP代码,是对核心JSP语言的有力补充。
虽然我们在此学习了一个JSTL标记,但是很明显,您需要了解很多相关知识。如果您对更多的JSTL知识感兴趣,请详细参阅
参考资料。当您正在阅读参考资料时,我也正在准备下一期课程――将时戳(time stamps)添加到您的JSP页面。到时,我将在网上与您再见!
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 想从头学习JSP技术吗?请参阅Brett McLaughlin
上一期JSP最佳实践系列。
- 您可能还想要研究如何使用符合JSP的IDE。您可以有以下几种选择:
- Noel Bergman撰写的"
JSP 标记库:着意设计的更好的可用性" (
developerWorks,2001年12月) 介绍支持JSTL创建的定制标记库工具。
- Mark Kolb撰写的"
JSTL primer" (
developerWorks, 2003年2月-5月)完整介绍JSP标准标记库(JSP Standard Tag Library,JSTL)。
- 欲大致了解JSP技术,请参阅Noel Bergman撰写的指南"
JavaServer网页技术介绍"(
developerWorks, 2001年8月)。
- 有关JSP 技术的基本详细信息,最好的办法是参阅
JSP 规范.
- Hans Bergsten的
JavaServer Pages
(O'Reilly & Associates, 2002)是学习 JSP 技术不可缺少的参考资料。
- 请参阅
developerWorksJava 技术教程页面
,从 developerWorks 获取免费 Java 技术教程的完整列表。
- 在
developerWorksjava 技术专区
可以找到数百篇有关 Java 编程各个方面的文章(包括有关 JSP 技术的更多文章)。
关于作者  | 
|  | Brett McLaughlin自从流行 Logo 语言时就一直从事计算机行业(记得小三角形吗?)。目前,他专门从事使用 Java 以及与 Java 相关的技术来构建应用程序基础结构的工作。最近几年,他在 Nextel Communications 和 Allegiance Telecom Inc. 从事这些基础结构的实现。Brett 是 Java Apache 项目 Turbine 的共同创始人之一,该项目通过使用 Java servlet 为 Web 应用程序开发构建可重复使用的组件体系结构。他还是 EJBoss 项目(一种开放源码 EJB 应用程序服务器)和 Cocoon(一种开放源码 XML Web 发布引擎)的志愿开发者之一。Brett联系方式
brett@oreilly.com。
|
对本文的评价
|