2.6.7 response对象
2.6.7 response对象
response
代表服务器对客户端的响应。大部分时候,程序无须使用response
来响应客户端请求,因为有个更简单的响应对象out
,它代表页面输出流,直接使用out
生成响应更简单。
但out
是JspWriter
的实例,JspWriter
是Writer
的子类,Writer
是字符流,无法输出非字符内容假如需要在JSP
页面中动态生成一幅位图、或者输出一个PDF
文档,使用out
作为响应对象将无法完成,此时必须使用response
作为响应输出。
除此之外,还可以使用response
来重定向请求,以及用于向客户端增加Cookie
.
1. response响应生成非字符响应
对于需要生成非字符响应的情况,就应该使用response
来响应客户端请求。下面的JSP
页面将在客户端生成一张图片。
getOutputStream方法
response
是HttpServletResponse
接口的实例,该接口提供了一个getOutputStream()
方法,该方法返回响应输出字节流.
img.jsp
1 | <%-- 通过contentType属性指定响应数据是图片 --%> |
以上页面的代码:
1 | <%@ page contentType="image/png" language="java"%> |
先设置了服务器响应数据是image/png
,这表明服务器响应是一张PNG
图片。
接着创建了一个BufferedImage
对象(代表图像),并获取该BufferedImage
的Graphics
对象(代表画笔),然后通过Graphics
向BufferedImage
中绘制图形,最后一行代码将直接将BufferedImage
作为响应发送给客户端。
测试
请直接在浏览器中请求该页面,将看到浏览器显张图片,效果如图2.29所示。
jsp页面直接作为img标签的地址
也可以在其他页面中使用img
标签来显示这个图片页面,代码如下:
1 | <img src="img.jsp"> |
图形验证码
使用这种临时生成图片的方式就可以非常容易地实现网页上的图形验证码功能。不仅如此,使用response
生成非字符响应还可以直接生成PDF
文件、Excel
文件,这些文件可直接作为报表使用。
2. 重定向
重定向会丢失请求数据
重定向是response
的另外一个用处,与forward
不同的是,重定向会丢失所有的请求参数和request
范围的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request
范围内,所以发送一次请求的请求参数和request
范围的属性全部丢失。
response.sendRedirect方法
HttpServletResponse
提供了一个sendRedirect(String path)
方法,该方法用于重定向到path
资源,即重新向path
资源发送请求。
doRedirect.jsp
下面的JSP
页面将使用response
执行重定向。
1 | <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> |
以上页面的代码:
1 | response.sendRedirect("redirect-result.jsp"); |
用于执行重定向,向该页面发送请求时,请求会被重定向到redirect-result.jsp
页面。例如,在地址栏中输入htp:/Localhost888LjspObject/doRedirectJsp?name=Crazyit.org
,然后按回车键,将看到如图2.30所示的效果。
注意地址栏的改变,执行重定向动作时,地址栏的URL
会变成重定向的目标URL
,而且重定向丢失了请求数据。
重定向会丢失所有的请求参数,使用重定向的效果,与在地址栏里重新输入新地址再按回车键的效果完全一样,即发送了第二次请求。
forward和redirect的区别
从表面上来看,forward
动作和redirect
动作有些相似:它们都可将请求传递到另一个页面。但实际上forward
和redirect
之间存在较大的差异,forward
和redirect
的差异如表2.1所示
转发(forward ) |
重定向(redirect ) |
---|---|
执行forward 后依然是上一次请求 |
执行redirect 后生成第二次请求 |
forward 的目标页面可以访问原请求的请求参数,因为依然是同一次请求,所有原请求的请求参数、request 范围的属性全部存在 |
redirect 的目标页面不能访问原请求的请求参数,因为是第二次请求了,所有原请求的请求参数、request 范围的属性全部丢失 |
地址栏里请求的URL 不会改变 |
地址栏改为重定向的目标URL 。相当于在浏览器地址栏里输入新的URL 后按回车键 |
3. 增加Cookie
Cookie
通常用于网站记录客户的某些信息,比如客户的用户名及客户的喜好等。一旦用户下次登录,网站可以获取到客户的相关信息,根据这些客户信息,网站可以对客户提供更友好的服务。
cookie和session的区别
Cookie
与session
的不同之处在于:session
会随浏览器的关闭而失效,但Cookie
会一直存放在客户端机器上,除非超出Cookie
的生命期限。
客户端可禁用cookie
由于安全性的原因,使用Cookie
客户端浏览器必须支持Cookie
才行。客户端浏览器完全可以设置禁用Cookie
。
增加Cookie
也是使用response
内置对象完成的,response
对象提供了如下方法。
response对象方法 | 描述 |
---|---|
void addCookie(Cookie cookie) |
增加Cookie |
在增加Cookie
之前,必须先创建Cookie
对象。
添加Cookie的步骤
增加Cookie
请按如下步骤进行:
- 创建
Cookie
实例,Cookie
的构造器为Cookie(String name, String value)
- 设置
Cookie
的生命期限,即该Cookie
在多长时间内有效 - 向客户端写
Cookie
。
程序示例 读写cookie
addCookie.jsp
看如下JSP
页面,该页面可以用于向客户端写一个username
的Cookie
。
1 | <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> |
如果浏览器没有阻止Cookie
,在地址栏输入:
1 | http://localhost:8080/jspObject/addCookie.jsp?name=Trump |
执行该页面后,网站就会向客户端机器写入一个名为username
的Cookie
,该Cookie
将在客户端硬盘上一直存在,直到超出该Cookie
的生存期限(本Cookie
设置为24小时)。
读取cookie request.getCookies方法
访问客户端Cookie
使用request
对象。
request
对象提供了getCookies()
方法,该方法将返回客户端机器上所有Cookie
组成的数组,- 然后遍历该数组的每个元素,找到希望访问的
Cookie
即可。
readCookie.jsp
下面是访问Cookie
的JSP
页面的代码。
1 | <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> |
上面的代码就是通过request
读取Cookie
数组,并搜寻指定Cookie
的关键代码,访问该页面即可读出刚才写在客户端的Cookie
。
使用Cookie
对象必须设置其生存期限,否则Cookie
将会随浏览器的关闭而自动消失。
默认情况下,Cookie
值不允许出现中文字符,如果需要值为中文内容的Cookie
怎么办呢?同样可以借助于java.net.URLEncoder
先对中文字符串进行编码,将编码后的结果设为Cookie
值。当程序要读取Cookie
时,则应该先读取,然后使用java.net.URLDecoder
对其进行解码。
cnCookie.jsp
如下代码片段示范了如何存入值为中文的Cookie
1 | <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> |
上面的程序中两行粗体字代码是存入值为中文的Cookie
的关键:存入之前先用java.net.URLEncoder
进行编码;读取时需要对读取的Cookie
值用Java.net.URLDecoder
进行解码。