• 请求转发和动态包含/生成响应信息/响应头/重定向/输出流


    请求转发和动态包含

    • 请求转发 request.getRequestDispatcher(“新页面地址”).forward(request,response);
    • 动态包含 request.getRequestDispatcher(“新页面地址”).include(request,response);
      转发或者包含的地址要求:
    • 地址应该位于当前应用范围内,不能是其它应用中地址

    request.getRequestDispatcher(“https://www.baidu.com”).forward(request,response); 执行会有报错 HTTP Status 404 - /pp/https:/www.baidu.com ,这是在请求转发时会在地址上自动附加当前应用的路径 http://localhost:9090/pp/

    • 允许在请求转发的地址中包含额外附加的请求参数

    request.getRequestDispatcher(“add2.do?id=100”).forward(request,response);请求当前页面的参数仍旧存在。如果参数名称一致,则时附加,也就是名称相同的多个参数如果昂前页面的请求方法为post,请求转发请求方法仍旧为post

    • 除了parameter还可以使用attribute传递数据

    原因是共享request

    其它方法

    获取客户端的地址

    • request.getRemoteAddr():String
    //获取远程客户端的IP地址
    System.out.println(request.getRemoteAddr());
    stem.out.println(request.getRemoteHost());
    //获取远程客户端的连接端口号
    System.out.println(request.getRemotePort());
    //获取服务器的IP地址
    System.out.println(request.getLocalAddr());
    //获取本地机的主机名称
    System.out.println(request.getLocalName());
    //获取本地机的连接端口号
    System.out.println(request.getLocalPort());
    //获取服务器的信息
    System.out.println(request.getServerName());
    System.out.println(request.getServerPort());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    问题:IP地址定位
    IPv4的地址采用的是4位点分十进制的计法,例如192.168.123.4。如果需要进行范围判断,建议将4位点分十进制的计法的字符串当作一个256进制的整数,可以转换为long类型数据进行存储

    String ss="192.168.123.4";
    long res=0;
    String[] arr=ss.split("[.]");
    for(int i=0;i<arr.length;i++){
    int kk=Integer.parseInt(arr[i]);
    res=res*256+kk;
    }
    System.out.println(res);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    获取请求地址相关信息

    //String统一资源标识符 /pp/add.do
    System.out.println(request.getRequestURI());
    //StringBuffer统一资源定位器 http://localhost:9090/pp/add.do
    System.out.println(request.getRequestURL());
    //获取上下文路径 /pp
    System.out.println(request.getContextPath());
    //获取请求参数 对应get请求时?号后面的内容,例如id=999。如果没有请求参数或者post参数则为
    null
    System.out.println(request.getQueryString());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    流式处理

    • request.getReader():BufferredReader
    • request.getInputStream():ServletInputStream
      使用输入流的方式处理请求信息仅仅用于文件上传。具体的上传处理中一般建议优先考虑使用上传组件。
      例如 jspsmartupload和apache的commons-fileupload
      上传处理的要点
    • 根据不同的上传组件接收提交数据
      • 一般默认上传文件的最大大小为2MB,如果文件超大一般建议使用ftp类型的工具,而不建议使用页面上传

    //获取http请求方法,例如GET/POST/DELETE等
    String method=request.getMethod();

    生成响应信息

    针对客户端请求的响应对象为response,类型HttpServletResponse。
    response.reset() 重置response对象
    resetBuffer() 重置缓冲区,将缓冲区中的内容送往客户端,同时清空缓冲区
    setContentType(“MIME格式”) 设置响应内容类型,告知浏览器如何处理响应信息

    response.setContentType("image/jpeg"); 如果是html页面则为
    text/html;charset=UTF-8
    
    • 1
    • 2

    响应头

    可以通过response.setHeader设置响应头,传递到浏览器,以控制浏览器的缓存

    // 关闭浏览器缓存
    response.setHeader("pragma","no-cache"); //可以用于http1.0/1.1
    response.setHeader("cache-control","no-cache");//用于http1.1
    //设置缓存过期时间
    response.setDateHeader("expires",0L);//过期时间使用毫秒时,例如new
    Date().getTime()+1000*60 从现在开始60秒后过期
    setIntHeader用于配置响应头值为int类型
    addHeader/addIntHeader/addDateHeader
    getHeader/getHeaderNames/getHeaders
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    补充:客户端避免缓存问题

    
     看不清楚,点击图片
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    重定向

    response.sendRedirect("新地址");
    重定向的地址要求:

    • 重定向的目标地址可以不是当前应用范围内的地址

    response.sendRedirect("https://www.baidu.com"); 正确

    • 允许在重定向的地址中包含额外请求参数

    response.sendRedirect(“add2.do?id=999”); 正确的地址。但是由于重定向是重新发起请求,所以不会共享request,以前的提交数据全部丢失由于不共享request,所以不能依赖于request传递数据

    • 重定向的请求和当前请求的方法无关,新地址请求是Get

    输出流

    向response的输出流中写出数据,就是向客户端浏览器发送的数据
    response.getOutptutStream():ServletOutputStream 一般用于下载处理或者图片、声音、视频之类的二进制数据处理
    response.getWriter():PrintWriter 一般用于生成html文档
    文件下载处理的要点
    Content-Disposition,对应值为attachment;filename=默认文件名称

  • 相关阅读:
    基于CentOS更新 glibc - 解决 `GLIBC_2.29‘ not found
    华为的隐藏功能,你们知道多少?
    【BOOST C++ 7 内部进程】(1)共享内存
    “交叉轮”轮融资后,哪吒汽车能否脚踏“风火轮”续写逆袭故事?
    在虚拟机安装JDK
    PostgreSQL 介绍
    Lampiao
    微信小程序开发---事件的绑定
    搭建统一的依赖管理
    数位dp总结
  • 原文地址:https://blog.csdn.net/qq_51222096/article/details/128086457