首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

JSP 最佳实践 时间戳的强大功能

JSP 最佳实践 时间戳的强大功能

时间戳一般用于简单的 Web 站点上,比如个人站点或内容驱动的站点,让用户可以看出页面最后一次更新的时间。因此,很容易忽略站点中一些实质内容,尤其对于电子商务站点更是如此。在本文中,我将向您介绍如何向 JSP 页面中添加时间戳,并能为用户带来更舒适的体验,另外还将介绍如何个性化您的站点。
添加时间戳                        在 JSP 页面中与在其他页面中放置最后修改日期或时间戳没有什么区别。java.io.File类专为这一目的提供了 lastModified        方法。惟一的技巧部分在于获得部署在 Web 容器中的 JSP 页面的 File句柄。显示了一小段代码 ( 当放置在 JSP 页面中时是一个 scriptlet),这段代码向你展示了这个技巧。
注意,application和 request是每个 JSP 页面都可以访问的内建变量。application        表示为该 JSP 页面实现 javax.servlet.ServletContext对象的类的实例。而这个对象可以获得 JSP 页面的 servlet 路径,该路径将变成 JSP 页面的物理路径。         然后,该路径可以变成一个 File。
清单 1. 获得 JSP 的文件句柄
1
2
String jspPath = application.getRealPath(request.getServletPath());
java.io.File jspFile = new java.io.File(jspPath);




要获得所有这些信息并输出时间戳,可以使用类似于清单 2 中的代码片断:
清单 2. 输出时间戳
1
2
3
4
5
<%
    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 页面中包含时间戳
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 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>
          &copy; 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. 格式化时间戳
1
2
3
4
5
6
7
8
9
10
<%
    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 文件 ),并且一旦解压缩完毕,您的时间戳就会正常工作了。
返回列表