对于 HttpServletResponse, HttpServletRequest我们真的学透彻了吗

对于 **HttpServletResponse , HttpServletRequest**我们真的学透彻了吗

问题引入

typescript 复制代码
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response)
{
    ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
    util.importTemplateExcel(response, "用户数据");
}

在代码中,importTemplate 方法是一个处理POST请求的控制器方法。这个方法用于导出Excel模板。

util.importTemplateExcel(response, "用户数据");: 在这一行代码中,importTemplateExcel 方法被调用,它接受两个参数:

  • response:这是用于设置HTTP响应的对象,该方法可能会将Excel文件写入响应输出流,以便客户端下载。
  • "用户数据":这是导出的Excel文件的名称或标题。

实际上,importTemplateExcel 方法的具体实现会通过 response 对象设置一些响应头,如内容类型、文件名等,然后将Excel模板写入响应输出流,以便客户端浏览器可以下载。

客户端发起请求后,服务器会返回一个Excel文件,供用户下载或填写数据。

那么,我们就会产生一个疑惑,response到底可以干什么,与之对应的request又可以干什么呢,我们不能只是浅尝辄止,必须一次性刻骨铭心,不然每次都是懵懵懂懂,不求甚解!

文章概述

HttpServletResponseHttpServletRequest 是在Java Web开发中用于处理HTTP请求和响应的两个重要对象。它们分别承担了客户端(浏览器)向服务器发送请求和服务器向客户端发送响应的角色。以下是它们的概括性角色和任务:

  1. HttpServletRequest:

    • 角色: 代表一个HTTP请求,包含了客户端发送到服务器的所有信息。

    • 任务:

      • 获取请求参数:通过 getParameter 方法获取请求参数,包括表单参数、查询字符串参数等。
      • 获取请求头信息:通过 getHeader 方法获取请求头信息,如User-Agent、Content-Type等。
      • 获取请求的HTTP方法:通过 getMethod 方法获取请求的HTTP方法,如GET、POST等。
      • 获取Session:通过 getSession 方法获取与请求相关联的 HttpSession 对象。
      • 获取请求的URL和URI:通过 getRequestURLgetRequestURI 方法获取请求的URL和URI。
      • 获取请求的输入流:通过 getInputStream 方法获取请求的输入流,用于处理POST请求等。
      • 获取请求的属性:通过 getAttribute 方法获取请求的属性,用于在请求范围内共享数据。
      • 获取远程地址和端口:通过 getRemoteAddrgetRemotePort 方法获取客户端的IP地址和端口号。
  2. HttpServletResponse:

    • 角色: 代表一个HTTP响应,包含了服务器发送到客户端的所有信息。

    • 任务:

      • 设置响应状态码:通过 setStatus 方法设置响应的状态码,表示请求的处理结果。
      • 设置响应头信息:通过 setHeaderaddHeader 方法设置响应头信息,如Content-Type、Cache-Control等。
      • 设置响应的字符编码:通过 setCharacterEncoding 方法设置响应的字符编码。
      • 写入响应内容:通过 getWritergetOutputStream 方法获取输出流,用于向响应中写入内容。
      • 设置Cookie:通过 addCookie 方法向响应中添加Cookie。
      • 重定向:通过 sendRedirect 方法将客户端重定向到另一个URL。
      • 返回错误信息:通过 sendError 方法返回错误状态码和信息,用于处理错误情况。
      • 启用缓存控制:通过设置 Cache-ControlPragmaExpires 头部来控制缓存。

这两个对象共同工作,使得在Web应用中能够实现客户端和服务器之间的有效通信。HttpServletRequest 用于读取客户端的请求,而 HttpServletResponse 用于向客户端发送响应。

下面我们将会一一代码演示,进行详细介绍!

HttpServletRequest 详解

HttpServletRequest 对象用于在Servlet中获取客户端(浏览器)发送的请求信息。它提供了许多方法,允许你获取有关请求的各种信息。以下是一些你可以在 HttpServletRequest 上执行的常见操作:

  1. 获取请求参数: 通过 getParameter 方法,你可以获取请求中的参数值。

    ini 复制代码
    String username = request.getParameter("username");

    对于多值参数,你可以使用 getParameterValues 方法。

    ini 复制代码
    String[] hobbies = request.getParameterValues("hobby");
  2. 获取请求头信息: 使用 getHeader 方法,你可以获取请求头的信息。

    ini 复制代码
    String userAgent = request.getHeader("User-Agent");
  3. 获取请求的HTTP方法: 通过 getMethod 方法,你可以获取请求的HTTP方法(GET、POST等)。

    ini 复制代码
    String method = request.getMethod();
  4. 获取请求的URL和URI: 使用 getRequestURLgetRequestURI 方法,你可以获取请求的URL和URI。

    ini 复制代码
    StringBuffer url = request.getRequestURL();
    String uri = request.getRequestURI();
  5. 获取Session: 使用 getSession 方法,你可以获取与当前请求相关联的 HttpSession 对象。

    ini 复制代码
    HttpSession session = request.getSession();
  6. 获取请求的字符编码: 通过 getCharacterEncoding 方法,你可以获取请求的字符编码。

    ini 复制代码
    String encoding = request.getCharacterEncoding();
  7. 获取请求的参数映射: 使用 getParameterMap 方法,你可以获取所有请求参数的映射。

    ini 复制代码
    Map<String, String[]> parameterMap = request.getParameterMap();
  8. 获取请求的输入流: 如果请求体是输入流形式(例如,对于POST请求),你可以通过 getInputStream 方法获取输入流。

    ini 复制代码
    InputStream inputStream = request.getInputStream();
  9. 获取请求的属性: 使用 getAttribute 方法,你可以获取请求的属性。

    ini 复制代码
    Object attributeValue = request.getAttribute("attributeName");
  10. 获取请求的远程地址和端口: 通过 getRemoteAddrgetRemotePort 方法,你可以获取客户端的IP地址和端口号。

    ini 复制代码
    String remoteAddr = request.getRemoteAddr();
    int remotePort = request.getRemotePort();

这只是一些 HttpServletRequest 类的基本用法,实际上你可以根据需求进行更复杂的操作。

  1. 文件上传: 如果你的请求包含文件上传,你可以使用 getPart 方法来获取文件上传的部分。

    ini 复制代码
    Part filePart = request.getPart("file");
    InputStream fileContent = filePart.getInputStream();
  2. 处理Session: 使用 HttpSession,你可以在请求之间共享数据。这对于在用户会话中保留状态信息非常有用。

    ini 复制代码
    HttpSession session = request.getSession();
    session.setAttribute("user", "john_doe");
  3. 处理Cookie: 通过 getCookies 方法,你可以获取请求中的所有Cookie。

    ini 复制代码
    Cookie[] cookies = request.getCookies();
  4. 获取请求路径参数: 对于RESTful风格的请求,你可以使用 @PathVariable 注解或 getPathInfo 方法获取路径参数。

    less 复制代码
    // 使用 @PathVariable 注解
    @GetMapping("/user/{userId}")
    public String getUserById(@PathVariable String userId) {
        // 处理请求
    }
    ​
    // 使用 getPathInfo 方法
    String pathInfo = request.getPathInfo();
  5. 处理请求转发和包含: 通过 getRequestDispatcher 方法,你可以进行请求转发或包含,将请求传递给其他资源。

    ini 复制代码
    RequestDispatcher dispatcher = request.getRequestDispatcher("/anotherServlet");
    dispatcher.forward(request, response);

    或者使用 include 方法:

    vbscript 复制代码
    dispatcher.include(request, response);
  6. 处理异步请求: 如果应用支持异步处理,你可以通过 startAsync 方法启动异步请求。

    ini 复制代码
    AsyncContext asyncContext = request.startAsync();
  7. 获取请求的协议、主机名等信息: 通过 getProtocolgetSchemegetServerName 等方法,你可以获取请求的协议、方案和服务器名等信息。

    ini 复制代码
    String protocol = request.getProtocol();
    String scheme = request.getScheme();
    String serverName = request.getServerName();

HttpServletResponse 详解

HttpServletResponse 对象是在Servlet中用于与客户端(浏览器)通信的类,它提供了一系列方法,允许你设置响应的头部信息、内容类型、状态码等。以下是一些你可以在 HttpServletResponse 上执行的常见操作:

  1. 设置响应的内容类型(Content Type): 你可以通过 setContentType 方法设置响应的内容类型,告诉浏览器如何解释响应内容。

    vbscript 复制代码
    response.setContentType("text/html");
  2. 设置响应的字符编码(Character Encoding): 通过 setCharacterEncoding 方法,你可以设置响应的字符编码,确保文本内容能够正确显示。

    vbscript 复制代码
    response.setCharacterEncoding("UTF-8");
  3. 设置响应头部信息: 使用 addHeadersetHeader 方法,你可以设置响应头的信息。

    vbscript 复制代码
    response.setHeader("Cache-Control", "no-store");
  4. 重定向: 通过 sendRedirect 方法,你可以将客户端重定向到另一个URL。

    vbscript 复制代码
    response.sendRedirect("/new-location");
  5. 设置状态码: 你可以使用 setStatus 方法设置响应的状态码。

    ini 复制代码
    response.setStatus(HttpServletResponse.SC_OK);
  6. 写入响应内容: 使用 getWriter 方法获取输出流,然后可以使用 printwrite 方法写入响应内容。

    ini 复制代码
    PrintWriter writer = response.getWriter();
    writer.print("Hello, world!");
  7. 设置Cookie: 通过 addCookie 方法,你可以向客户端添加Cookie。

    ini 复制代码
    Cookie cookie = new Cookie("username", "john_doe");
    response.addCookie(cookie);
  8. 设置缓存控制: 通过设置响应头 Cache-Control 控制缓存。

    vbscript 复制代码
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);

以下是一些更高级的用例和相关的代码示例:

  1. 返回JSON数据: 如果你的应用程序提供RESTful服务,你可能需要返回JSON格式的数据。你可以使用 response.getWriter() 来写入JSON字符串。

    vbscript 复制代码
    response.setContentType("application/json");
    PrintWriter writer = response.getWriter();
    writer.print("{ "message": "Hello, world!" }");

    或者使用框架提供的JSON序列化工具:

    ini 复制代码
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(myObject);
    response.setContentType("application/json");
    response.getWriter().write(json);
  2. 设置跨域资源共享(CORS): 如果你的应用提供API,并且可能被跨域请求访问,你可以设置CORS头部以允许跨域访问。

    vbscript 复制代码
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type");
  3. 处理文件下载: 如果你的应用需要提供文件下载功能,你可以设置响应头部并使用 OutputStream 写入文件内容。

    vbscript 复制代码
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename="example.txt"");
    OutputStream outputStream = response.getOutputStream();
    // 写入文件内容
  4. 压缩响应内容: 通过设置响应头部,你可以指示浏览器接受压缩的响应内容。

    arduino 复制代码
    response.setHeader("Content-Encoding", "gzip");
    // 将内容写入 GZIPOutputStream
  5. 处理错误页面: 通过设置错误码和错误页面,你可以自定义错误页面,提供更友好的错误信息。

    vbscript 复制代码
    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found");

    或者使用错误页面配置:

    xml 复制代码
    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>
  6. 使用缓冲区: 通过设置缓冲区,你可以提高响应效率。

    ini 复制代码
    response.setBufferSize(1024);

送给自己和各位的一段话

人一生中会有一次最奇妙的邂逅,然后一生都会留恋地想着它。

我们一起努力向前,满怀期待吧,晚安!

相关推荐
安的列斯凯奇14 分钟前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
架构文摘JGWZ43 分钟前
FastJson很快,有什么用?
后端·学习
BinaryBardC44 分钟前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆1 小时前
Haskell语言的正则表达式
开发语言·后端·golang
专职4 小时前
spring boot中实现手动分页
java·spring boot·后端
Ciderw4 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·
m0_748246355 小时前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
m0_748230445 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔5 小时前
Java面试题2025-Mysql
java·spring boot·后端
C++小厨神5 小时前
C#语言的学习路线
开发语言·后端·golang