目录

一、Request 对象请求原理

二、Request 对象继承体系结构

三、Request 功能

1、获取请求消息数据

【1】获取请求行数据

【2】获取请求头数据

【3】获取请求体数据

2、其他常用获取功能

【1】获取请求参数通用方法(get和post都能用)

【2】请求转发

【3】共享数据

【4】获取 ServletContext 对象


一、Request 对象请求原理

request 和 response 对象是由服务器创建的,由开发人员来使用;request 对象是来获取消息请求,response 对象是来设置响应消息的

  1. Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 oneStar 对象
  2. Tomcat 服务器会创建 request 和 response 对象,request 对象中封装请求消息数据;response 对象中封装响应消息数据
  3. Tomcat 将 request 和 response 两个对象传递给 service 方法,并调用 service 方法
  4. 开发人员可以通过 request 对象获取请求消息数据,通过 response 对象设置响应消息数据
  5. 服务器在给浏览器做出响应之前,会从 response 对象中拿开发人员设置的响应消息数据

二、Request 对象继承体系结构

HTTP 协议 Request 请求_HTTP

  • ServletRequest:是一个接口
  • HttpServletRequest:是一个接口
  • org.apache.catalina.connector.RequestFacade:是 Tomcat 的一个类

RequestFacade 类实现了 HttpServletRequest 接口,HttpServletRequest 接口继承了 ServletRequest 接口

三、Request 功能

1、获取请求消息数据

【1】获取请求行数据

GET /oneStar?name=qq HTTP/1.1

常用方法:

  • Sring getMethod():获取请求方法:GET
  • String getContextPath():获取虚拟目录:/
  • String getServletPath():获取 servlet 路径:/oneStar
  • Sring getQuervletPath():获取 get 方式请求参数:name=qq
  • String getRequestURI():获取请求URI:/oneStar
  • StringBuffer getRequestURL():获取请求URL:http://localhost/onestar/
  • String getProtocol():获取协议版本:HTTP/1.1
  • String getRemoteAddr():获取客户机的IP地址

URL:统一资源定位符

URI:统一资源标识符(范围更大)

//请求行数据
public static void requestHang(HttpServletRequest req){
//1.获取请求方法:GET
String method = req.getMethod();
System.out.println(method);

//2.获取虚拟目录
String Cpath = req.getContextPath();
System.out.println(Cpath);

//3.获取 Servlet 路径
String Spath = req.getServletPath();
System.out.println(Spath);

//4.获取get方式请求参数
String Qpath = req.getQueryString();
System.out.println(Qpath);

//5.获取请求URI
String URI = req.getRequestURI();
System.out.println(URI);

//6.获取请求URL
StringBuffer URL = req.getRequestURL();
System.out.println(URL);

//7.获取协议版本
String pro = req.getProtocol();
System.out.println(pro);

//8.获取客户机IP地址
String add = req.getRemoteAddr();
System.out.println(add);
}

【2】获取请求头数据

常用方法:

  • String getHeader(String nem):通过请求头的名称获取请求头的值
  • Enumeration<String> getHeaderNames():获取所有的请求头名称
//请求头数据
public static void requestHead(HttpServletRequest req){
//获取所有请求头名称
Enumeration<String> headernames = req.getHeaderNames();
//遍历
while (headernames.hasMoreElements()){
String name = headernames.nextElement();
//根据名称来获取请求头的值
String value = req.getHeader(name);
System.out.println(name + "--" + value);
}
}

【3】获取请求体数据

请求体只有POST请求方式才有的,在请求体中封装了POST请求参数

步骤:

  1. 获取流对象
  • BuferedReader getReader():获取字符输入流
  • ServletInputStream getInputStream():获取字节输入流
  1. 从流对象中获取数据
  • readLine():逐行获取
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求消息体数据
//1.获取流对象
BufferedReader br = request.getReader();
//2.读取数据
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
}

2、其他常用获取功能

【1】获取请求参数通用方法(get和post都能用)

  • String getParameter(String name):根据参数名称获取参数值
  • String[ ]  getParameterValues(String name):根据参数名称获取参数值的数组(多用于复选框)
  • Enumeration<String> getParameterNames():获取所有请求的参数名称
  • Map<String,String[]> getParameterMap():获取所有参数的map集合
public class regServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding("UTF-8");
//post获取请求参数

//1.根据参数名称获取参数值
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("post:" +name + password);

//2.根据参数名称获取参数值的数组
String[] hobbys = request.getParameterValues("hobby");
for(String hobby : hobbys){
System.out.println(hobby);
}

//3.获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String name1 = parameterNames.nextElement();
String value = request.getParameter(name1);
System.out.println(name1 + "--" + value);
System.out.println("*********");
}

//4.获取所有参数的map集合
Map<String,String[]> parameterMap = request.getParameterMap();
Set<String> keySets = parameterMap.keySet();
for(String key : keySets){
String[] values = parameterMap.get(key);
for(String value : values){
System.out.println(value);
}
}
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get获取请求参数
this.doPost(request,response);
}
}

【2】请求转发

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

  • 步骤
  1. 通过request对象获取请求转发器对象:RequestDispatcher  getRequestDispatcher(String path)
  2. 使用 RequestDispatcher 对象来进行转发:forward(ServletRequest request,ServletResponse response)
  • 特点
  1. 浏览器地址栏路径不发生变化
  2. 只能转发到当前服务器内部资源中
  3. 转发是一次请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("访问regSrevlet");
request.getRequestDispatcher("/oneStar").forward(request,response);
}

【3】共享数据

域对象:首先要了解一下域对象,域对象即一个有作用范围的对象,可以在范围内共享数据

request 域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据,而请求转发就是一次请求,因此可以通过request 域来实现共享数据

常用方法:

  • void setAttribute(String name,Object obj):存储数据
  • Object getAttitude(String name):通过键获取值
  • void removeAttribute(String name):通过键移除键值对
//存储数据到request域中
request.setAttribute("sag","Hello");
request.getRequestDispatcher("/oneStar").forward(request,response);

//从域中获取数据
Object mesage = req.getAttribute("sag");
System.out.println(mesage);

【4】获取 ServletContext 对象

  • ServletContext getServletContext();
ServletContext context = request.getServletContext();
System.out.println(context);