JavaWeb学习07 | HttpServletRequest详解

169 阅读5分钟

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();