1 Response对象概述
负责对浏览器进⾏响应的对象
什么是响应: 服务器接收到请求需要进行处理,将处理以后的结果显示回浏览器端(将这个过程称为是响应Response)。
查看Servlet中的service方法得知, Servlet中使用的ServletResponse接口, 而我们使用的是 ServletResponse的子接口HttpServletResponse, 它继承自ServletResponse, 是与HTTP协议相关 的Response响应对象
我们使⽤的⼦接⼝HttpServletResponse, 此接⼝对象由Tomcat引擎提供
可以实现对客户端的响应, 响应内容包括: 响应⾏,响应头,响应体
2 Response设置响应⾏
⽅法
返回值
描述
setStatus(int sc)
void
设置响应的状态码
设置响应的状态码
200 正确
302 重定向
304 查找本地缓存
404 请求资源不存在
500 服务器内部错误
response.setStatus(500);
3 Response设置响应头
HTTP协议的响应头,数据格式键值对 k:v
包含指导性信息,指导客户端
⽅法
返回值
描述
addHeader(String key,String value)
void
添加响应头,值为String类型
addIntHeader(String key,int value)
void
添加响应头,值为int类型
addDateHeader(String key,long l)
void
添加响应头,值为⽇期类型
setHeader(String key,String value)
void
更改响应头,值为String类型
setIntHeader(String key,int value)
void
更改响应头,值为int类型
setDateHeader(String key,long l)
void
更改响应头,值为⽇期类型
add开头的⽅法:针对⼀个key对应多个value的情况。
⽐如已有⼀个响应头 blossom:java
然后执⾏ addHeader(“blossom”,”java2222”);
最终得到响应头的结果:blossom:java,java2222
set开头的⽅法:针对⼀个key对应⼀个value的情况
⽐如已有⼀个响应头 blossom:java
然后执⾏ setHeader(“blossom”,”java2222”);
最终得到响应头的结果:blossom:java2222
演示:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* response对象设置响应头
*/
response.addHeader("blossom","java");
response.addHeader("blossom","java111");
response.setHeader("blossom","java2222");
}
4 Response设置响应体
HTTP的响应体,就是⻚面的正文部分
字符流向浏览器写数据
⽅法
返回值
描述
write()
PrintWriter
使⽤字符串数据,没有差别, 输出是整数,查询编码表
print()
PrintWriter
⽆论是什么,原样打印
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* response对象⽅法getWriter()
* 打印流的响应体
* write() 字符流,使⽤字符串数据,没有差别, 输出是整数,查询编码表
* print() ⽆论是什么,原样打印
*/
PrintWriter pw = response.getWriter();
pw.write(100);
pw.print(100);
}
字符流的中⽂乱码问题
产⽣乱码原因: 编码和解码不⼀致
提问:在Servlet中编写以下代码,向⻚⾯输出中⽂是否会产⽣乱码?
response.getWriter().print("中⽂");
会乱码:
原因:
字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。这个字符集不⽀持中⽂的。
解决:
设置response获得字符流缓冲区的编码 与 设置浏览器默认打开时候采⽤的字符集⼀致即可。
|⽅法 |放回值| 描述| |---|---| |setHeader("Content-Type","text/html;charset=UTF-8") |void| 设置浏览器打开⻚⾯时采⽤的字符集| |setContextType(String type) |void |设置浏览器打开⻚⾯时采⽤的字符集|
// 设置浏览器默认打开的时候采⽤的字符集:
// response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 简化代码
response.setContentType("text/html;charset=UTF-8");
// 输出中⽂汉字
response.getWriter().println("中⽂");
字节流向浏览器写数据
⽅法
返回值
描述
getOutputStream()
OutputStream
返回字节输出流OutputStream,响应⾮⽂本类型的数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* response对象的⽅法getOutputStream,响应⾮⽂本类型的数据
*/
//获取图⽚的绝对路径
String aFile = getServletContext().getRealPath("download/a.png");
FileInputStream fis = new FileInputStream(aFile);
OutputStream out = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
fis.close();
}
5 重定向
重定向的写法
浏览器进⾏重新的定向:
设置302状态码: setStatus(302)
设置重定向资源的地址: setHeader("location","资源")
通过HttpServletResponse对象中的以下⽅法实现重定向
⽅法
返回值
描述
sendRedirect(String location)
void
重定向
重定向的代码实现
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 浏览器进⾏重新的定向:
* 设置302状态码: setStatus(302)
* 设置重定向资源的地址: setHeader("location","/webtest/servlet2")
*/
//response.setStatus(302);
//response.setHeader("location","/webtest/servlet2");
response.sendRedirect("servlet2");
}