HttpServletRequest详解
- HttpServletRequest 是一个接口,全限定名称:Jakarta.servlet.http.HttpServeltRequest
- HttpServletRequest接口是Servlet规范中的一员
- HttpServletRequest接口的父接口:ServletRequest
- HttpServletRequest接口的实现类谁写的?HttpServletRequest对象是谁给创建的?
- 通过测试: org.apache.catalina.connector.RequestFacade 实现了 HttpServletRequest接口
- 测试结果说明: Tomcat服务器(WEB服务器、WEB容)实现了HttpSerletRequest接口,还是说明了Tomcat服务实现了Servlet规范。而对于我们javaweb程序员来说,实际上不需要关心这个,我们只需要面向接口编程即可。我们关心的是HttpServletRequest接口中有哪些方法,这些方法可以完成什么功能!!!!
HttpServletRequest对象中都有什么信息?都包装了什么信息?
- HttpServletRequest对象是Tomcat服务器负责创建的。这个对象中封装了什么信息?封装了HTTP的请求协议。
- 实际上是用户发送请求的时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器把这些信息封装到HttpServletRequest对象当中,传给Javaweb程序员。
- Javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获取到请求信息
- request和response对象的生命周期?
- request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求有效。
- 一次请求对应一个request。
- 两次请求则对应两个request
- HttpServletRequest接口中有哪些常用方法?
- 怎么获取前端浏览器用户提交的数据?
String getParameter(String name)最常用 获取value这个一维数组中的第一个元素 Map<String,String[]> getParameterMap() 获取Map Enumeration<String> getParameterNames() 获取Map中的所有key String[] getParameterValues(String name) 根据key获取Map集合的value
- 思考:前端的form表单提交之后,怎么存储这些数据,采用什么结构存储这些数据?
- 前端提交的数据格式:username=abc&userpwd=111&aihao=s&aihao=d&aihao=tt
- 采用Map集合来存储:
Map<String, String> key存储String value存储String 这种方法不对,key重复会导致value覆盖。 key value ---------------------- username abc userpwd 111 aihao s aihao d aihao tt 【因为map的key不能重复】 Map<String, String[]> key存储String value存储String[] key value ---------------------- username {"abc"} userpwd {"li"} aihao {"s","d""tt"}
测试HttpServletRequest接口中的相关方法。
- 获取请求参数的四个方法。
String getParameter(String name)最常用 获取value这个一维数组中的第一个元素 Map<String,String[]> getParameterMap() 获取Map Enumeration<String> getParameterNames() 获取Map中的所有key String[] getParameterValues(String name) 根据key获取Map集合的value
- request对象实际上又称为"请求域"对象
- 应用域对象是什么?
- ServletContext (Servlet上下文对象)
- 什么情况下会考虑向ServletContext这个应用域当中绑定数据呢?
- 第一:所有用户共享的数据
- 第二:这个共享的数据量很小
- 第三: 这个共享的数据很少的修改操作。
- 在以上三个条件都满足的情况下,使用这个应用域对象,可以大大提高我们程序执行效率。
- 实际上就是向应用域中绑定数据,就相当于把数据放到缓存中,然后用户访问的时候直接从缓存中取数据,减少IO操作,大大提高系统的性能,所以缓存技术是提高系统性能的重要手段。
- ServletContext当中有三个操作域的方法:
void setAttribute(String name, Object obj); Object getAttribute(String name); void removeAttribute(String name);
- 应用域对象是什么?
- "请求域"对象
- "请求域"对象要比"应用域"对象范围小很多,生命周期短很多。请求域只在一次请求内有效。
- "请求域"对象也有这三个方法:
void setAttribute(String name, Object obj); Object getAttribute(String name); void removeAttribute(String name);
- 一个请求对象request对应一个"请求域"对象,一次请求结束之后,这个域就销毁了。
- 请求域和应用域选用原则:
- 尽量选择小队域对象,因为小的域对象占用的资源较少。
- 跳转
- 转发(一次请求)
第一步:获取请求转发器对象 RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); 第二步:调用转发器的forward方法完成跳转/转发 dispatcher.forward(request,response); 第一步可以和第二步联系在一起。 request.getRequestDispatcher("/b").forward(request,response);
- 转发(一次请求)
- 两个Servlet怎么共享数据?
- 将数据放到ServletContext应用域当中,当然可以,但是占用范围太大,资源太多,不建议使用。
- 可以将数据放到request域当中,然后Aservlet转发到BServlet,保证Aservlet和Bservlet在同一次请求当中,这样就可以做到两个Servlet,或者多个Servlet共享同一份数据。
- 转发的下一个资源必须是一个Servlet吗?
- 不一定,只要是Tomcat服务器当中的合肥资源,都是可以转发的。
- 注意:转发的时候,路径的写法要注意,转发的路径以"/"开始,不加项目名。
关于request对象中两个非常容易混淆的方法:
String username = request.getParameter("username");
Object obj = request.getAttribute("name")
//第一个方法:获取的是用户在浏览器上提交的数据。
//第二个方法:获取的是请求域当中绑定的数据。
HttpServletRequest接口的其他常用方法:
//获取客户端的IP地址:
String remoteAddr = request.getRemoteAddr();
//设置请求体的字符集:(解决请求乱码)
request.setCharacterEncoding("UTF-8");
//解决Tomcat9(包含9)之前的乱码问题,怎么解决这个乱码?之后的版本不会出现乱码
response.setContentType("text/html;charset=UTF-8")
//动态获取应用的根路径
request.getContextPath();
//获取请求方式
request.getMethod();
//获取请求的uri
request.getRequestURI();
//获取Servlet路径
request.getServletPath();