> 文档中心 > Servlet学习之HttpServletRequest

Servlet学习之HttpServletRequest

文章目录

  • 1.概述
  • 2.常用方法
  • 3.HttpServletRequest存放的信息
  • 4.HttpServletRequest存放数据的思考
  • 5.应用域与请求域

1.概述

  • HttpServletRequest是一个接口,带包名为jakarta.servlet.http.HttpServletRequest。

  • 该接口是Servlet规范中的一员,其父接口是ServletRequest。

  • 在Tomcat中该接口的实现类是RequestFacade

    • public class RequestFacade implements HttpServletRequest {}
  • 该接口的实例化对象封装了请求体数据。请求体可以看一下我的另一篇博客(https://blog.csdn.net/qq_52002412/article/details/124292946)

2.常用方法

Map<String,String[]> getParameterMap() // 这个是获取Map    Enumeration<String> getParameterNames() // 这个是获取Map集合中所有的key    String[] getParameterValues(String name) // 根据key获取Map集合的value    String getParameter(String name)  // 获取value这个一维数组当中的第一个元素。这个方法最常用。    String remoteAddr = request.getRemoteAddr();// 获取客户端的IP地址void setCharacterEncoding(String encoding);// 设置请求体的字符集String contextPath = request.getContextPath();// 获取应用的根路径String method = request.getMethod();// 获取请求方式String uri = request.getRequestURI();// 获取请求的URIString servletPath = request.getServletPath();// 获取servlet path

以上三个方法都与用户所提交的数据有关系。

3.HttpServletRequest存放的信息

HttpServletRequest对象是由Tomcat实现,该接口的实例化对象封装了HTTP的请求协议。

而我们作为javaweb程序员只需要面向接口编程就可以获得请求信息。

4.HttpServletRequest存放数据的思考

  • 首先我们知道当我们向服务器提交数据时,其提交的格式是:url?username=abc&userpwd=111&hobby=s&hobby=d&hobby=tt,那么不难联想到使用哪种数据结来存储用户提交的数据:Map。

  • 但是我们应该考虑到,如果用户提交的数据如果是多选,那么就没办法做到一个键对应多个值,所以我们可以想到使用Map就可以做到一个键对应多个值。

  • 由上我们可以知道,当用户向服务器提交数据时,不管是何种数据都是以字符串的形式上交到服务器的。

像上面提到的数据我们就可以这样存:

keyvalue-------------------------------username{"abc"}userpwd{"111"}hobby{"s","d","tt"}

因为大多数情况下,都是一个键对应一个值,很多时候我们没必要获取用来存放的value的数组,所以一般情况我们使用getParameter()来获取用来存放value的数组的第一个值。

5.应用域与请求域

应用域是指的是ServletContext,请求域指的是HttpServletRequest。Servlet一共由三大域对象,后面我们还会学习到HttpSession。

关于应用域不懂的话可以看看我的这一篇博客(https://blog.csdn.net/qq_52002412/article/details/124375227),提到了ServletContext,不过谈的很浅,毕竟我也是个小白。

操作域的方法:不管是应用域还是请求域,他们都具有相同的操作域的方法

  • void setAttribute(String name, Object obj); // 向域当中绑定数据。Object getAttribute(String name); // 从域当中根据name获取数据。void removeAttribute(String name); // 将域当中绑定的数据移除
  • 其实上面三个方法有点像Map存取数据的方法。总而言之就是三个方法就是向域中存取信息。

  • 在这里要注意区分getAttribute()和geParameter()两个方法。

    • 第一个方法:获取的是请求域当中绑定的数据。
    • 第二个方法:获取的是用户在浏览器上提交的数据。

生命周期:ServletContext的生命周期明显长于HttpServletRequest。

  • ServletContext的生命周期从服务器启动到服务器结束
  • HttpServletRequest的生命周期从一次请求发出到结束

作用范围:ServletContext的作用范围相较于HttpServletRequest更广泛

  • ServletContext是对一个项目中的所有App生效,因此我们最好将所有用户共享的并且不打算做修改的小数据放在ServletContext中,否则服务器会很有压力。
  • HttpServletRequest中的信息只对单次请求起作用。
  • 在实际使用中我们如果要操作域中的内容的时候,多个域可用的情况下,我们要优先选择小的域,避免占用过多的系统资源。