response学习

response-学习笔记

一、ServletContext

1. 什么是ServletContext

  • ServletContext:Servlet上下文。是整个web项目封装成的对象:当Tomcat启动时,会把web项目信息封装成一个ServletContext对象。

  • 如何获取ServletContext:

    在(HttpServlet方式的)Servlet里使用方法

    ServletContext context = this.getServletContext();

2. ServletContext的作用

2.1 是一个域对象(面试题)

  • 域对象:由Servlet规范提供的,能够存储数据的对象,在域对象里的数据,在其作用范围内可以共享

  • 域对象有:ServletContext, request, session, PageContext

  • 域对象存取数据的方法:

    • setAttribute(String name, Object value):存数据

    • getAttribute(String name):取数据

    • removeAttribute(String name):删数据

  • ServletContext的作用范围:

    • 何时创建:服务器启动时

    • 何时销毁:服务器关闭时

    • 作用范围:整个web项目

2.2 可以获取项目里任意资源

  • 读取src里的资源文件:

    InputStream is = 类加载器.getResourceAsStream("资源文件在src里的路径");
  • 读取web里的资源文件:

    InputStream is = servletContext.getResourceAsStream("资源文件在web里的路径");
    String realPath = servletContext.getRealPath("资源文件在web里的路径");

二、HTTP协议

1. HTTP协议简介

  • HTTP:HyperText Transfer Protocol,超文本传输协议

  • HTTP协议:是客户端和服务端数据交互时,数据的格式规范

  • HTTP协议分为:

    • HTTP请求:客户端发给服务端的数据

    • HTTP响应:服务端返回给客户端的数据

  • 没有请求,就没有响应;有请求才有响应

2. 抓包工具

  • 用来抓取HTTP请求和HTTP响应数据的工具。只能看,不能拦截,不能修改

  • HttpWatch,浏览器自带的F12->Network(网络)

3. HTTP响应

响应行

  • 本次响应的基本信息

  • 格式:协议版本 响应状态码 [响应状态描述]

  • 比如:HTTP/1.1 200

  • 常见的响应状态码:

    • 200:一切正常

    • 302:重定向,让浏览器跳转到其它地址

    • 304:让浏览器取本地缓存

    • 404:找不到资源

    • 500:服务器内部错误

响应头

  • 本次响应的附加信息

  • 格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头

  • 比如:Content-Length: 12

响应体

  • 本次响应的正文内容,是会显示到浏览器页面上的内容

  • 格式:没有固定格式。请求什么,就响应什么

三、response操作响应

1. response简介

  • response:用于操作HTTP响应的一个对象,是HttpServletResponse的实例对象。

2. response原理

3. response操作响应

3.1 操作响应行

  • 设置响应状态码:

//通常用于设置 非错误码
response.setStatus(int code);
​
//通常用于设置 错误码
response.sendError(int code);
response.sendError(int code, String errorMsg);

3.2 操作响应头

  • 设置响应头

response.setHeader(String name, String value)
  • ==重定向功能的实现==

    让浏览器立即跳转到指定的地址

response.sendRedirect("/项目路径/资源路径");

3.3 操作响应体

3.3.1 通过字符型设置响应体

//解决中文响应体乱码。一定要写在获取writer对象之前,否则无效
response.setContentType("text/html;charset=utf-8");
​
PrintWriter writer = response.getWriter();
writer.print("想要发送到浏览器页面上显示的内容");

3.3.2 通过字节型设置响应体

//获取输出流
ServletOutputStream os = response.getOutputStream();

3.4 文件下载功能

@WebServlet(urlPatterns="/download", name="DownloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.接收参数:filename
        String filename = request.getParameter("filename");

        /**
         * 增加代码:让浏览器弹出下载框,而不是显示响应体里的内容
         */
        response.setHeader("Content-Disposition","attachment;filename=" + DownloadUtils.encodeFilename(request, filename));

        //2.获取文件的输入流
        ServletContext context = this.getServletContext();
        InputStream inputStream = context.getResourceAsStream("WEB-INF/files/" + filename);
        //3 获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //4.把数据写到输出流里
        int len = -1;
        byte[] buffer = new byte[1024 * 8];
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        //5.关闭流
        inputStream.close();
        outputStream.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

 

内容回顾

  1. 能够说出ServletContext域对象:

    • 何时创建:服务器启动时

    • 何时销毁:服务器关闭时

    • 作用范围:整个web项目

  2. 能够读取web项目里任意资源文件

    • 读取src里的资源:类加载器.getResourceAsStream("文件在src里的路径");

    • ==读取web里的资源==:servletContext.getResourceAsStream("文件在web里的路径");

  3. 理解response的原理

  4. response操作响应:

    • 操作响应行:response.setStatus(int code)

    • 操作响应头:response.setHeader(String name, String value)

    • ==让浏览器重定向跳转==:response.sendRedirect("/项目路径/资源路径")

    • 操作响应体:

      • ==字符型:==

        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("页面上显示的内容");
      • 字节型

        ServletOutputStream os = response.getOutputStream();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值