搞定J2EE核心技术与企业应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.4 JSP技术应用

上面简要介绍了JSP的用法及其内置对象,下面通过两个常用技术来详细地讲解JSP的使用方法。

6.4.1 使用JSP操作Cookie

在C盘Documents and Settings文件夹下每个用户的Cookies目录下,都会有许多Cookie,其用途是在每个独立的页面之间记录和标识不同的用户。它的实现原理是:当用户访问网页时,在访问者的机器上创建一个文件叫做Cookie,写一段内容进去来标识不同的用户,如果下次用户再访问这个网页时,从上次写入的Cookie中读出上次写入的内容,这样网页就知道上次这个用户已经访问过该网页了。

其实写入Cookie的操作非常简单,示例代码如下:

      <%
      String cookieName="gf";
      Cookie cookie=new Cookie(cookieName, "gf的网页");
      cookie.setMaxAge(365*24*60*60);
      response.addCookie(cookie);
      %>

代码说明:

● Cookie cookie=new Cookie(cookieName, "Test_Content");这一行建立了一个Cookie对象,有两个初始化参数,第一个参数cookieName定义了Cookie的名字,第二个参数是一个字符串,定义了要在Cookie中写入的内容。

● cookie.setMaxAge(365*24*60*60)调用了Cookie中的setMaxAge方法,设定Cookie在用户机器硬盘上的存活期为365*24*60*60秒,即让Cookie文件在一年内有效。一个Cookie在用户的硬盘中存在的时间并不是无限期的,在建立Cookie对象时,必须指定Cookie的存活期,超过了这个存活期,Cookie文件就不再起作用,会被用户的浏览器自行删除。

将Cookie写入到用户的本地硬盘后,如何在用户下次访问时读出Cookie的内容呢?示例代码如下:

      <%
      Cookie cookies[]=request.getCookies();
      Cookie gfCookie=null;
      String value=null;
      String name=null;
      for(int i=0;i < cookies .length;i++) {
      gfCookie=cookies[i];
      value=gfCookie.getValue();
      name=gfCookie.getName();
      %>

代码说明:

● Cookie cookies[]=request.getCookies(),其中,request.getCookies()读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组中。

● 通过getName()和getValue()两个方法即可取得这个Cookie的名字和内容。

6.4.2 利用缓存技术提高JSP性能

笔者以前负责过一个企业的内网,各地子公司的访问量加起来一天有几万次,并发访问量有700多次,如果用户在查看内网的新闻或公告时,每一条新闻都需要从数据库中查询出来再生成JSP页面,服务器或数据库的压力将是非常巨大的。

OSCache标记库由OpenSymphony设计,它是一个开源的框架,提供了在现有的JSP页面内实现快速内存缓存的功能。它不仅能够为所有用户缓存现有的JSP代码块,而且能够以用户为单位进行缓存。OSCache还具有一些能提高可伸缩性的高级特性,比如缓存到磁盘、可编程的缓存刷新、异常控制等。

OSCache的具体使用方法如下:

01 把标记库声明加入到页面:

      <%@ taglib uri="cachetags" prefix="cache" %>

02 用cache标记来包围整个页面:

      <cache:cache> ... 要缓存的内容 ... </cache:cache>

在设定缓存内容时,可以设定需要缓存的时间,cache标记的默认缓存时间是1小时。如果需要设定为其他的数值,则需要如下设定:

      <cache:cache time="7200">

这代表缓存时间是2小时。

注意:缓存时间的设定是以秒为单位的。

在设定缓存时,开发人员还可以指定这个缓存区的使用对象,示例代码如下:

      <cache:cache key="gf" scope="session" time="7200">

这代表这个缓存区是针对当前用户的,而不是针对所有的用户。设定缓存区的key属性,表示这个缓存区还可以被其他的JSP页面所引用。

虽然缓存能够帮助极大地提升服务器的性能,但如果缓存的数据不能及时更新,则可能会影响具体的业务规则。OSCache提供的flush标记能够刷新缓存内容,示例代码如下:

      <cache:flush key="gf" scope="session" />

当用户处理某个动作执行上述代码时,缓存的内容将被刷新。