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

Request Response

简介

Request(请求) & Response(响应)

浏览器会向服务器发送请求数据,服务器也需要返回响应数据给浏览器,因此我们需要设置对应的类来代表请求数据和响应数据,且Servlet中的service方法就需要对应的请求数据和响应数据的参数

Request:存放请求数据,可以通过request对象来获取请求数据

Response:存放响应数据,可以通过response对象设置响应数据

Resquest

Request继承体系

1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中

2.Tomcat的实现类实现至HttpServletRequest接口,因此使用resquest对象时,可以查阅JavaEE API文档的HttpServletRequest接口

Resquest获取请求数据

获取请求数据

请求数据分为3部分:

1.请求行:

注:getRequestURL()返回的参数为StringBuffer类型,其他方法返回的参数均为String类型

2.请求头

该方法可以通过请求头的名称来得到对应的值

3.请求体

这两个方法分别会返回字节输入流和字符输入流,通过返回的输入流即可读取请求体

若请求体中为字符串信息,则使用字符输入流即可

若请求体中包含图片等信息,则需要使用字节输入流

通用方式获取请求参数

Request在得到请求数据后,会自动解析请求参数,如图,先将参数分离,再将名称和值分离,最后封装到Map集合中,且由于名称可能会重复,即键可能会重复,因此值为数组类型

Request对象提供相应的方法来得到请求参数

idea更改Servlet模板

在使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:

在idea中,当jar包中包含Servlet后,创建类时可以直接创建Servlet类,会自动继承相应的类,并且重写方法,但默认模板中方法中不包含任何内容,路径格式也和图片不同,因此可以更改模板的样式

方法如下:

请求参数中文乱码处理

请求参数中包含中文时会乱码

POST

POST获取请求参数时会获取一个字符输入流,并通过流来读取数据,而Tomcat默认该流的编码不是UTF-8,因此会出现中文乱码现象,更改默认流的编码即可

GET

乱码原因:

浏览器在得到中文数据后会使用UTF-8来对其进行URL编码,但Tomcat的解码为ISO_8859_1,且没有提供更改方式,因此导致乱码

解决方案:

可以将得到的乱码的数据编码成字节数组,在对字节数组进行解码

注:

1.图中使用的是编码方式的常量,有自动提示,也可以直接使用字符串来表示对应的编码方式

2.这个方法是通用方法,也适用POST

Tomcat 8.0 之后已经将GET请求乱码的问题解决,设置默认的解码方式为UTF-8

请求转发

请求转发(forward):一种在服务器内部的资源跳转方式

实现方式

该代码中只有资源B的路径需要修改

请求转发资源间共享数据

我们可以将一些数据通过Request对象从一个资源带到另一个资源

以上三个Request对象的方法,分别代表

将数据储存到request域中(需要提供一个字符串类型的键,和任意类型的值)

从request域中得到值(需要提供键名)

从request域中删除键值对(需要提供键名)

请求转发特点

1.浏览器地址栏路径不发生变化

2.只能转发到当前服务器的内部资源

3.一次请求,可以在转发的资源间使用request共享数据

Response

Response继承体系

Response设置响应数据

响应数据分为3部分:

1.响应行

2.响应头

3.响应体

Response完成重定向

重定向

重定向(Redirect):一种资源跳转方式

如图,浏览器向资源A发送请求,资源A向浏览器响应,告知需要重定向以及资源B的路径,浏览器再次向资源B发送请求

实现方式

如图,需要设置状态码为302来告知浏览器需要重定向,以及需要响应头中设置重定向的资源路径

可以简化成一行代码

重定向特点

1.浏览器地址路径发生变化(两次请求均由浏览器发出,地址为访问资源A,在访问后地址会变为资源B)

2.可以重定向到任意位置的资源(服务器内部、外部均可)

3.两次请求,不能在多个资源使用request共享数据

资源路径问题

在进行请求转发和重定向时,对应的资源B的路径一个需要加虚拟目录,一个不需要

标准:明确路径是谁在使用

浏览器使用:需要加虚拟目录(项目访问路径)

服务端使用:不需要加虚拟目录

例:

如图,分别为

超链接:由浏览器访问,加虚拟目录

表单:由浏览器发送,加虚拟目录

请求转发:在服务端内部使用,不加虚拟目录

重定向:由浏览器访问,加虚拟目录

由于可以在pom.xml中使用<configuration>下的<path>标签来修改虚拟路径的地址,因此在使用虚拟路径时,可以动态的获取虚拟目录,来降低代码的耦合性

响应字符数据

使用

1.通过Response对象获取字符输出流

2.写数据

注意事项

1.响应数据时可以响应标签,如:

在相应时会将“aaa”设置成标题1的形式

但是默认浏览器会将标签当作字符串来识别,因此需要设置对应的响应头,如图

该代码设置了响应头,届时浏览器会以html的解析引擎来解析响应数据

2.中文乱码

由于tomcat通过Response获取的字符输出流默认编码为:ISO-8859-1,因此输出中文时会乱码,可以通过下述方法解决

response.setContentType("text/html;charset=utf-8");

该方法可以同时设置响应头和流的编码,即该行代码可以同时解决识别标签和中文乱码的问题

3.得到的字符输出流不需要关闭,在响应结束后,response对象销毁,该流会随之关闭

响应字节数据

使用

1.通过response对象获取字节输出流

2.写数据

IOUtils工具类使用

可以通过该工具类快速完成复制等操作

1.导入坐标

2.使用

http://www.lryc.cn/news/326313.html

相关文章:

  • How to convert .py to .ipynb in Ubuntu 22.04
  • 【prometheus-operator】k8s监控集群外redis
  • MySQL索引(图文并茂)
  • Redis 教程系列之Redis PHP 使用 Redis(十二)
  • JavaScript语法和数据类型
  • 解决华为云服务器宝塔面板无法访问显示“此站点的连接不安全”问题
  • 【Python】 Python脚本实现某平台视频流下载
  • LangChain核心模块 Model I/O——Prompts
  • 关于Docker守护程序未运行导致的错误
  • Unity中关于SendMessage方法
  • C++ 修饰符类型
  • 生产计划数据模型,实现能源企业数字化高效管理
  • 【chemistry 2】蛋白质的共价结构
  • 什么是 UI ?设计师为你解答
  • pytest框架入门及环境配置
  • unity 2d范围检测:怪物检测范围
  • 外包干了10天,技术倒退明显
  • 后端常问面经之Java基础
  • I.MX6ULL_Linux_驱动篇(58)linux IIO驱动
  • 两个包装类型变量的比较问题
  • Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器
  • js 在for循环中有setTimeout 时,不执行等待,解决方法
  • 机械硬盘与固态硬盘的区别
  • Springboot总结
  • P8623 [蓝桥杯 2015 省 B] 移动距离 Python
  • 【Python】学习率调整策略详解和示例
  • 【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解
  • UE5学习日记——蓝图节点前缀关键字整理
  • 浅析机器学习的常用方法
  • 大数据开发(日志离线分析项目)