response 代表服务器对客户端的响应,大部分的时候,程序无需使用response来响应客户端请求,因为有更简单的响应对象out,它代表着输出流,直接使用out生成响应更简单.
但out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容,假如需要在JSP页面中动态生成一副位图,或者一个PDF文档,使用out作为响应对象将无法完成,此时必须使用response作为响应输出.
除此之外,还可以使用response来重定向请求,以及用于向客户端增加Cookie.
1 . response响应生成非字符响应
response是HttpServletResponse接口的实例,该接口提供一个getOutputStream()方法,该方法返回响应输出字节流.
<!-- 通过contentType属性指定响应数据 -->
<%@page import="java.awt.image.BufferedImage"%>
<%@ page contentType="image/png" language="java"%>
<%@ page
import="java.awt.Image.*,javax.imageio.*, java.io.*,java.awt.* "%>
<%
BufferedImage image = new BufferedImage(340, 160, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
g.fillRect(0, 0, 400, 400);
g.setColor(new Color(255, 0, 0));
g.fillArc(20, 20, 100, 100, 30, 120);
g.setColor(new Color(0, 255, 0));
g.fillArc(20, 20, 100, 100, 150, 120);
g.setColor(new Color(0, 0, 255));
g.fillArc(20, 20, 100, 100, 270, 120);
g.setColor(new Color(0, 0, 0));
g.setFont(new Font("BLACK", Font.PLAIN, 16));
g.drawString("RED", 200, 60);
g.drawString("GREEN", 200, 100);
g.drawString("BLUE", 200, 140);
g.dispose();
ImageIO.write(image, "png", response.getOutputStream());
%>
使用临时生成图片的方式可以实现网页上的图形验证码功能,
使用response生成非字符响应可以直接生成PDF文件,Excel文件.
2 . 重定向
重定向将生成第二次请求,与前一次请求不在同一个request范围内,重定向会丢失所有的请求参数和request范围的属性.
HttpServletResponse提供一个 sendRedirect(String path) 方法,该方法用于重定向到path资源,重新向path资源发送请求.
执行重定向动作时,地址栏的URL会变成重定向目标的URL.
forward与redirect都可以将请求传递到另个页面,但forward与redirect存在较大差异:
1 执行forward后依然是上一次请求,
执行redirect后生成第二次请求
2 forward的目标页面可以访问原请求的请求参数,因为是同一次请求,所有原请求的请求参数,request范围的属性全部存在.
redirect的目标页面不能访问原请求的请求参数,因为时第二次请求,所有原来的请求参数,request范围的属性全部丢失/
3 forward 地址栏里请求的URL不会改变
redirect 地址栏改为重定向的目标URL,相当于在浏览器地址栏输入新的URL后进行访问
3 增加Cookie
Cookie通常用于网站记录客户的信息,与session的不同,session会随浏览器的关闭而失效,Cookie会存放在客户端机器上(超出Cookie生命期限时消失)
response对象提供方法完成增加cookie:
void addCookie(Cookie cookie);
增加Cookie步骤:
1 创建Cookie实例,Cookie的构造器为 Cookie(String name,String value);
2 设置Cookie的生命期限,使用cookie对象必须设置其生存期限,否则Cookie将随浏览器关闭而消失
3 向客户端写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>addCookie</title>
</head>
<body>
<%
String string = "newCookie"
/* 创建Cookie对象 */
Cookie cookie = new Cookie("username", string);
/*设置Cookie生命期限 单位 秒 */
cookie.setMaxAge(60 * 60 * 24 * 7);
/* 写入Cookie */
response.addCookie(cookie);
%>
</body>
</html>
request对象提供了访问客户端的Cookie的方法 : getCookie(),该方法将返回客户端机器所有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>getCookie</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
if("newCookie".equals(c.getName())){
out.print(c.getValue())
}
}
</body>
</html>
默认情况下,Cookie值不允许出现中文字符,
如果需要值为中文内容,可以借助于java.net.URLEncoder 对中文字符串进行编码,将编码后的结果设为Cookie值,
当程序要读取Cookie时,读取后使用 java,net,URLDecoder对其解码.
<%@page import="java.net.URLDecoder"%>
<%@page import="java.net.URLEncoder"%>
<%@ 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>设置中文Cookie</title>
</head>
<body>
<%
/* 增加中文Cookie */
/* 存前进行编码 */
String value = URLEncoder.encode("雪碧", "gbk");
Cookie cookie = new Cookie("cCookie", value);
cookie.setMaxAge(60 * 60 * 24 * 3);
response.addCookie(cookie);
/* 读取中文cookie */
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
if ("cCookie".equals(c.getName())) {
/* 读取时对读取的Cookie解码 */
String value2 = URLDecoder.decode(c.getValue());
out.println();
}
}
%>
</body>
</html>