一、request继承体系结构

QQ图片20200708202551.png

二、request的功能

A:获取请求消息数据(只有几个方法常用)

1、获取请求行数据

假设要获取的请求行为:GET /day14/demo1?name=zhangsan HTTP/1.1

获取请求方式 :GET

  1. (String) getMethod()

(**)获取虚拟目录:/day14

  1. (String) getContextPath()

获取Servlet路径: /demo1

  1. (String) getServletPath()

获取get方式请求参数:name=zhangsan

  1. (String) getQueryString()

(**)获取请求URI与URL:

  1. (String) getRequestURI() //获取结果:/day14/demo1
  2. (StringBuffer) getRequestURL() //获取结果:http:localhost/day14/demo1
  • URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
  • URI:统一资源标识符 : /day14/demo1 共和国 (能表示的范围更大)

获取协议及版本:HTTP/1.1

  1. (String) getProtocol()

获取客户机的IP地址:

  1. (String) getRemoteAddr()

2、获取请求头数据

根据请求头名称获取请求头的内容(*重要)

经常用来获取两个请求头:user-agent(获取浏览器版本) 、 referer(获取访问者的URL地址)

  1. (String) getHeader(String name)

获取所有请求头名称

  1. (Enumeration<String>) getHeaderNames()

3、获取请求体数据

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

步骤:

  1. 获取流对象
    BufferedReader getReader( ):获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream( ):获取字节输入流,可以操作所有类型数据,在文件上传知识点后讲解
  2. 再从流对象中拿数据

B:其它四类功能(都很常用)

1、获取请求参数(兼容GET和POST传输方式)

  1. /*常用*/
  2. (String) getParameter(String name)//根据参数名称获取参数值
  1. (String[]) getParameterValues(String name)//根据参数名称获取参数值的数组,用于一键多值的情况
  1. (Enumeration<String>) getParameterNames()//获取所有请求的参数名称
  1. /*常用*/
  2. (Map<String,String[]>) getParameterMap()//获取所有参数包括名称和值的map集合,常用!
  3. map.keySet() //获取map集合的键数组
  4. map.get(keys) //根据键数组获取map集合的值数组
  5. //该方法的使用格式如下:
  6. Map<String, String[]> map = request.getParameterMap();
  7. Set<String> names = map.keySet(); //用keySet()获取参数的名称数组
  8. for (String name : names) { //遍历打印参数的名称数组
  9. System.out.println("参数名称" + name); //遍历打印参数的名称
  10. String[] values = map.get(names); //用get()获取参数的值的数组
  11. for (String value : values) { //遍历打印参数的值的数组
  12. System.out.println("参数的值" + value);
  13. }
  14. }
  1. //因为兼容GET和POST方法,所以将来只需要在doPost方法里面写一份代码,然后在doGet中调用doPost方法并且传入request和response这两个参数就行了!代码如下:
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. this.doPost(request, response);
  4. }

获取参数的中文乱码问题:

如果获取到的是使用POST传输方式的参数的话,必须设置字符集编码为utf-8,否则会出现中文乱码问题,只需在doPost( )方法里获取参数之前添加一行代码即可:

  1. request.setCharacterEncoding("utf-8");

因为我们不知道到底是Post方式还是Get方式获取,建议在获取参数的时候得必须加上这一行代码!因为我们是中国人啊!经常用中文!!懂?


2、请求转发

概念:

当客户端浏览器网页发送一次请求,然后需要使用Tomcat服务器里的多个Servlet资源文件,这时:

当前Tomcat服务器内的一个Servlet资源文件跳转到另一个Servlet资源文件的过程,就叫做请求转发!

使用步骤:

  1. 通过request对象获取请求转发器对象,然后转发器对象使用forward( request, response)方法即可!
  1. request.getRequestDispatcher.forward(request, response);
  2. //使用链式编程!

3、共享数据

域对象

概念:一个有作用范围的对象,可以在范围内共享数据

request域对象:

一次请求代表一个域,也就是说,多个Servlet资源文件需要进行请求转发的操作时,它们之间就可以共享数据!

如何操作

  1. //存储数据
  2. (void) setAttribute(String name,Object obj)
  3. //name和obj都可以自由编写!name代表数据的名字,obj代表数据内容,该方法的作用就是存储该数据到request域中!
  1. //通过数据的名字(键)获取值
  2. (Object) getAttribute(String name)
  1. //通过数据的名字(键)来移除键值对
  2. (void) removeAttribute(String name)

4、获取ServletContext对象

  1. (ServletContext) getServletContext()