7.HttpServletResponse接口(重点)
7.1.是ServletResponse的子接口,表示HTTP协议的响应对象(该接口中包含了处理响应的方法)
7.2.这些方法的主要功能是设置HTTP状态码和管理Cookie
7.3.代表服务器的响应,封装了向客户端发送数据、发送响应头,发送响应状态码的方法
HttpServletResponse常用方法示例:
1.负责向客户端(浏览器)发送数据的相关方法
(1)以字节流输出,getOutputStream()示例:
public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
String data = "中国";
//获取OutputStream输出流
OutputStream outputStream = response.getOutputStream();
//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
response.setHeader("content-type", "text/html;charset=UTF-8");
//将字符转换成字节数组,指定以UTF-8编码进行转换
byte[] dataByteArr = data.getBytes("UTF-8");
//使用OutputStream流向客户端输出字节数组
outputStream.write(dataByteArr);//输出“中国”}
(2)以字符流输出,getWriter()示例:
public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException{
String data = "中国";
//设置将字符以"UTF-8"编码输出到客户端浏览器
response.setCharacterEncoding("UTF-8");
//获取PrintWriter输出流
PrintWriter out = response.getWriter();
//使用PrintWriter流向客户端输出字符
out.write(data);
注:getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法
response.setContentType("text/html;charset=UTF-8");字符流,字节流均可用
2.负责向客户端(浏览器)发送响应头的相关方法
(1)addHeader(String name, String value):用给出的name和value,增加一个响应报头到响应中
(2)containsHeader(String name):判断以name为名字的响应报头是否已经设置
(3)setHeader(String paramString1, String paramString2):用给出的name和value,设置一个响应报头。如果这个报头已经被设置,新的值将覆盖先前的值
3.负责向客户端(浏览器)发送响应状态码的相关方法
setStatus(int paramInt):为响应设置状态代码
4.其余可能用到的方法
(1)addCookie(Cookie paramCookie):增加一个Cookie到响应中。这个方法可以被多次调用,用于设置多个Cookie
(2)encodeURL(String paramString):使用Session ID对指定的url进行编码。如果该url不需要编码,则返回未改变的url
(3)encodeRedirectURL(String paramString):使用Session ID对用于重定向的url进行编码,以便用于sendRedirect()方法中。如果该url不需要编码,则返回未改变的url
(4)sendRedirect(String paramString):发送一个临时的重定向响应到客户端,让客户端访问新的URL
7.4.主要作用就是输出数据到页面上
HttpServletResponse常用应用示例:
在总结ServletResponse时,已经对常用场景进行过简单介绍,这里再次进行总结!!!
1. 输出数据(2种方式)
(1)getOutputStream():以字节流输出
(2)getWriter():以字符流输出
上面已经做过示例!!
2.文件下载示例
文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载!
private void downloadFileByOutputStream(HttpServletResponse response)
throws FileNotFoundException, IOException {
//1.获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/download/1.JPG");
//2.获取要下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
response.setHeader("content-disposition", "attachment;filename="+fileName);
//4.获取要下载的文件输入流
InputStream in = new FileInputStream(realPath);
int len = 0;
//5.创建数据缓冲区
byte[] buffer = new byte[1024];
//6.通过response对象获取OutputStream流
OutputStream out = response.getOutputStream();
//7.将FileInputStream流写入到buffer缓冲区
while ((len = in.read(buffer)) > 0) {
//8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer,0,len);
}
in.close();
}
}
注:使用PrintWriter流处理字节数据,会导致数据丢失,因此在编写下载文件功能时,要使用OutputStream流,避免使用PrintWriter流!!
3.生成验证码
(1)生成随机图片用作验证码主要用到了一个BufferedImage类
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置refresh响应头控制浏览器每隔5秒钟刷新一次
response.setHeader("refresh", "5");
//1.在内存中创建一张图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//2.得到图片
Graphics2D g = (Graphics2D)image.getGraphics();
g.setColor(Color.WHITE);//设置图片的背景色
g.fillRect(0, 0, 80, 20);//填充背景色
//3.向图片上写数据
g.setColor(Color.BLUE);//设置图片上字体的颜色
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
//4.设置响应头控制浏览器浏览器以图片的方式打开
response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
//5.设置响应头控制浏览器不缓存图片数据
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//6.将图片写给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
}