ServletResponse


web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,和一个代表响应的HttpServletResponse对象

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

简单分类

  • 负责向浏览器发送数据的方法

    • ServletOutputStream getOutputStream() throws IOException;
      
      PrintWriter getWriter() throws IOException;
      
  • 负责向浏览器发送一些响应头的方法

    • void setCharacterEncoding(String var1);
      
      void setContentLength(int var1);
      
      void setContentLengthLong(long var1);
      
      void setContentType(String var1);
      
  • 响应的状态码

常见应用

1.向浏览器输出消息

2.下载文件

  1. 要获取下载路径

  2. 下载文件名

  3. 设置让浏览器支持的下载格式

  4. 获取下载文件的输入流

  5. 创建缓冲区

  6. 获取OutputStream对象

  7. 将FileOutputStream流写入到buffer缓冲区

  8. 使用OutputStream将缓冲区中的数据输出到客户端

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 要获取下载路径
            //D:\计算机学习\JavaWeb\代码\JavaWeb-lesson-servlet\servlet-01\HelloServlet\HttpServletResponse\src\main\resources\pic.jpg
            String realPath = "D:\\计算机学习\\JavaWeb\\代码\\JavaWeb-lesson-servlet\\servlet-01\\HelloServlet\\HttpServletResponse\\src\\main\\resources\\pic.jpg";
            System.out.println("下载文件的路径:" + realPath);
            //2. 下载文件名
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
            //3. 设置让浏览器支持的下载格式
            resp.setHeader("Content-disposition","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((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            in.close();
            out.close();
        }
    

3.验证码功能

  • 前端实现,js
  • 后端实现,需要用到image类
package com.Gw.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.nio.Buffer;
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_INT_RGB);
        //得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0, 0, 140, 20);
        //给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);

        //告诉浏览器这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");
        //把图片写给浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }
    //生成随机数
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 7 - num.length(); i++) {
            stringBuffer.append("0"); //不够七位用0填充
        }
        num = stringBuffer.toString() + num;
        return num;
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

4.实现重定向

resp.sendRedirect("");

? 一个web资源B收到客户端A的请求后,B会通知客户端A去访问另外一个web资源C,这个过程叫做重定向

场景:用户登录

重定向和转发的区别:

相同点:都会实现跳转

不同点:重定向跳转后url会变化

? 转发不会变化

package com.Gw.servlet;

import com.sun.net.httpserver.Authenticator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入这个请求");
        String userName = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username:" + userName + "\npassword" + password);
        resp.sendRedirect("/HttpServletResponse_war/suc.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

<%@page pageEncoding="utf-8" %>
<%--注意设置编码格式--%>


Hello World!

<%--这里提交的路径需要寻找到项目的路径--%> <%--${pageContext.request.contextPath}代表当前项目--%>
用户名:
密码:

    request
    com.Gw.servlet.RequestTest


    request
    /login