Java Web学习Day02 Response
1、HttpServletResponse
Web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表HttpServletResquest对象;代表响应的一个HttpServletResponse对象;
- 如果要获取客户端请求过来的参数:找 HttpServletRequest
- 如果要给客户端响应一些信息: 找 HttpServletResponse
1.1 简单分类
负责向浏览器发送时数据的方法
-
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
-
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); ...
-
响应的状态码
200:请求响应成功
3xx:请求重定向
重定向 你重新导我给你的新位置去
4xx: 找不到资源 (资源不存在)404
5xx 服务器代码错误 500 502 网关错误
1.2 常见应用
-
向浏览器输出消息:
-
下载文件
- 获取下载文件的路径
- 下载的文件名是啥
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 获取下载文件的路径 String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/1.png"); System.out.println("下载文件的路径:"+realPath); // 2. 下载的文件名是啥 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3. 设置想办法让浏览器能够支持(Content-dispositio)下载我们需要的东西,中文名文件用 URLEncoder.encode 否则可能出现乱码; resp.setHeader("Content-dispositio","attachment;filename="+ URLEncoder.encode(fileName,"utf-8")); // 4. 获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // 5. 创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6. 获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端! while((in.read(buffer))>0){ out.write(buffer,0,len); } // 关闭输入输出流 in.close(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } D:\java_student\source_code\javaweb_02_servlet\responsed\target\responsed\WEB-INF\classes\1.png
1.3 验证码功能
- 前端实现
- 后端实现,用到java的图片类,生成一个图片
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 { // 如何让浏览器3秒钟刷新一次 resp.setHeader("refresh","3"); // 在内存中创建一个图片 BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR); // 得到图片 Graphics2D gs = (Graphics2D) image.getGraphics();//笔 // 设置图片的背景颜色 gs.setColor(Color.green); gs.fillRect(0,0,80,20); // 给图片写数据 gs.setColor(Color.white); gs.setFont(new Font(null,Font.BOLD,20)); gs.drawString(makeNum(),0,20); // 告诉浏览器这个请求用图片的方式打开 resp.setContentType("image/jpeg"); // 网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); // 把图片写给浏览器 boolean write = ImageIO.write(image, "jpeg",resp.getOutputStream()); } // 生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(999999)+""; StringBuffer strb = new StringBuffer(); for (int i = 0; i < 6-num.length(); i++) { strb.append("0"); } num= strb.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }