级别: 初级 Brett McLaughlin (brett@newInstance.com), 作家兼编辑, O'Reilly Media Inc.
2003 年 7 月 25 日 Brett McLaughlin继续他的 JSP 最佳实践 系列。下面我们来看看向 JSP 页面中添加时间戳的各种技术,以及通过这一简单的修改来增强 Web 站点可用性的各种方式。
时间戳一般用于简单的Web站点上,比如个人站点或内容驱动的站点,让用户可以看出页面最后一次更新的时间。因此,很容易忽略站点中一些实质内容,尤其对于电子商务站点更是如此。在本文中,我将向您介绍如何向JSP页面中添加时间戳,并能为用户带来更舒适的体验,另外还将介绍如何个性化您的站点。
添加时间戳
在JSP页面中与在其他页面中放置最后修改日期或时间戳没有什么区别。java.io.File 类专为这一目的提供了lastModified
方法。惟一的技巧部分在于获得部署在Web容器中的JSP页面的File 句柄。清单
1 显示了一小段代码 (当放置在JSP页面中时是一个 scriptlet),这段代码向你展示了这个技巧。
注意,application 和 request 是每个JSP页面都可以访问的内建变量。application
表示为该JSP页面实现javax.servlet.ServletContext对象的类的实例。而这个对象可以获得JSP页面的servlet路径,该路径将变成JSP页面的物理路径。
然后,该路径可以变成一个File。
清单 1. 获得JSP的文件句柄
String jspPath = application.getRealPath(request.getServletPath());
java.io.File jspFile = new java.io.File(jspPath);
|
要获得所有这些信息并输出时间戳,可以使用类似于清单2中的代码片断:
清单 2. 输出时间戳
<%
String jspPath = application.getRealPath(request.getServletPath());
java.io.File jspFile = new java.io.File(jspPath);
out.println(new java.util.Date(jspFile.lastModified()));
%>
|
文件的最后修改日期确定后,就变成一个 Date对象,该对象将被直接输出到屏幕。
可重用时间戳
当然,为每个想要添加时间戳的页面添加以上这样一段代码是一件痛苦的事情(并且也是多余的)。更好的方法是创建一个显示日期和时间戳的通用JSP页面,然后在想要添加时间戳的位置包含该JSP页面。出于这一目的,只需将清单2保存为timestamp.jsp,然后使用jsp:include
机制在任何需要的地方输出时间戳。清单 3 显示了一个简单的包含JSP时间戳的页脚页面:
清单 3. 在其他JSP页面中包含时间戳
<!-- Begin footer section -->
<tr>
<td width="91" align="left" valign="top" bgcolor="#330066"> </td>
<td align="left" valign="top"> </td>
<td class="footer" align="left" valign="top">
<div align="center"><br>
© 2003 <a href="mailto:webmaster@newInstance.com">Brett
McLaughlin</a><br>
Last Modified: <jsp:include page="timestamp.jsp" flush="true" />
</div></td>
<td align="left" valign="top"> </td>
<td width="141" align="right" valign="top" bgcolor="#330066"> </td>
</tr>
</table>
<!-- End footer section -->
|
您可能已经注意到,清单3中包含的文件表示父JSP页面 (在本例中是footer.jsp),而不是被包含的时间戳文件。所以最后修改日期和时间戳是来自footer.jsp,而不是来自timestamp.jsp。这是很重要的,因为时间戳文件实际上是一个静态文件,它是不会改变的。因此,最后修改查询应该定位到一个经常更新的页面,比如footer.jsp。
为了更进一步阐明问题,我们来考虑一个由各种内容页面组成的站点。每个内容页面都包含一个footer.jsp页面,而footer.jsp页面又包含timestamp.jsp。如果最后修改日期查询最顶层的页面(在本例中是内容页面),那么只有在内容被修改时,时间戳才会改变,
而这正是所期望的效果。
格式化时间戳
默认的日期和时间戳输出是没有吸引力的,例如:Fri Mar 28 10:30:10 CST 2003。幸运的是,您可以使用java.text.SimpleDateFormat
类来更好地控制输出地格式。清单4显示了带有附加的java.text.SimpleDateFormat的timestamp.jsp。
清单 4. 格式化时间戳
<%
String jspPath =
application.getRealPath(request.getServletPath());
java.io.File jspFile = new java.io.File(jspPath);
java.util.Date lastModified =
new java.util.Date(jspFile.lastModified());
java.text.SimpleDateFormat fmt =
new java.text.SimpleDateFormat("MMM dd, yyyy, K:mm a (zz)");
out.println(fmt.format(lastModified));
%>
|
产生的输出是 Mar 28, 2003, 10:30 AM (CST),对于用户来说,这是一个更好看的日期和时间戳。参考Javadoc中的java.text
包,以了解格式化的其他选项。
使用WAR
当您在WAR(Web 归档文件)文件中将JSP页面部署为Web应用的一部分时,您将会碰到一处小小的局限性,幸运的是,该局限性的解决方法相当简单。Servlet容器部署WAR文件的方式通常是,首先将这些文件展开到一个临时目录中,然后从这个临时目录提供内容。问题是,在这种情况下,您将无法获得与JSP页面相关的File对象。相反,你将只能创建临时文件的句柄,每次Web容器重新启动时,句柄都会重新创建。如果不加处理,最后修改的日期页将在每次重启时改变。
解决方法是在将要部署该WAR文件的服务器上手动解压缩WAR 文件。这种手动解压缩带来的不方便是比较微不足道的(尤其是因为您可以使用zip工具来解压缩WAR文件),并且一旦解压缩完毕,您的时间戳就会正常工作了。
结束语
除了向用户确保站点内容新鲜而及时之外,添加时间和日期戳是个性化Web站点的第一步。当您向Web页面(或者JSP页面)添加了时间戳之后,可以很容易地编写出一个脚本程序,在选定页面被更新时向用户发送电子邮件。
在下一期中,我们将继续学习时间戳,并介绍自定义标记库的使用。到那时,我将极力主张您尝试在这里学到的技术,并且我将在线看到您。
参考资料
关于作者
对本文的评价
|