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

news2025/1/22 8:44:04

对于 **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.coloradmin.cn/o/1268687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解Java8新特性-日期时间API之TemporalQuery、TemporalQueries

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概2000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

网络安全 | 使用人工智能阻止网络攻击

全球范围内分布式拒绝服务 (DDoS) 网络攻击急剧增加&#xff0c;这种数字攻击可以通过大量的互联网流量压垮目标服务器&#xff0c;从而使网站瘫痪。这种攻击每年都会发生数百万起&#xff0c;而且数量和规模都在不断增加。大约三分之一的网站宕机是由于 DDoS 攻击所致。 计算…

UVA 108 Maximum Sum

UVA 108 Maximum Sum 题面翻译 给定一个含有正负数的二维数组&#xff0c;找出有最大和的子矩阵。矩阵的和指矩阵中所有元素的和。 一个子矩阵是任意在总矩阵中大小为1x1或更大的邻近子数组&#xff0c;例如在下面的矩阵中: 0 −2 −7 0 9 2 −6 2 −4 1 −4 1 −1 8 0 −…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

搞定这三个问题 伦敦金止损就没问题

笔者多次强调&#xff0c;做伦敦金交易&#xff0c;重要的是风险控制。而止损是我们风险控制中一个很重要的概念。设定好止损&#xff0c;就是风险控制的好开始。下面我们通过三个问题&#xff0c;来解决止损的问题。 问题一&#xff0c;你的止损位在哪里&#xff1f;要做止损&…

python -- python安装

1、python的诞生和发展&#xff1a; python语言是一种解释型、面向对象型、动态数据类型的高级程序设计语言。 2、python的安装&#xff1a; 1、安装解析器&#xff1a; 在安装的过程中需要注意的是&#xff1a; 在安装pycharm的时候也是同样的道理&#xff0c;需要指定安装…

解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效

解决&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效 一问题描述&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效二问题原因&#xff1a;对IDEA的debug功能不熟悉或者理解有偏差三解决…

vs配置64位汇编

vs开发64位程序无法使用内联汇编&#xff0c;需要将汇编放到一个单独文件中编译链接。 步骤如下&#xff1a; 生成汇编代码。以asm.asm为例&#xff0c;以下是模板&#xff1a; ;64位汇编程序模板 (Template) ;声明一个ExitProcess函数 ExitProcess PROTO.data;在这里声明变量…

外汇天眼:外汇市场中的“双向交易”是什么意思?

说到外汇市场&#xff0c;总免不了提到它双向交易的优势&#xff0c;很多新手会对这一点有所疑问&#xff0c;今天我们就帮大家解决这一个疑问。 何谓双向交易&#xff1f; 金融市场上&#xff0c;交易者最常接触到的股票&#xff0c;多属于单向交易。 单向交易的模式便是「先…

如何快速生成项目目录结构树?

经常在网上看到下面这种由一个项目&#xff0c;生成一个结构树&#xff0c;你知道它是怎么生成的吗&#xff1f; 这就是利用本文要介绍的一个工具——Treer&#xff0c;treer就是一款专门用来快速生成目录结构树的命令行工具。 第一步&#xff1a;安装treer 在终端执行全局…

分布式机器学习、联邦学习、多智能体的区别和联系——一文进行详细解释

1 分布式机器学习、联邦学习、多智能体介绍 最近这三个方面的论文都读过&#xff0c;这里写一篇博客归纳一下&#xff0c;以方便搞这几个领域的其他童鞋入门。我们先来介绍以下这三种机器学习范式的基本概念。 1.1 分布式机器学习介绍 分布式机器学习(distributed machine l…

vivado综合分析与收敛技巧3

1、最优化 RAMB 输入逻辑以允许输出寄存器推断 以下 RTL 代码片段可从块 RAM &#xff08; 实际上为 ROM &#xff09; 生成关键路径 &#xff0c; 其中包含多个止于触发器 (FF) 的逻辑层次。 RAMB单元已在无可选输出寄存器 (DOA-0) 的情况下完成推断 &#xff0c; 这给 R…

美颜SDK是什么?美颜SDK对比测评

为了实现实时、高效的美颜效果&#xff0c;开发者们纷纷转向美颜SDK这一技术解决方案。那么&#xff0c;美颜SDK究竟是什么&#xff1f;本文将深入探讨美颜SDK的概念&#xff0c;并通过对比测评不同美颜SDK&#xff0c;为开发者和用户提供更清晰的选择参考。 一、美颜SDK的概念…

高效管理文件方法:根据文件大小智能移动至目标文件夹

在日常的工作中&#xff0c;会遇到大量的文件&#xff0c;从几个KB的小文档到几个GB的大数据文件。如何有效地管理这些文件&#xff0c;以便能够快速找到所需的资料&#xff0c;是一项重要的任务。传统的文件管理方式往往会在大量的文件和文件夹中迷失&#xff0c;而无法快速找…

SAP 第三方销售

SAP 第三方销售 第三方销售是比较常见的业务&#xff0c;&#xff0c;虽然他的一部分属于SD模块&#xff0c;但配置也并不难&#xff0c;一起测试下。 1、流程概述 第三方采购指的是&#xff1a;公司A和客户B签订销售合同&#xff0c;公司在SAP 系统内开销售订单&#xff0c…

temu反洗钱协议在哪里签署

反洗钱是国际社会关注的重要议题之一。为了加强国际合作&#xff0c;各国政府积极参与签署反洗钱协议。TEMU反洗钱协议作为国际间的重要合作框架&#xff0c;其签署地点及其意义备受关注。本文将深入探讨TEMU反洗钱协议的签署地点及其背后的意义。 先给大家推荐一款拼多多/temu…

顶级大厂Quora如何优化数据库性能?

Quora 的流量涉及大量阅读而非写入&#xff0c;一直致力于优化读和数据量而非写。 0 数据库负载的主要部分 读取数据量写入 1 优化读取 1.1 不同类型的读需要不同优化 ① 复杂查询&#xff0c;如连接、聚合等 在查询计数已成为问题的情况下&#xff0c;它们在另一个表中构…

代理模式,dk动态代理,cglib动态代理

目录 一、代理模式1、生活中代理案例2、为什么要使用代理3、代理模式在Java中的应用4、什么是代理模式 二、代理的实现方式1、java中代理图示2、静态代理 三、动态代理1、概述2、JDK动态代理jdk动态代理原理分析 3、Cglib动态代理3.1 基本使用3.2 cglib基本原理 一、代理模式 …

【长文干货】Python可视化教程

文章目录 数据介绍Matplotlib散点图折线图柱形图直方图 Seaborn散点图折线图柱形图直方图 Bokeh散点图折线条形图交互式 Plotly基本组合优化&#xff1a;定制化下拉菜单 总结 数据介绍 在这个小费数据集中&#xff0c;我们记录了20世纪90年代初期餐厅顾客在两个半月内给出的小…

基于SSM框架的图书馆管理系统设计与实现

基于SSM框架的图书馆管理系统 摘要&#xff1a;在21信息时代中&#xff0c;编程技术的日益成熟&#xff0c;计算机已经是普通使用的。编程技术的实现是基于计算机硬件上&#xff0c;计算机科学与技术的进步&#xff0c;让时代发展的更快&#xff0c;更加信息化。人们都是学习如…