目录
一、Request 对象请求原理
二、Request 对象继承体系结构
三、Request 功能
1、获取请求消息数据
【1】获取请求行数据
【2】获取请求头数据
【3】获取请求体数据
2、其他常用获取功能
【1】获取请求参数通用方法(get和post都能用)
【2】请求转发
【3】共享数据
【4】获取 ServletContext 对象
一、Request 对象请求原理
request 和 response 对象是由服务器创建的,由开发人员来使用;request 对象是来获取消息请求,response 对象是来设置响应消息的
- Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 oneStar 对象
- Tomcat 服务器会创建 request 和 response 对象,request 对象中封装请求消息数据;response 对象中封装响应消息数据
- Tomcat 将 request 和 response 两个对象传递给 service 方法,并调用 service 方法
- 开发人员可以通过 request 对象获取请求消息数据,通过 response 对象设置响应消息数据
- 服务器在给浏览器做出响应之前,会从 response 对象中拿开发人员设置的响应消息数据
二、Request 对象继承体系结构
- 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请求参数
步骤:
- 获取流对象
- BuferedReader getReader():获取字符输入流
- ServletInputStream getInputStream():获取字节输入流
- 从流对象中获取数据
- 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】请求转发
请求转发即一种在服务器内部的资源跳转方式
- 步骤
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用 RequestDispatcher 对象来进行转发:forward(ServletRequest request,ServletResponse response)
- 特点
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求
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);