HttpServletResponse对象
Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用
于 代表请求的 request 对象和 代表响应的 response 对象。
request 和 response 对象代表请求和响应:获取客户端数据,需要通过
request 对象; 向客户端输出数据,需要通过 response 对象。
HttpServletResponse的主要功能用于服务器对客户端的请求进行响应,将Web服务器处理后的结果返回给客户端。Service()方法中形参接收的是HttpServletResponse接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头、发送响应状态码的方法。
常用方法:
addHeader(String name,String value) 添加指定的键值到响应头信息中
containsHeader(String name) 判断响应的头部是否被设置
encodeURL(String url) 编码指定的URL
sendError(int sc) 使用指定状态码发送一个错误到客户端
setHeader(String name,String value) 设置指定响应头的值
setStatus(int sc) 给当前响应设置状态
setContenType(String ContenType) 设置响应的MIME类型
getWriter() 获取输出字符流
getOutputStream 获取输出的字节流
刷新和页面自动跳转
所有头信息都是随着请求和回应自动发送到服务器端(客户端),在response 中一个比 较常用的头信息就是刷新的指令,可以完成定时刷新的功能。
resp.setHeader(“refresh”,”2”);
对于刷新的头信息,除了定时的功能外,还具备了定时跳转的功能,可以让一个页面定时跳转到一个指定的页面。(已经注册成功,两秒后跳转到登陆页面)
response.setHeader("refresh","3;URL=ok.html");
但是这种跳转不是万能的,有时候根本就无法进行跳转操作,返回后刷新不
会跳转;对于这种定时跳转的头信息,也可以采用 HTML 的方式进行设置,HTML
本身也可以设 置头信息。(客户端跳转)
<meta http-equiv=”refresh” content=”3;http://www.baidu.com”>
数据响应
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,
响应时需要获取输出流,有两种形式 getWriter() 获取字符流( 只能响应回字符);
getOutputStream() 获取字节流( 能响应一切数据)。响应回的数据到客户端被浏览
器解析。注意:两者不能同时使用。
// 设置响应类型 默认是纯文本
response.setContentType("text/html");
// 得到输出流 字符输出流
/*PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h3>Hello</h3>");
writer.close();*/
// 得到字节输出流
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h3>Hello</h3>".getBytes());
out.close();
乱码解决
乱码原因:在响应时,服务器经过网络传输响应数据到客户端,服务器默认编码为ISO-8859-1,该编码不支持中文;客户端也有其默认编码。
总结:1、服务端和客户端编码不一致;2、客户端和服务端的编码不支持中文。
如何解决:1、设置客户端和服务端的编码一致;2、客户端和服务端编码都支持中文;
getWriter()乱码
响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
// 设置服务端的编码
//response.setCharacterEncoding("UTF-8");
// 设置客户端的编码
//response.setHeader("content-type", "text/html;charset=UTF-8");
// 同时设置客户端和服务端的编码
response.setContentType("text/html;charset=UTF-8");
响应图片
在学习 HTML 的时候我们知道使用<img src=”img.jpg”>的方式可以显示图
片。但有的时候我们并不知道(或不能确定)图片的路径,需要通过请求服务器资
源动态地响应图片给客户端。这种方式和文件拷贝的理念是一致的,客户端请求
服务器的资源,在服务端获取到真实的图片资源,通过输入流读取到内存,然后通过输出流写出到客户端即可。
值得注意的是,在客户端解析资源时默认是以文本(text/html)的形式,当
响应图片时 需要指定响应头信息,告知客户端响应内容为图片形式,使用一种
叫做 MIME 类型的东西来指定。MIME 类型见 Tomcat 的 web.xml 文件。
// 设置响应类型
response.setContentType("image/jpeg");
// 1、得到图片存放的路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/jay.jpg"); // 得到项目在服务器中存放的真实路径
// 得到图片
// String file = realPath + ."/WEB-INF/jay.jpg";
System.out.println(realPath);
// 2、通过路径得到文件对象
File file = new File(realPath);
// 3、得到字节输出流
ServletOutputStream out = response.getOutputStream();
// 4、得到文件对象的输入流
InputStream in = new FileInputStream(file);
// 5、循环读取,并写出到浏览器
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes)) != -1) {
// 写出
out.write(bytes,0,len);
}
out.flush();
in.close();
out.close();
重定向跳转
重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect("url");),当客户端接收到响应后,立刻、马上、
自动根据服务器 给的地址进行请求的发送第二个请求,服务器接收请求并作出 响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。
请求转发和重定向的区别:
1、 请求转发是服务端跳转,重定向是客户端跳转
2、 请求转发只有一次请求,重定向有两次请求
3、 请求转发地址栏不发生改变,重定向地址栏会改变
4、 请求转发request域对象能共享,重定向不能共享
5、请求转发只能请求当前资源下的路径,重定向可以任意地址
// 请求转发
// request.getRequestDispatcher("index.html").forward(request, response);
// 重定向
//response.sendRedirect("index.html");
/*设置request域对象*/
//request.setAttribute("name", "zhangsan");
// 请求转发
//request.getRequestDispatcher("ser07").forward(request, response);
// 重定向
//response.sendRedirect("ser07");
/* 请求地址 */
//request.getRequestDispatcher("/sr02/ser01").forward(request, response);
//response.sendRedirect("/sr02/ser01");
//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
response.sendRedirect("http://www.baidu.com");