zoukankan      html  css  js  c++  java
  • request (请求对象)

    一、学习请求

    学习如何获取请求行, 请求头,请求体。

    1. 获取请求行

    获取请求方法

    String method = request.getMethod();
    System.out.println(method);
    

    获取请求资源

    StringBuffer requestURL = request.getRequestURL();
    String requestURI = request.getRequestURI();
    
    System.out.println(requestURL);
    System.out.println(requestURI);
    

    获取应用名称

    String contextPath = request.getContextPath();
    System.out.println(contextPath);
    

    获取get查询参数

    String queryString = request.getQueryString();
    System.out.println(queryString);
    

    2. 获取请求头

    获取所有的请求头名称

    // 获取所有请求头名称
    Enumeration<String> headerNames = request.getHeaderNames();
    // 取出所有请求头名称 并打印
    while(headerNames.hasMoreElements()) {
    	System.out.println(headerNames.nextElement());
    }
    

    获取指定的头信息

    String header = request.getHeader("referer");
    System.out.println(header);
    

    打印所有的请求头和请求头内容

    // 获取所有请求头名称
    Enumeration<String> headerNames = request.getHeaderNames();
    // 取出所有请求头名称 并打印
    while(headerNames.hasMoreElements()) {
    	String name = headerNames.nextElement();
    	String value = request.getHeader(name);
    	System.out.println(name +" : "+value);
    }
    

    referer

    • 告诉服务器我是从哪个页面链接过来的

    • 注意事项

      • 通过以下方式发送请求才会获取referer
        • 直接用<a href="">
        • 用Submit或<input type="image">提交的表单(POST或GET)
        • 用JAvaScript提交的表单(POST或GET)
      • 通过以下方式不会有referer
        • 从收藏夹链接
        • 单击主页或自定义的地址
        • 在浏览器中直接输地址

    3. 获取请求体

    1. 获取一个值

    String parameter = request.getParameter("名称");
    System.out.println(parameter);
    

    2. 获取多个值

    返回的是一个数组

    String[] parameterValues = request.getParameterValues("名称");
    System.out.println(Arrays.toString(parameterValues));
    

    3. 获取所有请求参数名称

    Enumeration<String> parameterNames = request.getParameterNames();
    while(parameterNames.hasMoreElements()) {
    	System.out.println(parameterNames.nextElement());
    }
    

    4. 获取所有请求参数

    Map<String, String[]> parameterMap = request.getParameterMap();
    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
    	System.out.println(entry.getKey());
    	System.out.println(Arrays.toString(entry.getValue()));
    }
    

    5. 把获取的请求参数封装成对象

    需要将 commons-logging-1.1.1.jar 和 commons-beanutils-1.8.3.jar 导入到 lib 目录下

    request.setCharacterEncoding("UTF-8");
    Map<String, String[]> parameterMap = request.getParameterMap();
    
    User user = new User();
    try {
    	BeanUtils.populate(user, parameterMap);
    } catch (IllegalAccessException | InvocationTargetException e) {
    	e.printStackTrace();
    }
    System.out.println(user);
    

    6. 解决中文乱码问题

    什么时候使用get方式与post方式
    1. 发送的参数不需要写到数据库当中使用get
    2. 发送的参数需要保存到数据库当中使用post
    3. form一般提交数据的数据为post
    造成乱码的原因

    发送请求时, 会对参数进行编码,编码使用的是ISO8859-1 不支持中文,所以乱码

    通用解决办法:
    • 获取对应的参数
    • 通过iso8859-1转回二进制位,再以utf-8的形式转成字符串
    • 存在的问题,每一个参数都必须得要转回二进制位,再转为字符串
    String parameter = request.getParameter("名称");
    System.out.println(parameter);
    
    byte[] bytes = parameter.getBytes("ISO8859-1");
    String string = new String(bytes,"UTF-8");
    System.out.println(string);
    
    request方法解决中文乱码 只适用于post
    request.setCharacterEncoding("UTF-8");
    String parameter = request.getParameter("名称");
    System.out.println(parameter);
    

    4. 请求转发

    重定向与请求转发的区别

    重定向
    • 找servlet1,通过设置响应,告诉浏览器, 再让浏览器发送请求到servlet2
    • 发两次请求
    • 地址栏会发生变化
    请求转发
    • 请求转发只需要发送一次直接,找servlet1,在servlet1当中直接转发给servlet2,不要再告诉浏览器
    • 只发送一次请求
    • 浏览器地址栏当中还是servlet1,不会发生变化

    实现转发

    1. 通过请求对象获取一个转发器
    RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
    
    2. 通过转发器进行转发

    调用转发器的forward方法进行转发

    dispatcher.forward(request, response);
    

    5. request域对象

    • 在一次请求过程当中
    • request是共享的。在一个servlet当中设置的参数,转发到另外一个servlet,取出来的是同一个
    • 生命周期
      • 创建:发送一个请求时创建一个request对象
      • 销毁:请求结束,浏览器给出响应时,销毁
      • 作用范围:一次请求当中

    5. 客户端地址与服务器端地址

    客户端地址

    • 客户端访问服务器使用的地址
    • 服务器外部地址
    • 在写的时候要写上web应用的名称 /应用名称/资源

    服务器地址

    • 在服务内部当中使用的地址
    • 不需要写web应用名称 /资源名称
  • 相关阅读:
    【2020-05-17】人生十三信条
    【2020-05-16】评价与骄傲
    【2020-05-15】每天都充满向上的激情
    【04NOIP普及组】火星人(信息学奥赛一本通 1929)(洛谷 1088)
    next_permutation(全排列算法)
    【03NOIP普及组】麦森数(信息学奥赛一本通 1925)(洛谷 1045)
    快速幂
    【03NOIP普及组】栈(信息学奥赛一本通 1924)(洛谷 1044)
    【06NOIP普及组】数列(信息学奥赛一本通 1937)(洛谷 1062)
    【00NOIP普及组】计算器的改良(信息学奥赛一本通 1910)(洛谷 1022)
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10651938.html
Copyright © 2011-2022 走看看