HttpServletResponse和HttpServletRequest

6.6、HttpServletResponse

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

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

1、简单分类

  • 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;
  • 负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);

void setContentLength(int var1);

void setContentType(String var1);

void setBufferSize(int 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);
  • 响应的状态码
int SC_OK = 200;//响应成功
int SC_NOT_FOUND = 404;//找不到资源,资源不存在
int SC_INTERNAL_SERVER_ERROR = 500;//服务器代码错误
int SC_BAD_GATEWAY = 502;//网关错误
//3XX  请求重定向

2、常见应用

  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. 要获取下载文件的路径
        String realPath = "D:\\App\\IDEA\\Project\\response\\src\\main\\resources\\叶通.jpg";
        System.out.println("下载文件的路径:" + realPath);
        //2. 下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
        //3. 设置想办法让浏览器能够支持(Content-Disposition)我们需要的东西,中文文件名URLEncoder.encode编码,否则可能有乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //4. 获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //5. 创建缓冲区
        int len = 0;
        byte[] bytes = new byte[1024];
        //6. 获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        //7. 将FileOutputStream流写入buffer缓冲区,8. 使用OutputStream将缓冲区的数据输出到客户端
        while ((len = in.read(bytes)) > 0) {
            out.write(bytes, 0, len);
        }
        in.close();
        out.close();
    }

注意:调试时遇到一个错误,讲逻辑处理写在doPost()里面,访问过去并没有出现下载也没有报错

3、验证码功能

验证码怎么来?

  • 前端实现
  • 后端实现,需要用到java的图片类,生成一个图片
@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, 80, 20);
    //给图片写数据
    g.setColor(Color.blue);
    g.setFont(new Font(null, Font.BOLD, 20));
    g.drawString(makeNun(), 0, 20);
    //告诉浏览器,这个请求用图片的方式打开
    resp.setContentType("image/jpg");
    //网站存在缓存,不然浏览器缓存
    resp.setDateHeader("expires", -1);
    resp.setHeader("Cache-Control", "no-cache");
    resp.setHeader("Pragma", "no-cache");

    //把图片写个浏览器
    ImageIO.write(image, "jpg", resp.getOutputStream());
}

private String makeNun() {
    Random random = new Random();
    String num = random.nextInt(9999999) + "";
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 7 - num.length(); i++) {
        sb.append("0");
    }
    String s = sb.toString() + num;
    return num;
}

4、实现重定向

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

常见场景:

  • 用户登录
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
    /*两句话直接可以用一句话代替
    resp.setHeader("Location","/image");
    resp.setStatus(302);
    */        
    resp.sendRedirect("/image");
}

面试题:请你聊聊重定向和转发的区别?

相同点:

  • 都可以实现页面的跳转

不同点:

  • 请求转发的时候,url不会发生变化;307
  • 重定向的时候,url地址栏会相应变化;302
    在这里插入图片描述

6.7、HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过

这个方法可以获得客户端的所有信息

简单分类:和HttpServletResponse刚好对应,这边刚好都是get

1、获取前端传递的参数

重点掌握两个方法

req.getParameter("");
req.getParameterValues("");

2、请求转发

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobbies = req.getParameterValues("hobby");
    System.out.println(Arrays.toString(hobbies));
    System.out.println(username+":"+password);
    //请求转发,特别注意这边的/,代表当前web应用
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
    //重定向
    //resp.sendRedirect("/s/success.jsp");
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值