1.HttpServletResponse的创建
当web服务器收到来自浏览器的请求后,针对这个请求,会自动创建一个代表请求的HttpServletRequest对象和一个代表响应的HttpServletResponse对象。
然后传入Servlet类的service函数中:
2.HttpServletResponse的写方法
负责向浏览器发送数据:
ServletOutputStream getOutputStream() throws IOException; //正常情况下使用,除了写中文时 //输出的数据将以字节流的形式发送到客户端 PrintWriter getWriter() throws IOException; //写中文时使用,通常在需要发送文本数据(如HTML、JSON、XML等)时使用 //输出的数据将以字符流的形式发送到客户端
负责向浏览器发送响应头:
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1);void setDateHeader(String var1, long var2); void addDateHeader(String var1, long var2); void setHeader(String var1, String var2); void addHeader(String var1, String var2); void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2);
设置响应的状态码:
void setStatus(int var1); int SC_OK = 200; int SC_NOT_FOUND = 404; int SC_INTERNAL_SERVER_ERROR = 500; int SC_BAD_GATEWAY = 502;
3.HttpServletResponse的常见应用
1)向浏览器发送消息
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().print("Hello World!"); }
2)下载文件
步骤:
获取要下载的资源的绝对路径
在IDEA中右键资源文件,得到Path
设置响应头,告诉浏览器我们要提供下载服务
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
获取下载资源的的输入流(也就是去读资源文件)
FileInputStream inputStream = new FileInputStream(realPath);
获取response的输出流对象(也就是向浏览器写出内容)
ServletOutputStream outputStream = resp.getOutputStream();
while((len=inputStream.read(buffer))>0){
outputStream.write(buffer,0,len); }
完整代码:
package com.study.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//String realPath = getServletContext().getRealPath("/girl.PNG");2
String realPath = "C:\\Users\\86152\\IdeaProjects\\JavaWeb_Study\\Servlet_02\\src\\main\\resources\\girl.PNG";
System.out.println("The real path is " + realPath);
String fileName = realPath.substring(realPath.lastIndexOf("//")+1);
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
FileInputStream inputStream = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
ServletOutputStream outputStream = resp.getOutputStream();
while((len=inputStream.read(buffer))>0){
outputStream.write(buffer,0,len);
}
inputStream.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
再在xml中注册一下,就可以在浏览器中下载文件了。
如果把资源文件名字改成中文,浏览器会因为编码问题报错:
这需要在响应头里修改资源文件的编码方式:
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8") );
3)生成验证码
步骤包括:
- 创建图片,并画上随机数
- 设置响应头每隔几秒刷新一次,设置响应头不使用缓存(不然无法刷新)
- 设置响应头的内容类型为图片
- 向用于响应的HttpServletResponse对象中写入图片
代码:
package com.study.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("refresh","3");
BufferedImage image = new BufferedImage(100,30,BufferedImage.TYPE_INT_RGB);
Graphics graphics = (Graphics2D) image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0,0,100,30);
graphics.setColor(Color.BLACK);
graphics.setFont(new Font(null,Font.ITALIC,20));
graphics.drawString(generateNum(),30, 22);
resp.setContentType("image/png");
resp.setHeader("expires","-1");
resp.setHeader("Control-Cache","no-cache");
resp.setHeader("Pragma","no-cache");
ImageIO.write(image,"png",resp.getOutputStream());
}
private String generateNum(){
Random random = new Random();
int num = random.nextInt(9999);
return String.format("%04d", num);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
效果图:
4)重定向
一行代码:
resp.sendRedirect("/s2/img");//注意地址不是/img二是默认路径后的路径
这样在浏览器中输入地址后,就会自动重定向到新的地址,且浏览器地址栏中的地址改变了。(这就是重定向和转发的区别,转发的地址栏不会发生变化,因为浏览器始终只与原url发生通信)
这行代码本质就是设置了重定向的新地址,和状态码,等价于下面两行代码:
resp.setHeader("Location","/s2/img"); resp.setStatus(302);