Request
Request继承体系
Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
所以才用到Tomcat定义的实现类
Request获取请求数据
请求数据分为三部分
请求行
请求头
浏览器的版本信息
请求体
Post请求才有请求体
通过流的方式获取
// 1.获取字符输入流
BufferedReader reader = req.getReader();
// 2.读取数据
String line = reader.readLine();
// 3.操作
System.out.println(line);
Request通用方式获取请求参数
使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同
所以在doGet()和doPost()方法中就可以只写一个相同的逻辑处理了
Request事实上是把参数放入了一个map集合中
其中map集合的泛型为 <String,String[]>
Request请求参数中文乱码问题
- 浏览器发出去的请求(request),采用了一套编码格式;
- Tomcat 处理 request,采用了另一套编码格式。
Post请求
因为Post请求采用的是输入流的方式获取 getReader()
当向服务器发送Post请求时,同时携带参数信息username=张三时,与Get请求不同的是,参数不会拼接在请求行中【URL】,而是将参数信息设置在请求体中进行传输。
req.setCharacterEncoding("UTF-8");
Get请求
Get请求中的请求参数会拼接在请求URL中,当URL中存在中文时,浏览器会对请求URL进行编码,其中编码的时候使用的是UTF-8字符集。Tomcat服务器解析请求发送的过来的报文时【参数信息主要是解析请求行的信息】采用的是ISO-8859-1字符集。由于编码时和解码时采用的字符集不一致,所以导致了乱码。
Request请求转发
req.getRequestDispatcher("资源B路径").forward(req,resp); //参数是要转发的资源 例如 /demo3
其中,在资源A和资源B中的请求数据可以被共享
转发的资源路径不需要加虚拟目录
Response
Response继承体系
Response设置响应数据
响应数据分为三部分
响应行
响应头
响应体
Response完成重定向
一种资源跳转方式
简化实现方式
需要加上虚拟目录
resp.sendRedirect("资源B的路径加上虚拟目录");
路径问题
虚拟目录(项目访问路径)
明确路径给谁使用
在服务器内部使用
不需要加虚拟目录
例如请求转发 它是服务器内部把这个请求从一个资源交给另一个资源,所以另一个资源的路径不需要加上虚拟目录
浏览器使用
需要加虚拟目录
例如重定向 它是两次请求,所以需要加上虚拟目录 给浏览器说明向谁请求
动态获取虚拟目录
//获取虚拟目录
String contextPath = req.getContextPath();
//可以在重定向时候用字符串拼接的时候加上
resp.sendRedirect(contextPath+"资源路径");
Response设置响应体数据
响应字符数据
设置响应的数据格式可以解析html文本
resp.setHeader("contene-type","text/html");
设置响应数据不会乱码
resp.setContentType("text/html;charset=utf-8");