Request和Response的概述
Request是请求对象,Response是响应对象,这两个对象主要出现和使用在,servlet的service函数中
request是获取,请求数据
浏览器会发送HTTP请求到后台服务器[Tomcat]
HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
response是设置,响应数据
业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
把响应数据封装到response对象中
后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
浏览器最终解析结果,把内容展示在浏览器给用户浏览
Request
Request的继承体系
Request继承体系主要分为三部分:ServletRequest,HttpServletRequest,RequestFacade
ServletRequest是Java提供的根接口,HttpServletRequest是Java对Http封装协议提供的接口,RequestFacade是Web服务器[Tomcat]对接口的实现类
在这其中ServletRequest和HttpServletRequest两个类都是Java提供的接口类都无法进行了类的实现,那么类的实现就完全交给了Web服务器,类似于Tomcat这种
Request获取请求数据
HTTP请求主要包括请求行,请求头,请求体三部分,所以我们需要学习如何获取这三部分
请求行:
请求头:
对于请求头的数据是按照key:value的形式来获取,我们一般是根据key来找到value的值,根据请求头的key获得value的值的方法为
请求体:
浏览器在发送GET请求的时候是没有请求体的,所以我们需要转为Post的请求方式,对于请求体中的数据,Request提供了两种方法来进行读取其中的数据分别是:获取字节输入流,获取字符输入流
获取请求参数的通用方式
所以我们有必要来找到一个通用的方法来获取请求参数
其中又存在sout语句的重复使用,所以我们可以在doPost中直接调用doGet方式来进行获取请求参数,当然,也可以在doGet中调用doPost,在doPost中完成参数的获取和打印,另外需要注意的是,doGet和doPost方法都必须存在,不能删除任意一个。
主要有两种解决方案
其中可以根据需要的值的数量来选择不同的方法
Request传输中出现的中文乱码问题
在Request传输中出现中文乱码的主要问题是浏览器在传输数据时会利用utf-8进行URL编码,而tomcat利用ios进行解码,因此就会出现了中文乱码的问题
Post的解决方案
GET的解决方案
(1)浏览器通过HTTP协议发送请求和数据给后台服务器(Tomcat)
(2)浏览器在发送HTTP的过程中会对中文数据进行URL==编码==
(3)在进行URL编码的时候会采用页面<meta>
标签指定的UTF-8的方式进行编码,张三
编码后的结果为%E5%BC%A0%E4%B8%89
(4)后台服务器(Tomcat)接收到%E5%BC%A0%E4%B8%89
后会默认按照ISO-8859-1
进行URL==解码==
(5)由于前后编码与解码采用的格式不一样,就会导致后台获取到的数据为乱码。
Request的请求转发
Request的请求转发是一种在服务器内部进行资源跳转的方式
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A处理完请求后将请求发给资源B
(3)资源B处理完后将结果响应给浏览器
(4)请求从资源A到资源B的过程就叫==请求转发==
请求转发之间的共享资源
Response
Response:使用response对象来==设置==响应数据
Response的继承体系
Response的继承体系和Request的继承体系类似,如图
Response进行响应数据
HTTP响应数据总共分为三部分内容,分别是:响应行、响应头、响应体
响应行:
响应头:
响应体:
Response请求重定向
Response请求重定向也是另一种资源跳转方式
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫==重定向==
重定向的实现方式:
由于setStatus方法和SetHeader方法具有相似性,所以可以进行简化的编写方式
重定向的特点
重定向和请求转发的区别
路径问题
Response相应字符数据
Response相应字符数据
在这其中进行字节拷贝时的代码会有很多繁杂的部分,apche公司提供了一个方法可以简化书写
用户登录案例
用户注册案例