当前位置: 首页 > news >正文

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&#xff08;请求&#xff09; 1.作用 2.继承体系 3.获取请求数据 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体&#xff08;POST&#xff09; &#xff08;5&#xff09;Request通用方式获取请求…...

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录&#xff0c;可以长久保存你的数据加入现有群组或者创建自己的群组&#xff0c;来和大家交流和任意人私聊&#xff0c;并添…...

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…...

几何工具的使用

Geometry - Creation 创建几何 CogCreateCircleTool&#xff1a;创建圆CogCreateEllipseTool:创建椭圆CogCreateLineBisectPointsTool&#xff1a;带有两个点的平行线CogCreateLineParallelTool:在某一点创建某条线的平行线CogCreateLinePerpendicularTool:在某一点创建某条线…...

sudo command not found

文章目录 一句话Intro其他操作 一句话 sudo 某命令 改成 sudo -i 某命令 试试。 -i 会把当前用户的环境变量带过去&#xff0c;这样在sudo的时候&#xff0c;有更高的权限&#xff0c;有本用户的环境变量(下的程序命令)。 -i, --login run login shell as the target user; a …...

1.【Labview白话系列】Labview数组精讲

题主经过写文章一段时间的发现&#xff0c;许多同学对该软件的理解和编程能力是不太一样的&#xff0c;有些知识相对一些同学较为简单&#xff0c;但是有些同学提问就比较困难。那么针对这个问题&#xff0c;题主打算出一期说白话系列的专栏&#xff0c;在该栏目中用最通俗的大…...

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割&#xff0c;提取出其中的单词。 在antlr4中&#xff0c;词法规则的名称的首字母需要大写&#xff0c;右侧必须是终结符&#xff0c;通常将词法…...

OpenCV实现目标追踪

目录 准备工作 语言&#xff1a; 软件包&#xff1a; 效果演示 代码解读 &#xff08;1&#xff09;导入OpenCV库 &#xff08;2&#xff09;使用 cv2.VideoCapture 打开指定路径的视频文件 &#xff08;3&#xff09;使用 vid.read() 读取视频的第一帧&#xff0c;ret…...

【剑指offer--C/C++】JZ6 从尾到头打印链表

一、题目 二、本人思路及代码 直接在链表里进行翻转不太方便操作&#xff0c;但是数组就可以通过下标进行操作&#xff0c;于是&#xff0c; 思路1、 先遍历链表&#xff0c;以此存到vector中&#xff0c;然后再从后往前遍历这vector,存入到一个新的vector&#xff0c;就完成…...

算法-买卖股票的最佳时机

1、题目来源 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖…...

【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints

《Flink SQL 语法篇》系列&#xff0c;共包含以下 10 篇文章&#xff1a; Flink SQL 语法篇&#xff08;一&#xff09;&#xff1a;CREATEFlink SQL 语法篇&#xff08;二&#xff09;&#xff1a;WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇&#xff08;三&…...

Java中List接口常见的实现类

目录 ArrayList实现类 数据存储 构造器 成员方法&#xff1a;CRUD Vector实现类 数据存储 构造器方法 成员方法 LinkedList实现类 数据存储 构造器方法 成员方法CRUD List总结 ArrayList&#xff1a;数组实现&#xff0c;随机访问速度快&#xff0c;增删慢&#x…...

SPI通信

SPI通信&#xff1a; 四根通信线&#xff1a;SCK,MOSI,MISO,SS&#xff08;从机选择线&#xff09; 同步时钟&#xff0c;全双工 支持总线挂载多个设备&#xff0c;一主多从 SPI相对IIC传输更快&#xff0c;最简单&#xff0c;最快速 SPI没有接收和应答机制&#xff0c;发送就发…...

【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 数论 区间合并 LeetCode3041. 修改数组后最大化数组中的连续元素数目 给你一个下标从 0 开始只包含 正 整数的数组 nums 。 一开始&#xff0c;你可以将数组中 任意数量 元素增加 至多 1 。 修改后&#xff0c;你可以从…...

字节后端实习 一面凉经

心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊&#xff0c;求捞&#xff5e;&#xff08;boss小公司也不理我&#xff09; 很纠结要不要干脆直接面暑期实习&#xff0c;又怕因为没有后端实习经历&#xff0c;面不到大厂实习。死锁了...

倒计时37天

复习1001. 马走日问题: 1.P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //日常碎碎念&#xff1a;谁懂啊&#xff0c;dev突然不能用了&#xff0c;也不知道是哪里出了问题下了五六次都不能用&#xff0c;&#xff0c;&#xff0c;找远程安…...

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…...

测试入门篇

测试: 这里写目录标题 测试:基础概念:BUG:创建一个合理的bug:bug 的级别:跟开发争执如何解决: 测试用例:编写测试用例的万能公式:案例: 登录功能的测试:设计测试用例的方法: 进阶篇(主要介绍测试方法):自动化测试:自动化测试的分类:selenium( web 自动化测试工具 )环境部署:什么…...

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…...

[数据结构]OJ用队列实现栈

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构&#xff0c…...

开源像素艺术大模型教程:Pixel Dream Workshop Windows/Mac双平台部署

开源像素艺术大模型教程&#xff1a;Pixel Dream Workshop Windows/Mac双平台部署 1. 像素幻梦创意工坊简介 Pixel Dream Workshop&#xff08;像素幻梦创意工坊&#xff09;是一款基于FLUX.1-dev扩散模型的像素艺术生成工具。它采用独特的16-bit像素风格界面设计&#xff0c…...

Gradio项目快速公网演示:除了share=True,你还有这几种轻量级内网穿透方案

Gradio项目快速公网演示&#xff1a;5种轻量级内网穿透方案横向评测 当你开发了一个酷炫的机器学习模型演示&#xff0c;或是精心设计的数据可视化界面&#xff0c;最迫切的需求往往是如何快速分享给同事或客户。Gradio的shareTrue参数可能是大多数开发者首先想到的方案&#x…...

OpenRGB:统一多品牌设备控制的开源RGB解决方案

OpenRGB&#xff1a;统一多品牌设备控制的开源RGB解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Releases can …...

RT-Thread Nano 3.0.3移植STM32F103后,第一个实战:用FinSH组件实现串口命令行调试

RT-Thread Nano 3.0.3移植STM32F103实战&#xff1a;FinSH组件实现串口命令行调试 当你成功将RT-Thread Nano移植到STM32F103开发板后&#xff0c;第一个令人兴奋的里程碑就是让系统真正"活"起来——而FinSH组件正是实现这一目标的完美起点。这个内置的命令行交互工具…...

ROS Noetic下大陆ARS408雷达点云数据解析:从CAN原始帧到RVIZ可视化,一个脚本全搞定

ROS Noetic下大陆ARS408雷达点云数据全链路解析与自动化实践 毫米波雷达在自动驾驶、机器人导航等领域扮演着关键角色。大陆ARS408作为一款高性价比的毫米波雷达&#xff0c;其点云数据的获取与可视化是许多开发者需要掌握的核心技能。本文将带您从底层CAN总线通信开始&#xf…...

OpenClaw资源监控方案:Qwen3-32B镜像驱动服务器健康巡检

OpenClaw资源监控方案&#xff1a;Qwen3-32B镜像驱动服务器健康巡检 1. 为什么需要AI驱动的资源监控&#xff1f; 去年我的个人开发服务器连续宕机三次&#xff0c;每次都是因为磁盘写满导致服务崩溃。传统监控工具虽然能发出警报&#xff0c;但往往在问题发生后才会触发&…...

机器人手臂相机 vs 抓手相机:5个关键区别与选型指南(附避坑技巧)

机器人手臂相机 vs 抓手相机&#xff1a;5个关键区别与选型指南&#xff08;附避坑技巧&#xff09; 在工业自动化领域&#xff0c;视觉引导系统如同机器人的"眼睛"&#xff0c;而相机安装位置的选择往往决定了整个系统的精度与可靠性。当工程师面对手臂相机&#xf…...

Spring Boot项目实战:5步搞定sa-token与OAuth2.0的无缝整合(附完整代码)

Spring Boot项目实战&#xff1a;5步搞定sa-token与OAuth2.0的无缝整合&#xff08;附完整代码&#xff09; 在当今微服务架构盛行的时代&#xff0c;认证授权已成为系统设计中不可或缺的一环。对于Java开发者而言&#xff0c;如何在保持代码简洁的同时实现强大的权限控制&…...

保姆级教程:用snntorch在MNIST上训练你的第一个脉冲神经网络(附完整代码)

从零开始&#xff1a;用snntorch构建你的第一个脉冲神经网络手记 第一次接触脉冲神经网络&#xff08;SNN&#xff09;时&#xff0c;我被它模拟生物神经元放电的特性深深吸引。与传统人工神经网络不同&#xff0c;SNN通过离散的脉冲信号传递信息&#xff0c;更接近人脑的工作机…...

Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本

Realistic Vision V5.1 虚拟摄影棚实战&#xff1a;利用GitHub管理自定义模型与脚本 你是不是也遇到过这样的烦恼&#xff1f;好不容易在本地电脑上&#xff0c;用Realistic Vision V5.1模型调出了一套完美的参数组合&#xff0c;生成的人像照片质感堪比专业影棚。结果换台电脑…...