response对象代表服务器对客户端的响应,大部分时候使用更简单的响应对象out就可以了,但out对象用于输出字符流,无法输出非字符流,如果要在JSP页面中生成一幅位图、或者一个PDF文档,就只能使用response作为响应输出。
response可以用于重定向页面,其sendRedirect(String path)方法用于是重定向到指定路径的页面;与request对象的forward方法或JSP的forward指令不同的是,重定向会丢失所有的请求参数和request范围内的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,而且地址栏中的URL也会变成重定向的目标URL,使用重定向的结果,与在地址栏里重新输入新地址再按回车键效果完全一样。
response的另外一个作用是增加对象,增加一个Cookie有如下三个步骤:
1 调用Cookie的构造器创建一个Cookie对象,构造器为Cookie(String cookieName, String cookieValue)
2 设置Cookie的生命周期,利用1中创建好的Cookie对象,调用其setMaxAge(int seconds)方法
3 调用response对象的addCookie(Cookie ck)方法增加Cookie对象
例如下面的页面response_addcookie.jsp使用response对象增加4个Cookie,其中最后一个Cookie,其值是中文,默认情况下,Cookie不允许使用中文字符,所以添加的时候,需要编码。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试使用response对象写cookie</title>
</head>
<body>
<%
Cookie ckName = new Cookie("username", "zhangsan");
ckName.setMaxAge(30);
response.addCookie(ckName);
Cookie ckGender = new Cookie("gender", "Male");
ckGender.setMaxAge(30);
response.addCookie(ckGender);
Cookie ckAge = new Cookie("age", "28");
ckAge.setMaxAge(30);
response.addCookie(ckAge);
//中文需要编码
Cookie ckChineseName = new Cookie("ChineseName", java.net.URLEncoder.encode("张三", "utf-8"));
ckChineseName.setMaxAge(30);
response.addCookie(ckChineseName);
%>
</body>
</html>
如果浏览器没有阻止Cookie,那么在浏览器输入该页面路径,就可以新增加4个Cookie,然后在下面的页面response_readCookie.jsp中就可以读取这4个Cookie,读取Cookie要依赖request对象:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试使用request对象读cookie</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(Cookie ck : cookies)
{
if(ck.getName().equals("ChineseName"))
{
//中文需要解码
out.println(ck.getName() + ": " + java.net.URLDecoder.decode(ck.getValue(), "utf-8") + "<br />");
}
else
{
out.println(ck.getName() + ": " + ck.getValue() + "<br />");
}
}
%>
</body>
</html>
在浏览器中输入该页面的路径,就可以读出新增的4个Cookie,运行页面如下:
由于在response_addcookie.jsp页面中新增加Cookie时,调用setMaxAge方法设置的生命周期是30秒,所以30秒后,如果不刷新response_addcookie.jsp页面,刷新response_readcookie.jsp页面,就看不到这4个新增的Cookie了,如果先刷新response_addcookie.jsp页面,再刷新response_readcookie.jsp页面,可以再次看到新增的Cookie。