对于 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);

送给自己和各位的一段话

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

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

相关推荐
小_太_阳19 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师28 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
搬码后生仔2 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
Lx3523 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小池先生3 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
百罹鸟3 小时前
【vue高频面试题—场景篇】:实现一个实时更新的倒计时组件,如何确保倒计时在页面切换时能够正常暂停和恢复?
vue.js·后端·面试
小蜗牛慢慢爬行4 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
wm10435 小时前
java web springboot
java·spring boot·后端
龙少95436 小时前
【深入理解@EnableCaching】
java·后端·spring