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

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

在这里插入图片描述

问题引入

@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 方法,你可以获取请求中的参数值。

    String username = request.getParameter("username");
    

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

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

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

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

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

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

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

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

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

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

    String remoteAddr = request.getRemoteAddr();
    int remotePort = request.getRemotePort();
    

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

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

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

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

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

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

    RequestDispatcher dispatcher = request.getRequestDispatcher("/anotherServlet");
    dispatcher.forward(request, response);
    

    或者使用 include 方法:

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

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

    String protocol = request.getProtocol();
    String scheme = request.getScheme();
    String serverName = request.getServerName();
    

HttpServletResponse 详解

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

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

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

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

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

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

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

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

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

    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字符串。

    response.setContentType("application/json");
    PrintWriter writer = response.getWriter();
    writer.print("{ \"message\": \"Hello, world!\" }");
    

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

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

    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 写入文件内容。

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

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

    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found");
    

    或者使用错误页面配置:

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

    response.setBufferSize(1024);
    

送给自己和各位的一段话

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

努力向前,满怀期待吧,各位晚安!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用&#xff0c;并理解缓冲区中的数据处理模型&#xff0c;掌握Channel的作用&#xff0c;并结合缓冲区实现数据I/O操作&#xff0c;理解文件锁的作用&#xff0c;并且掌握字符编码处理支持类的使用&#xff0c;掌握Reactor设计模型&#xff0…

2023.11.25 python常用数据集信息查看命令

2023.11.25 python常用数据集信息查看命令 在对数据集进行处理前一般需要对数据集先进行一个基本的观察&#xff0c;根据观察结果和经验确定处理方式。以kaggle员工离职数据集为例进行操作。 打印前5条数据 # 导入包 import pandas as pd# 读入数据 df pd.read_csv(HR_comm…

国标GB28181协议/RTSP视频监控汇聚平台EasyCVR(V.3.4)页面UI大更新

为提高用户体验&#xff0c;增强平台功能&#xff0c;旭帆科技的Easy系列平台也在不断优化更新中。在最新的EasyCVR&#xff08;V.3.4&#xff09;中&#xff0c;其最显著的区别即为首页UI的调整。 其亮点是在【配置中心】-【基础配置】-【展示信息】中&#xff0c;首页UI可分…

外贸自建站比独立站好吗?海洋建站怎么做?

外贸自建站和独立站的区别&#xff1f;如何选择海洋建站的方式&#xff1f; 对于外贸企业而言&#xff0c;选择在互联网上展示自己的产品和服务是至关重要的一步。然而&#xff0c;在这个过程中&#xff0c;外贸自建站和独立站两者之间存在着一些值得深思的差异。海洋建站来探…

杂记 | 使用Docker安装并配置MongoDB以支持事务(单副本,并解决了证书文件错误的问题)

文章目录 00 安装前的准备01 创建Docker Compose文件02 设置证书文件03 启动MongoDB04 初始化副本集和创建用户05 验证安装 00 安装前的准备 在开始之前&#xff0c;确保已经安装了Docker&#xff0c;本文基于Docker Compose进行示范&#xff0c;没有装Docker Compose也可将其…

elFinder ZIP 参数注入导致命令注入 (CVE-2021-32682)

漏洞描述 elFinder 是一个用于 Web 的开源文件管理器&#xff0c;使用 jQuery UI 用 JavaScript 编写。 在 elFinder 2.1.48 及更早版本中发现一个参数注入漏洞。此漏洞可能允许攻击者在托管 elFinder PHP 连接器的服务器上执行任意命令&#xff0c;即使配置最少也是如此。这…

【Android知识笔记】架构专题(一)

什么是 MVC 其实我们日常开发中的Activity,Fragment和XML界面就相当于是一个MVC的架构模式,但往往Activity中需要处理绑定UI,用户交互,以及数据处理。 这种开发方式的缺点就是业务量复杂的时候一个Activity过于臃肿。但是页面结构不复杂的情况下使用这种方式就会显得很简…

基于Java SSM框架+Vue实现房屋租赁网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现房屋租赁网站演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;房屋租赁系统当然也不能排除在外。房屋租赁系统是以实际运用为开发背景&…

Image Segmentation Using Deep Learning: A Survey

论文标题&#xff1a;Image Segmentation Using Deep Learning:A Survey作者&#xff1a;发表日期&#xff1a;阅读日期 &#xff1a;研究背景&#xff1a;scene understanding,medical image analysis, robotic perception, video surveillance, augmented reality, and image…

CATIA CAA 编译报错 提示 error LNK2019 无法解析的外部符号 public cdecl

CATIA CAA 编译报错 提示 error LNK2019 无法解析的外部符号 public cdecl 项目架构如图所示&#xff1a;一个FrameWork下有两个Module&#xff0c;分别是DFMProcessCheckMdl.m和ProcessCheckUtilMdl.m 我需要在DFMProcessCheckMdl.m模块调用ProcessCheckUtilMdl.m模块的一个自…

numpy知识库:np.random.randint()用法及其使用场景举例

randint函数解析 import numpy as np# 【随机】返回[0,5)范围内的一个整数 # [0, 5) --> 左闭右开区间 int_a np.random.randint(5) # int_a 可能为 0、1、2、3、4 int_a np.random.randint(low5) # int_a 可能为 0、1、2、3、4# 【随机】返回[1,5)范围内的一个整数 int_…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互&#xff0c;这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP&#xff0c;但是找到的一些方法都不是很适用&#xff0c;尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互&#xff0c;…