
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" />
当用户处理某个动作执行上述代码时,缓存的内容将被刷新。