JavaWeb04-Request,Response
目录
一、Request(请求)
1.作用
2.继承体系
3.获取请求数据
(1)请求行
(2)请求头
(3)请求体(POST)
(5)Request通用方式获取请求参数
4.Servlet模板
5.中文数据乱码解决
6.请求转发
二、Response(响应)
1.作用
2.继承体系
3.设置响应数据
(1)响应行
(2)响应头
(3)响应体
4.重定向
5.响应字符数据
6.响应字节数据
三、杂项问题
1.路径问题
2.插件推荐
一、Request(请求)
1.作用
获取请求数据
2.继承体系

-  Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中 
-  要使用request对象,可查阅JavaEE API文档的HttpServletRequest接口 
3.获取请求数据
(1)请求行
| 方法名 | 说明 | 
|---|---|
| String getMethod() | 获取请求方式:GET/POST... | 
| String getContextPath() | 动态获取虚拟目录(项目访问路径):/request-demo | 
| StringBuffer getRequestURL() | 动态获取URL(统一资源定位符):http://localhost:8080/request-demo/req1 | 
| String getRequestURl() | 动态获取URI(统一资源标识符): /request-demo/req1 | 
| String getQueryString() | 获取请求参数(GET方式):username=zhangsan&password=123 | 
    //测试网址:http://localhost:8080/tomcat_demo_war/request?username=zhangsan&password=123@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//final String reqMethod = req.getMethod();final String contextPath = req.getContextPath();final StringBuffer requestURL = req.getRequestURL();final String requestURI = req.getRequestURI();//username=zhangsan&password=123final String queryString = req.getQueryString();System.out.println(reqMethod);System.out.println(contextPath);System.out.println(requestURL);System.out.println(requestURI);System.out.println(queryString);}结果:

(2)请求头
| 方法名 | 说明 | 
|---|---|
| String getHeader(String name) | 根据请求头名称获取值 | 
(3)请求体(POST)
| 方法名 | 说明 | 
|---|---|
| ServletInputStream getInputStream() | 获取字节输入流 | 
| BufferedReader getReader() | 获取字符输入流 | 
  <form action="/request02" method="post"><!--确保表单内容有name属性!--><label><input type="text" placeholder="请输入用户名" name="username"><br></label><label><input type="password" placeholder="请输入密码" name="password"><br></label><input type="submit"></form>@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//System.out.println("req对象:" + req);//此流不需要自己手动关闭,在request对象被销毁的时候,该流会自动关闭final BufferedReader reader = req.getReader();final String s = reader.readLine();System.out.println(s);
}(5)Request通用方式获取请求参数
| 方法名 | 说明 | 
|---|---|
| Map< String,String[]> getParameter() | 获取所有参数Map集合 | 
| String[] getParameterValues(String name) | 根据名称获取参数值/数组 | 
| String getParameter(String name) | 根据名称获取参数值(单个值) | 
html
  <form action="/request03" method="get">
<!--确保表单内容有name属性!--><label><input type="text" placeholder="请输入用户名" name="username"><br></label><label><input type="password" placeholder="请输入密码" name="password"><br></label><label><input type="checkbox" name="hobby" value="run"></label>跑<label><input type="checkbox" name="hobby" value="jump"></label>跳<label><input type="checkbox" name="hobby" value="eat"></label>吃<input type="submit"></form>java:
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {final Map<String, String[]> reqParameterMap = req.getParameterMap();reqParameterMap.forEach((k,v) -> {System.out.println(k+":"+ Arrays.toString(v));});
final String[] hobby = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobby));//只会获取数组中的第一个数据final String hobby1 = req.getParameter("hobby");System.out.println(hobby1);}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {final Map<String, String[]> reqParameterMap = req.getParameterMap();reqParameterMap.forEach((k,v) -> {System.out.println(k+":"+ Arrays.toString(v));});
final String[] hobby = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobby));//只会获取数组中的第一个数据final String hobby1 = req.getParameter("hobby");System.out.println(hobby1);}优化重复代码:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {final Map<String, String[]> reqParameterMap = req.getParameterMap();reqParameterMap.forEach((k,v) -> {System.out.println(k+":"+ Arrays.toString(v));});
final String[] hobby = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobby));//只会获取数组中的第一个数据final String hobby1 = req.getParameter("hobby");System.out.println(hobby1);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);
}4.Servlet模板

如果还觉得不够省事,可以修改模板

5.中文数据乱码解决
如果是Tomcat8及以上的版本,恭喜这个问题可以跳过~
预防万一解决方式也写一下


POST:
| 方法名 | 说明 | 
|---|---|
| setCharacterEncoding("UTF-8"); | 设置字符流编码格式 | 
GET:

URL编码
-  将字符串按照编码方式转为二进制 
-  每个字节转为2个16进制数并在前边加上% 

Tomcat默认编码:ISO-8859-1
解决方式:该方法通用
-  将接收数据先转成字节数据 
-  之后再解码变成汉字 
public class UrlDemo {public static void main(String[] args) throws UnsupportedEncodingException {//URL编码//浏览器String s = "张三";final String encode = URLEncoder.encode(s,"utf-8");System.out.println(encode);
//URL解码//Tomcat//Tomcat8以下默认使用的是ISO-8859-1final String decode = URLDecoder.decode(encode, "ISO-8859-1");System.out.println(decode);
//转为字节数据,编码final byte[] bytes = decode.getBytes(StandardCharsets.ISO_8859_1);for (byte aByte : bytes) {System.out.print(aByte+" ");}System.out.println();
//字节数组转字符串,解码final String s1 = new String(bytes, StandardCharsets.UTF_8);System.out.println(s1);}
}6.请求转发
请求转发(forward):一种在服务器内部的资源跳转方式

实现方式:
//写在资源A
req.getRequestDispatcher("资源B路径").forward(req,resp);请求转发资源间共享数据:使用Request对象
| 方法名 | 说明 | 
|---|---|
| void setAttribute(String name, Object o) | 存储数据到 request域中 | 
| Object getAttribute(String name) | 根据 key,获取值 | 
| void removeAttribute(String name) | 根据 key,删除该键值对 | 
特点:
-  浏览器地址栏路径不发生变化 
-  只能转发到当前服务器的内部资源 
-  一次请求,可以在转发的资源间使用request共享数据 
二、Response(响应)
1.作用
设置响应数据
2.继承体系

3.设置响应数据
(1)响应行
| 方法名 | 说明 | 
|---|---|
| void setStatus(int sc) | 设置响应状态码 | 
(2)响应头
| 方法名 | 说明 | 
|---|---|
| void setHeader(String name,String value) | 设置响应头键值对 | 
(3)响应体
| 方法名 | 说明 | 
|---|---|
| PrintWriter getWriter() | 获取字符输出流 | 
| ServletOutputStream getOutputStream() | 获取字节输出流 | 
4.重定向
重定向(Redirect):一种资源跳转方式

System.out.println("resp01");
response.setStatus(302);
//不区分大小写
response.setHeader("Location","/response02");
//简化
response.sendRedirect("/response02");特点:
-  浏览器地址栏路径发生变化 
-  可以重定向到任意位置的资源(服务器内部、外部均可) 
-  两次请求,不能在多个资源使用request共享数据 
5.响应字符数据
//中文乱码解决
//原因:通过Response获取的字符输出流默认编码:ISO-8859-1
response.setContentType("text/html;charset=utf-8");
//解析html标签
response.setHeader("content-type","text/html");
//流不需要手动关闭,随着响应结束,response对象销毁,由服务器关闭
final PrintWriter writer = response.getWriter();
writer.write("测试");
writer.write("ceshi");
writer.write("<h1>测试</h1>");6.响应字节数据
//读取文件
FileInputStream fis = new FileInputStream("D:/新建文件夹 (2)/图片素材/13516761_0_final.png");
//获取response字节输出流
final ServletOutputStream os = response.getOutputStream();
//完成流的copy
final byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1){os.write(buffer,0,length);
}
fis.close();IO工具类:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>//读取文件
FileInputStream fis = new FileInputStream("D:/新建文件夹 (2)/图片素材/13516761_0_final.png");
//获取response字节输出流
final ServletOutputStream os = response.getOutputStream();
IOUtils.copy(fis,os);
三、杂项问题
1.路径问题
浏览器使用:需要加虚拟目录(项目访问路径) 服务端使用:不需要加虚拟目录

动态获取虚拟目录:
final String contextPath = request.getContextPath();
System.out.println(contextPath);
//简化
response.sendRedirect(contextPath + "/response02");2.插件推荐
File Path Autocomplete:

相关文章:
 
JavaWeb04-Request,Response
目录 一、Request(请求) 1.作用 2.继承体系 3.获取请求数据 (1)请求行 (2)请求头 (3)请求体(POST) (5)Request通用方式获取请求…...
 
使用 Docker 部署 Fiora 在线聊天室平台
一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub:https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录,可以长久保存你的数据加入现有群组或者创建自己的群组,来和大家交流和任意人私聊,并添…...
 
Unity Samples和帧动画的问题
拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy,然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因,而且Unity把Samples这个…...
 
几何工具的使用
Geometry - Creation 创建几何 CogCreateCircleTool:创建圆CogCreateEllipseTool:创建椭圆CogCreateLineBisectPointsTool:带有两个点的平行线CogCreateLineParallelTool:在某一点创建某条线的平行线CogCreateLinePerpendicularTool:在某一点创建某条线…...
 
sudo command not found
文章目录 一句话Intro其他操作 一句话 sudo 某命令 改成 sudo -i 某命令 试试。 -i 会把当前用户的环境变量带过去,这样在sudo的时候,有更高的权限,有本用户的环境变量(下的程序命令)。 -i, --login run login shell as the target user; a …...
 
1.【Labview白话系列】Labview数组精讲
题主经过写文章一段时间的发现,许多同学对该软件的理解和编程能力是不太一样的,有些知识相对一些同学较为简单,但是有些同学提问就比较困难。那么针对这个问题,题主打算出一期说白话系列的专栏,在该栏目中用最通俗的大…...
 
ANTLR4规则解析生成器(三):遍历语法分析树
文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割,提取出其中的单词。 在antlr4中,词法规则的名称的首字母需要大写,右侧必须是终结符,通常将词法…...
 
OpenCV实现目标追踪
目录 准备工作 语言: 软件包: 效果演示 代码解读 (1)导入OpenCV库 (2)使用 cv2.VideoCapture 打开指定路径的视频文件 (3)使用 vid.read() 读取视频的第一帧,ret…...
 
【剑指offer--C/C++】JZ6 从尾到头打印链表
一、题目 二、本人思路及代码 直接在链表里进行翻转不太方便操作,但是数组就可以通过下标进行操作,于是, 思路1、 先遍历链表,以此存到vector中,然后再从后往前遍历这vector,存入到一个新的vector,就完成…...
算法-买卖股票的最佳时机
1、题目来源 121. 买卖股票的最佳时机 - 力扣(LeetCode) 2、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖…...
【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints
《Flink SQL 语法篇》系列,共包含以下 10 篇文章: Flink SQL 语法篇(一):CREATEFlink SQL 语法篇(二):WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇(三&…...
Java中List接口常见的实现类
目录 ArrayList实现类 数据存储 构造器 成员方法:CRUD Vector实现类 数据存储 构造器方法 成员方法 LinkedList实现类 数据存储 构造器方法 成员方法CRUD List总结 ArrayList:数组实现,随机访问速度快,增删慢&#x…...
SPI通信
SPI通信: 四根通信线:SCK,MOSI,MISO,SS(从机选择线) 同步时钟,全双工 支持总线挂载多个设备,一主多从 SPI相对IIC传输更快,最简单,最快速 SPI没有接收和应答机制,发送就发…...
 
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 数论 区间合并 LeetCode3041. 修改数组后最大化数组中的连续元素数目 给你一个下标从 0 开始只包含 正 整数的数组 nums 。 一开始,你可以将数组中 任意数量 元素增加 至多 1 。 修改后,你可以从…...
 
字节后端实习 一面凉经
心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊,求捞~(boss小公司也不理我) 很纠结要不要干脆直接面暑期实习,又怕因为没有后端实习经历,面不到大厂实习。死锁了...
倒计时37天
复习1001. 马走日问题: 1.P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //日常碎碎念:谁懂啊,dev突然不能用了,也不知道是哪里出了问题下了五六次都不能用,,,找远程安…...
 
【计算机考研】考408,还是不考408性价比高?
首先综合考虑,如果其他科目并不是很优秀,需要我们花一定的时间去复习,408的性价比就不高,各个科目的时间互相挤压,如果备考时间不充裕,考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…...
 
测试入门篇
测试: 这里写目录标题 测试:基础概念:BUG:创建一个合理的bug:bug 的级别:跟开发争执如何解决: 测试用例:编写测试用例的万能公式:案例: 登录功能的测试:设计测试用例的方法: 进阶篇(主要介绍测试方法):自动化测试:自动化测试的分类:selenium( web 自动化测试工具 )环境部署:什么…...
 
b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取
文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码(1)保存(2)加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…...
 
[数据结构]OJ用队列实现栈
225. 用队列实现栈 - 力扣(LeetCode) 官方题解:https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构,…...
 
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
 
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
 
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
 
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
 
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
 
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
 
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
