对于 ` 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.mzph.cn/news/181973.shtml

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

相关文章

RHCSA---基本命令使用

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 Linux中终端中的很多操作都是通过命令行实现的&#xff0c;最常用的输入命令的方法有以下两种。 (1).打开自带的终端&#xff0c;类似于Windows中的CMD (2).ssh远程连接&#xff0c;关于…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

如何使用群晖Synology Office结合内网穿透实现多人远程编辑文件协同办公

使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件 文章目录 使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制…

创纪云助力客服系统:通过API和无代码开发实现与电商平台的智能集成

无缝连接电商和客服系统&#xff1a;管家婆的无代码开发解决方案 在电子商务和客户服务日新月异的发展中&#xff0c;企业面临着如何提高效率和客户满意度的挑战。江苏创纪云网络科技有限公司&#xff08;INNOVATION ERA&#xff09;推出了一款无需API开发的解决方案&#xff…

Springboot的excel导出

这里导出excel用到的是 阿里巴巴的easyexcel 1、首先导入依赖 <!--alibaba easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version> </dependency> 2、…

一切为了应用!九章云极DataCanvas大模型系列成果重磅发布!

11月21日&#xff0c;「筑基赋能 智向未来」九章云极DataCanvas大模型系列成果发布会&#xff08;以下简称“发布会”&#xff09;在北京重磅召开&#xff0c;本次成果发布距离今年6月30日DataCanvas Alaya九章元识大模型公布仅4个多月&#xff0c;是九章云极DataCanvas公司大模…

如何快速上手一个自己不太熟悉的新项目?

一.熟悉新项目的步骤 第一步:了解业务 技术本身就是为了业务而服务&#xff0c;只有首先搞清楚了业务之后才真正算是步入了这个项目的大门。因此&#xff0c;要先搞清新项目&#xff1a; 是做什么的&#xff1f; 主要面向什么人群使用&#xff1f;主要提供了哪些功能&#x…

如何使用电脑添加便签,便签怎么显示桌面?

电脑便签在日常办公及生活中的应用是比较广泛的&#xff0c;通过电脑便签大家可以将一些工作计划安排的妥妥当当&#xff0c;可以将生活中比较重要的节日、重要的备忘事项统统记录下来&#xff0c;便于及时提醒或者做统筹安排。 电脑上可以使用的便签类工具也比较多&#xff0…

3DMAX二维图片对象摆放插件安装使用方法

3DMAX二维图片对象摆放插件使用教程 3DMAX二维图片对象摆放插件自动对齐相机&#xff0c;可以有效地自动将简单的2D PNG图像添加到3dMax场景中。使用3DMAX二维图片对象摆放插件&#xff0c;你可以使用一次渲染来渲染具有正确阴影的快速预览和最终图像&#xff0c;而无需稍后合成…

leetcode:414. 第三大的数

一、题目 函数原型&#xff1a;int thirdMax(int* nums, int numsSize) 二、思路 将数组降序排序。 如果数组元素个数小于3&#xff0c;直接返回第一个元素&#xff1b; 如果数组元素个数大于等于3&#xff0c;且不同元素个数小于3&#xff0c;直接返回第一个元素&#xff1b; …

李峋同款的C语言动态爱心代码来了,彩色闪动,附源码

1.前言 最近一部电视剧《点燃我&#xff0c;温暖你》可火啦&#xff0c;大家纷纷在搞男主阿瑟的同款爱心代码&#xff0c;但是虽然网上有它的源码&#xff0c;但都不是 C 语言的&#xff0c;看不懂。我看了一下这个视频&#xff0c;大致分析了一下它的运行过程。用语言描述一下…

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…

系列八、编程式事务

一、概述 编程式事务是指程序员手动的在业务代码中控制事务执行的流程&#xff0c;业务方法正常执行提交事务&#xff0c;业务方法执行过程中出现异常则回滚事务。 二、编程式事务环境搭建 2.1、项目概览 2.2、pom.xml <dependencies><!--spring基本依赖--><d…

被DDoS攻击了怎么办?为什么要选择高防ip?

在当今互联网高度发达的时代&#xff0c;许多企业都依赖于网络来开展业务、推广产品、提供服务。然而&#xff0c;网络攻击&#xff0c;尤其是分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;已经成为一种日益严重的威胁。面对这种攻击&#xff0c;如何保护您的业…

电脑微信多开怎么操作?电脑微信多开bat代码

电脑微信多开怎么操作&#xff1f; 方法一&#xff1a;电脑微信多开bat代码方法二 微信是我们日常使用率很高的社交软件&#xff0c;在工作中因工作需要可能会用到两个微信号&#xff0c;如果是只登录一个微信&#xff0c;另外一个微信的聊天信息很容易漏看&#xff0c;这时候微…

【同一局域网下】两台电脑之间互ping

两台电脑互ping 首先需要连接同一网咯关闭需要ping的电脑的防火墙 关闭防火墙步骤&#xff08;以win11系统为例&#xff09;&#xff1a; 设置 --> 隐私和安全性 --> Windows 安全中心 打开Windows安全中心 防火墙和网络保护 --> 选择正在使用的网络 关闭 ping其他…

嵌入式LCD软件驱动流程与调试

前言 LCD屏在嵌入式中是应用比较广泛的&#xff0c;很多电子产品都是需要用到它来进行人机交互&#xff0c;那么工作中我们就少不了要对lcd进行软件驱动和调试。调试LCD需要掌握的学问有很多&#xff0c;没有一定的调试经验就很难对问题进行分析并解决。 博文推荐 LCD屏接口与…

shell脚本完成内容筛选并下载

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Linux:虚拟机安装Ubuntu系统

一、下载Ubuntu 地址&#xff1a;https://cn.ubuntu.com/download/desktop 二、安装 以上配置完成后&#xff0c;点击完成按钮&#xff0c;接下来就是一段较长时间的等待安装过程。 安装完成后&#xff0c;还有一些系统性配置。 系统配置非常简单&#xff0c;全部next即可。…

使用Typecho搭建个人博客网站,并内网穿透实现公网访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …