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

送给自己和各位的一段话

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

J-Flash工具的使用---擦除、烧录及校验

文章目录 前言一、打开J-Flash工具二、使用步骤1.创建工程&#xff0c;选择MCU&#xff0c;配置端口2.打开要烧录的文件3.连接J-Link4.擦除Flash5. 烧录固件 总结 前言 不使用IDE&#xff08;如keil、Iar&#xff09;如何来烧录固件。当我们的程序需要保密&#xff0c;不需要被…

YOLOv8改进 | 2023 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;该代码目前还未开源&#xff0c;我根据论文内容进行了复现内容在文章末尾。 一、本文介绍 本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块&#xff0c;主要针对的是小目标检测&#xff0c…

Vite 了解

1、vite 与 create-vite 的区别 2、vite 解决的部分问题 3、vite配置文件的细节 3.1、vite语法提示配置 3.2、环境的处理 3.3、环境变量 上图补充 使用 3.4、vite 识别&#xff0c;vue文件的原理 简单概括就是&#xff0c;我们在运行 npm润dev 的时候&#xff0c;vite 会搭起…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

EMA训练微调

就是取前几个epoch的weight的平均值&#xff0c;可以缓解微调时的灾难性遗忘&#xff08;因为新数据引导&#xff0c;模型权重逐渐&#xff0c;偏离训练时学到的数据分布&#xff0c;忘记之前学好的先验知识&#xff09; class EMA():def __init__(self, model, decay):self.…

RabbitMQ消息模型之Sample

Hello World Hello World是官网给出的第一个模型&#xff0c;使用的交换机类型是直连direct&#xff0c;也是默认的交换机类型。 在上图的模型中&#xff0c;有以下概念&#xff1a; P&#xff1a;生产者&#xff0c;也就是要发送消息的程序C&#xff1a;消费者&#xff1a;消…

机器学习:领域自适应学习

训练一个分类器是小问题 上难度 训练数据和测试数据不一致&#xff0c;比如训练数据是黑白的&#xff0c;测试时彩色的&#xff0c;结果准确率非常低。 训练数据和测试数据有点差距的时候&#xff0c;能不能效果也能好呢&#xff1f;这就用到了领域自使用domain adptation 用一…

Windows 11的新功能不适用于所有人,但对将要使用的人来说非常酷

正如一个新的预览版本所示&#xff0c;Windows 11即将为那些使用手写笔的人添加一些智能功能&#xff0c;以及其他改进。 这是预览版22635.2776&#xff08;也称为KB5032292&#xff09;&#xff0c;已推出Beta频道&#xff0c;这是发布预览版之前的最后一个测试方法&#xff…

速速报名!请查收 2023 龙蜥操作系统大会超全指南

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是大家的老朋友小龙&#xff01;自 2023 龙蜥操作系统大会宣布启动以来&#xff0c;小龙收到了来自四面八方的诸多期待和小心心。首届龙蜥大会正如火如荼地进行中&#xff0c;为表示对关注社区的每一位小伙伴由衷的感谢&#xf…

Ubuntu安装ssh

Ubuntu安装ssh服务器 一、ssh ssh&#xff1a;安全外壳协议(secure shell)的缩写&#xff0c;安全外壳协议&#xff08;安全的shell&#xff09;&#xff0c;是一个计算机网络协议&#xff08;默认端口号为22&#xff09;。通过ssh协议可以在客户端安全&#xff08;提供身份认…

k8s中Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet&#xff08;简写rs&#xff09; 1.简介 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;rs较完整参数解释 2.创建和删除 &#xff08;1&#xff09;创建 &#xff08;2&#xff09;删除 3.扩容和缩容 &#xff08…

【Java SE】带你在String类世界中遨游!!!

&#x1f339;&#x1f339;&#x1f339;我的主页&#x1f339;&#x1f339;&#x1f339; &#x1f339;&#x1f339;&#x1f339;【Java SE 专栏】&#x1f339;&#x1f339;&#x1f339; &#x1f339;&#x1f339;&#x1f339;上一篇文章&#xff1a;带你走近Java的…

【C 语言经典100例】C 练习实例9

题目&#xff1a;要求输出国际象棋棋盘。 程序分析&#xff1a;国际象棋棋盘由64个黑白相间的格子组成&#xff0c;分为8行*8列。用i控制行&#xff0c;j来控制列&#xff0c;根据ij的和的变化来控制输出黑方格&#xff0c;还是白方格。 #include<stdio.h>int main() {…

从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升

作者&#xff1a;观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下&#xff0c;越来越多的企业开始将业务迁移到云端&#xff0c;传统的监控和故障排查方法已经无法满足企业的需求。在可观测理念逐渐深入人心的当下&#xff0c;人们越来越意识到通过多层次、…

YOLOv5小目标检测层

目录 一、原理 二、yaml配置文件 一、原理 小目标检测层,就是增加一个检测头,增加一层锚框,用来检测输入图像中像素较小的目标 二、yaml配置文件 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 3 # number of classes depth_multiple: 0.33 # model…

案例,linux环境下OpenCV+Java,实现证件照在线更换背景色

先看效果&#xff08;图片来自网络&#xff0c;如有侵权&#xff0c;请联系作者删除&#xff09; 主要是通过java实现的&#xff0c;linux环境编译安装opencv及证件照背景色更换的核心算法在前面一篇文章中有写到。 目前算法还有瞎呲&#xff0c;当照片光线不均的时候会出现误…

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站

在 11 月 6 日&#xff0c;万众期待的 OpenAI DevDay&#xff0c;ChatGPT 发布了一系列新的产品&#xff0c;其中推出了 GPT4 Turbo&#xff0c;并且将GPT4 Vision&#xff0c;DELLE3 等等能力全部集合到一起&#xff0c;不需要再分开使用&#xff0c;原来的局限的文本聊天也进…

创业公司or大厂怎么选?不是凡尔赛,一个技巧让你涨薪10W!

最近总有一些特别“凡尔赛”的发几个 offer 问我选择哪个&#xff1f;其中比较典型的一个问题就是&#xff1a; “一个是处于上升期的创业型公司 &#xff0c;一个行业大厂&#xff0c;薪资待遇差不多&#xff0c;到底该如何进行选择和取舍呢&#xff1f;“ 这个问题不是个别…

Spring---对象的存储和读取

文章目录 Spring对象的存储创建Bean对象将Bean对象存储到spring中添加配置文件存储Bean对象 Spring对象的读取得到Spring上下文对象从Spring中取出Bean对象使用Bean对象 Spring对象的存储 创建Bean对象 Bean对象其实就是一个普通的Java对象。我们按照创建Java对象的方式来创建…

48个代码大模型汇总,涵盖原始、改进、专用、微调4大类

代码大模型具有强大的表达能力和复杂性&#xff0c;可以处理各种自然语言任务&#xff0c;包括文本分类、问答、对话等。这些模型通常基于深度学习架构&#xff0c;如Transformer&#xff0c;并使用预训练目标&#xff08;如语言建模&#xff09;进行训练。 在对大量代码数据的…