JSP最佳实践的最后一部分是对JSTL的速成课程介绍。 我向您展示了如何在Web容器上加载JSTL以及如何转换JSP文件以使用JSTL标记。 在讨论过程中,我简要介绍了c:import
标记。 像jsp:include
一样, c:import
使用参数在您的网站上智能地移动内容。 但是与include指令不同的是, c:import
并不将其范围限制为本地文件。
这次,我将向您展示如何将jsp:params
转换为c:params
,以便您可以像使用include标记一样使用import标记传递参数并操纵本地内容。 在此基本功能之上,您还将学习如何使用c:import
从其他网站提取内容。 在您的网站上找到文件后,将其包装在网站的外观中就很容易了,这使导入成为一种快速构建网站的简便方法。
JSTL转换redux
在上一期文章的最后,我们刚刚将网站主页转换为使用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
标记模拟其行为。 如清单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>
</html>
只需记住c:param
和jsp:param
工作原理几乎相同,就可以了。 现在,让我们深入研究c:import
的更多创造性用法。
导入外部内容
使用c:import
的真正优势之一是它能够从外部网站或Web应用程序中提取内容。 回到学习jsp:include
,您可能已经注意到我们使用file
属性来指定要包含的静态内容。 file
属性的作用恰如其名所暗示的那样:它允许您提取本地文件的内容。 c:import
的相应属性是url
,它的名称也暗示了这一点:它允许您提取任何URL。 使用c:import
可以使用本地文件中的内容填充站点页面,还可以从任何URL提取内容,这实际上是一种以您自己的外观包装其他站点中的内容的好方法。
让我们考虑一个简单的例子。 假设我要在我的网站上放置一些华丽的马达加斯加玫瑰木吉他的图片。 虽然我可以构建自己的页面,其中包含图像文件和相对链接,但似乎可以轻松地简单地从另一个站点导入内容,然后将其包装在我的站点的外观中。 清单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>
该代码看起来足够好-但是如果您自己尝试一下,很快就会发现问题。 没有图像显示,并且所有相关链接均失败。 当然,如果您考虑一下,其原因就很清楚了。 因为解释了外部资源(在这种情况下为图像文件),所以您可以将解释的结果直接插入输出流中。 外部图像链接(例如/images/guitar-01-24.jpg
将显示为丢失。 解决此问题的唯一方法是将映像复制到您的站点,与简单的导入相比,这是一种完全不同(且耗时更多)的技术。
因此,仅当内容完全基于文本时,才导入外部内容才有意义。 例如,考虑一个面向系统管理员的站点,该站点具有自己的页眉,页脚和外观。 该站点的一页详细说明了如何设置初始README
文件供用户查看应如何使用该站点。 您可以参考以下现有FTP站点的说明:
<c:import url="ftp://ftp.oreilly.com/pub/README.ftp" />
请注意,导入FTP服务器内容和提取HTTP资料一样简单。 您可以对HTTPS使用相同的命令,以及您的站点和目标站点都能理解和使用的其他协议。
为什么要使用JSTL?
在核心JSP标记上使用JSTL具有许多重大优点。 首先,现在在与JSP标记不同的规范中定义JSTL。 这样可以确保即使JSP规范发生变化,您的JSTL标签也将保持一致。 不受JSP容器更改影响的应用程序将从JSTL规范中受益。 其次,JSTL标签提供的功能远远超出了核心JSP标签的能力。 如您在最佳实践中所见, c:import
可以从其他站点导入URL,以及jsp:include
标记不可用的更复杂的内容。 最后,JSTL提供了自己的表达语言(通常缩写为EL)。 JSTL EL在编写JSP代码方面提供了相当大的灵活性,并且是核心JSP语言的重要补充。
虽然我们在这里只了解了一个JSTL标签,但是显然您应该了解更多。 如果您有兴趣学习更多JSTL,请参阅参考资料了解详细信息。 当您这样做时,我将在下一部分中进行工作,该部分涉及在JSP页面中添加时间戳。 在那之前,我会在网上见!
翻译自: https://www.ibm.com/developerworks/java/library/j-jsp06173/index.html