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();// 获取请求的URI
String 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<String, String[]>就可以做到一个键对应多个值。
-
由上我们可以知道,当用户向服务器提交数据时,不管是何种数据都是以字符串的形式上交到服务器的。
像上面提到的数据我们就可以这样存:
key value
-------------------------------
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中的信息只对单次请求起作用。
- 在实际使用中我们如果要操作域中的内容的时候,多个域可用的情况下,我们要优先选择小的域,避免占用过多的系统资源。