• Request对象


    request 对象和 response 对象的原理

    1. request 和 response 对象是由服务器创建的。我们来使用它们
    2. request 对象是来获取请求消息,response 对象时来设置响应消息
    • 示例图:

    request&response原理

    过程:

    1. tomcat服务器会根据请求的 url中的资源路径,创建对应的 ServletDemo1 的对象
    2. tomcat服务器,会创建request对象和response对象。request对象中封装请求消息数据。
    3. tomcat将request和response两个对象传递个service方法,并且调用service方法。
    4. 程序员,可以通过request对象获取请求消息数据,通过response对象设置响应消息数据。
    5. 服务器在给浏览器作出响应之前,会从response对象中拿出程序员设置的响应消息数据。

    request对象继承体系结构

    ServletRequest	-- 接口
    	| 继承
    HttpServletRequest	-- 接口
    	| 实现
    org.apache.catalina.connector.RequestFacade 类(tomcat)
    

    request功能

    获取请求消息数据

    获取请求行数据

    • GET /day13/demo1?name=zhangsan HTTP/1.1
    • 方法:
      1. 获取请求方式:GET
        • String getMethod()
      2. (*)获取虚拟目录:/day13
        • String getContextPath()
      3. 获取Servlet路径:/demo1
        • String getServletPath()
      4. 获取get方式请求参数:name=zhangsan
        • String getQueryString()
      5. (*)获取请求URI:/day13/demo1
      6. 获取协议及版本:HTTP/1.1
        • String getProtocol()
      7. 获取客户机的IP地址:
        • String getRemoteAddr()

    获取请求头数据

    • 方法:

      • (*)String getHeader(String name):通过请求头的名称获取请求头的值
      • Enumeration<String> getHeaderNames():获取所有的请求头名称
    • java.util 接口 Enumeration<E>

      • 方法
        • boolean hasMoreElements():测试此枚举是否包含更多的元素。
        • E nextElement():如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。

    注:此接口的功能与 Iterator 接口的功能是重复的。

    获取请求体数据

    • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
    • 步骤:
      1. 获取流对象
        • BufferedReader getReader():获取字符输入流,只能操作字符数据
        • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据
          • 在文件上传知识点后讲解
      2. 再从流对象中拿数据

    其他功能

    获取请求参数通用方式

    1. String getParameter(String name)根据参数名称获取参数值 username=zhangsan&password=123
    2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
    3. Enumeration<String> getParameterNames():获取所有请求的参数名称
    4. Map<String,String[]> getParameterMap()获取所有参数的map集合
    • 中文乱码问题:
      • get方式:tomcat 8 已经将get方式中文乱码问题解决了
      • post方式:会乱码
        • 解决:在获取参数前,设置 request.setCharacterEncoding("utf-8");

    请求转发

    • 一种在服务器内部的资源跳转方式
    request.getRequestDispatcher("Servlet资源路径").forward(request, response);
    
    1. 步骤:

      1. 通过 request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
      2. 通过 RequestDispatcher 对象来进行转发:void forward(ServletRequest request, ServletResponse response)
    2. 特点:

      1. 浏览器地址栏路径不发生变化
      2. 只能转发到当前服务器内部资源中
      3. 转发是一次请求,多个资源之间使用的是同一个请求

    共享数据

    • 域对象:一个有作用范围的对象,可以在范围内共享数据
    • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    • 方法:
      1. void setAttribute(String name,Object o):存储数据
      2. Object getAttribute(String name):通过键获取值
      3. void removeAttribute(String name):通过键移除键值对

    获取ServletContext

    • ServletContext getServletContext()
  • 相关阅读:
    volatile 能使得一个非原子操作变成原子操作吗?
    什么是线程局部变量?
    使用idea插件进行java代码生成
    mybatis plus+dynamic事务导致多数据源切换失败
    10_docker-compose
    Ubuntu的Python从2.x升级到3.x
    idea查看控制台数据mybatis的sql完整语句
    iframe高度处理
    angular路由
    去掉iPhone、iPad的默认按钮、输入框样式
  • 原文地址:https://www.cnblogs.com/rainszj/p/12219523.html
Copyright © 2020-2023  润新知