Request

  • 关于 Request:只需要会如何获取 请求行 请求头请求体 即可

获取请求行

获取请求方法

String method = request.getMethod();

获取请求的资源

StringBuffer requestURL = request.getRequestURL();

String requestURI = request.getRequestURI();

获取应用的名称

String contextPath = request.getContextPath();

获取Get请求参数

String queryString = request.getQueryString();

获取请求头

获取所有请求头名称

  • 代码如下:
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    Enumeration<String> headerNames = request.getHeaderNames();

    while (headerNames.hasMoreElements()) {
        System.out.println(headerNames.nextElement());
    }
}

获取指定头信息

String header = request.getHeader("user-agent");

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

@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    Enumeration<String> headerNames = request.getHeaderNames();

    while (headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();

        String headerValue = request.getHeader(headerName);

        System.out.println("headerName = " + headerName + " headerValue = " + headerValue);
    }
}

请求头referer

  • 告诉服务器,我是从哪个页面链接过来的
  • 可以做防盗链
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    String referer = request.getHeader("referer");
    System.out.println(referer);
}

  • 🐤注意事项
  • 只有通过以下的方式发送请求才会获取到
  • 直接用 <a href="">
  • 或者用 Submit 或 <input type="image"> 提交的表单(POST 或 GET)即可获取
  • 🐸通过以下的方式不会有 referer
  • 从收藏夹打开发送的链接

  • 单击主页或自定义的地址
  • 在浏览器中直接输入地址
  • 反正就是只有在页面中访问才会有 referer 这个请求头

获取请求体

获取一个值

String name = request.getParameter("name");

获取多个值

  • 返回的是一个数组
String[] parameterValues = request.getParameterValues("hobby");

获取所有请求参数名称

  • 返回的是一个枚举
Enumeration<String> parameterNames = request.getParameterNames();

获取所有请求参数

  • 获取所有的请求参数
  • key-value 的 Map<String,String[]> 集合
Map<String, String[]> parameterMap = request.getParameterMap();

parameterMap.entrySet().forEach(item -> {
    System.out.println(item.getKey());
    System.out.println(Arrays.toString(item.getValue()));
});

解决中文乱码问题

  • 什么时候使用 get 请求方式与 post 请求方式
  • 发送的参数不需要写到数据库当中时使用 get 请求方式
  • 发送的参数需要保存到数据库当中时使用 post 请求方式
  • form 表单一般提交数据的方式为 post 请求方式

造成乱码的原因

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

通用解决乱码的办法

  • 获取对应的参数
  • 通过 iso8859-1 转回二进制位,再以 utf-8 的形式转成字符串
String parameter = request.getParameter("name");

byte[] bytes = parameter.getBytes("ISO8859-1");
String str = new String(bytes, "UTF-8");

  • 存在的问题,每一个参数都必须得要转回二进制位,再转为字符串

Request方法解决中文乱码

  • 只适用于 post 请求方式
request.setCharacterEncoding("UTF-8");

请求转发

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

实现转发

  • 通过请求对象获取一个 转发器
request.getRequestDispatcher("/jonathantang");

  • 返回一个 RequestDispatcher

  • 通过 转发器 进行转发
  • 调用 转发器forward 方法进行转发
requestDispatcher.forward(request, resp);

Request域对象

  • 在一次请求过程当中
  • Request 是共享的
  • 在一个 Servlet 当中设置的参数,转发到另外一个 Servlet,取出来的是同一个参数

Request生命周期

  • 创建:发送一个请求时创建一个 request 对象
  • 销毁:请求结束,给浏览器响应时,销毁
  • 作用范围:一次请求当中

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

客户端地址

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

服务器地址

  • 在服务内部当中使用的地址
  • 不需要写 web应用名称/资源名称
posted @ 2020-10-22 00:53  BNTang  阅读(699)  评论(0编辑  收藏  举报