JSP脚本中的9个内置对象---08 response对象

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>





猜你喜欢

转载自blog.csdn.net/sjbzl/article/details/53959289
今日推荐