一、Request继承体系


1.ServletRequest

        Java提供的请求对象接口

2.HttpServletRequest(★)

        ServletRequest的子接口,是Java提供的对Http协议封装的请求对象接口
【tips】要使用Request对象,只需要查阅API文档中的HttpServletRequest接口。

3.RequestFacade

        由Tomcat定义HttpServletRequest的实现类

二、Request获取请求数据(★)

1.获取请求行数据

String getMethod()
获取请求方式
String getContextPath()
获取虚拟目录(即项目访问路径)
StringBuffer getRequestURL()
获取URL(统一资源定位符)
String getRequestURI()
获取URI(统一资源标识符)
String getQueryString()
获取GET请求方式的请求参数

2.获取请求头数据

String getHeader(String headerName)
根据请求头名称获取值
【tips】请求头是键值对形式,获取请求头的数据类似于根据键获取值

3.获取请求体数据

        使用IO流的方式获取POST方式中请求体的数据。
ServletInputStream  getInputStream()
获取字节输入流,用于文件、图片、音频、视频等。
BufferedReader  getReader() 获取字符输入流,用于纯文本。
【tips】在这里IO流不需要关闭(close),因为这是Request对象创建的,等Request被销毁(destroy)时,IO流会自动关闭。  

4.Request通用方式获取请求体的数据(★)

        在doPost中使用"this.doGet(req,resp);"代替与doGet相同部分的代码,只需要在doGet中写代码即可。
Map<String,String[]> getParameterMap() 获取所有参数的Map集合
String[] getParameterValues(String name) 根据名称获取参数值数组(多个参数)
String getParameter(String name) 根据名称获取单个参数值

5.解决请求参数时的中文乱码问题

(1)POST的解决方式:
        获取POST请求数据使用的是IO流的方式,将IO流的编码设置为UTF-8即可,可以使用Request对象的setCharacterEncoding(String 编码名)方法设置输入流的编码。
request.setCharacterEncoding("UTF-8");
(2)GET的解决方式:
        先编码,再解码:先将得到的请求数据按照"ISO-8859-1"编码成字节数组,再将该字节数组按照"UTF-8"解码成中文字符串。   
String username = request.getParameter("username");

//对得到的请求数据进行编码(转为字节数组)
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//字节数字解码
username = new String(bytes,StandardCharsets.UTF_8);
【tips】①GET的解决方式也适用于解决POST请求方式中的乱码问题;
             ②ISO-8859-1:是Tomcat中默认的编码方式;
             ③Tomcat 8.0以后已解决GET请求乱码问题,默认解码方式为UTF-8。

三、请求转发(forward)

1.概念

        请求转发是一种在服务器内部的资源跳转方式

2.实现

        从资源A跳转到资源B:
request.getRequestDispatcher("资源B路径").forward(req,resp);

3.请求转发资源间的数据共享

        使用Request对象中的方法来实现:
void setAttribute(String name,Object o) 存储到request域
Object getAttribute(String name) 根据键,获取值
void removeAttribute(String name) 根据键,删除该键值对

4.请求转发的特点


(1)浏览器地址栏路径不变化
(2)请求转发只能转发到当前服务器内部的资源;
(3)一次请求,可以在转发的资源间使用request共享数据