5.5.3 响应对象:response
response对象和request对象是相对应的,request对象用来获取客户端的信息。而response对象封装了JSP产生的将被发送到客户端的响应。request对象和response对象的结合可以使JSP更好地实现客户端与服务器的信息交互。
1.常用方法
response对象的主要用途包括设置HTTP响应报头、重定向页面、设置缓冲区。常用方法及说明如表5-7所示。
表5-7 response对象常用方法及说明
续表
2.应用示例
(1)设置HTTP响应的首部信息
response对象可以使用方法add Header()或方法set Header()添加或设置响应报文的首部和值,并传给客户的浏览器。如果添加的首部已经存在,则后添加的响应首部可以覆盖原来的内容。
下面是一个定时刷新页面的例子。通过response对象的set Header()方法设置HTTP响应首部的值使页面每隔1秒自动刷新。程序中用到了Date类的方法,需要使用page指令导入java.util.*类。
【例5-18】使用set Header()方法设置HTTP首部。
运行结果如图5-23所示。
图5-23 定时刷新页面的运行结果
(2)重定向页面
response对象提供了send Redirect()方法实现重定向的功能,即在某些情况下响应客户时,将客户重新引导至另一个页面。例如,如果客户输入的表单信息不完整,就会再被引导到该表单的输入页面。
【例5-19】给出了一个登录页面,当用户没有输入用户名就直接提交表单时,页面会调用send Redirect()方法重定向到登录页面。
【例5-19】使用send Redirect()重定向。
运行结果如图5-24、图5-25所示。
图5-24 用户未输入信息登录时将重定向到登录页面
图5-25 用户输入信息的正常登录页面
需要注意的是send Redirect与jsp:forward的区别。send Redirect是绝对跳转,地址栏中显示跳转后页面的URL,跳转前后的两个页面不属于同一个请求。而jsp:forward跳转后地址栏中仍显示以前页面的URL,跳转前后的两个页面属于同一个请求。
(3)cookie管理
第3章介绍了cookie的基本原理,这种技术使服务器端程序能够将部分跟踪会话的数据存放在客户端,提高网页处理效率。JSP中使用了javax.servlet.http.Cookie类创建cookie对象来表示一个HTTP cookie。该类也提供了一些方法用于cookie处理,常用方法及说明列举如下。
表5-8 cookie的常用方法及说明
上述Cookie类的方法需要和request、response对象提供的方法结合使用以实现对cookie的管理。下面介绍服务器端使用cookie的方法和步骤。
①创建cookie对象
调用Cookie的构造函数创建一个cookie,该方法接收两个参数:cookie名字和值,例如,
Cookie usercookie=new Cookie(“userName“,“Al ice“);
注意,名字和值都不能含有空格或[]()=,“/?@:;等字符。
②设置cookie有效期
默认情况下,创建的cookie将在浏览器关闭时取消。若希望浏览器将cookie存储在磁盘上,则需要调用set Max Age()方法设置cookie的最大时效。例如,
usercookie.setMaxAge(60*60*24*7);//usercookie的生存时间为1周,以秒为单位
将最大时效设为0则是告知浏览器删除cookie。
③将cookie返回客户端
将cookie发送回客户端需要调用response对象的addCookie()方法。该方法创建Set-Cookie首部并将cookie插入HTTP响应报文。例如,
response.addCookie(usercookie);
④从客户端获取cookie
由浏览器发来的cookie封装在request对象中,对应了HTTP请求报文Cookie首部,需要调用request对象的getCookies()方法获取cookie。该方法返回一个包含所有cookie对象的数组,当请求报文中不含cookie时,返回null。
获得数组后,通常会循环调用Cookie的get Name()方法与需要的cookie名字进行对比,找到匹配的cookie对象。之后调用get Value()方法获取该cookie的值进行处理。例如,
下面给出了一个使用cookie记录客户浏览页面的次数和上次浏览时间的示例。
【例5-20】使用cookie的示例。
运行结果如图5-26所示。
图5-26 用cookie记录客户浏览页面的次数和上次浏览时间的显示效果
(4)页面中文乱码处理
由于Java内核和.class文件都是基于Unicode的,所以在页面上处理显示中文可能会出现乱码的问题。解决乱码问题,需要结合具体的情况。
①JSP页面乱码
这通常是由页面编码不一致导致的,默认的页面字符编码集为ISO-8859-1,不支持中文,显示中文时需要使用page指令设置页面字符编码,如下所示:
%@page pageEncoding=“gb2312%“
%@page contentType=“text/html;charset=gb2312“%
其中GB2312可以改为UTF-8、GBK。
②表单提交中文时的乱码
使用POST方法提交表单时,可以选用以下两种方法:
·获取请求参数后进行编码转换,例如name属性指定的参数带有中文,可以采用如下语句进行转换
St r ing s=new St r ing(request.getParameter(“name“).getBytes(“ISO-8859-1“),“gb2312“)
但如果此类参数较多,每个都进行编码转换,效率太低。
·在获得请求参数之前,通过request.setCharacter Encoding(“gb2312”)对请求进行统一编码。
使用GET方法提交表单或直接在URL后面追加中文的请求参数时,也可以使用POST方法提交表单时的第1种处理方法进行编码转换或者在Tomcat下server.xml的Connector节点中增加useBodyEncodingFor URI=“true”属性配置,再使用request.setCharacterEncoding(“gb2312”)语句。
③响应中输出的乱码
当向客户端响应时带有中文,可以在返回客户端之前使用下述语句设置HTTP响应编码。
response.setCharacterEncoding(“gb2312“);
response.setContentType(“text/html;charset=gb2312“);