• servlet中的request和response


     request对象

    1.什么是请求

      a.浏览器向服务器发送数据就是请求。

      

    一.request功能1--获取数据

      1.获取浏览器相关的信息

    getRequestURL方法 -- 返回客户端发出请求完整URL

    getRequestURI方法 -- 返回请求行中的资源名部分

    getQueryString方法 -- 返回请求行中的参数部分

    getRemoteAddr方法 -- 返回发出请求的客户机的IP地址

    getMethod -- 得到客户机请求方式

    !!getContextPath -- 获得当前web应用虚拟目录名称 -- 在写路径时不要将web应用的虚拟路径的名称写死, 应该在需要写web应用的名称的地方通过getContextPath方法动态获取

       String path = request.getContextPath();

    2.获取请求头信息

    getHeader(name)方法 --- String
    getHeaders(String name)方法 --- Enumeration<String>
    getHeaderNames方法 --- Enumeration<String>

    Enumeration<String> headers = request.getHeaders("host");

     eg: while(headers.hasMoreElements()){
      String head = headers.nextElement();
      System.out.println("head:"+head);
      }
      Enumeration<String> headerNames = request.getHeaderNames();
      while (headerNames.hasMoreElements()) {
      String headname = (String) headerNames.nextElement();
      String value = request.getHeader(headname);
      System.out.println("headname:"+headname+"<>>>value:"+value);
      }

    3.获取请求参数

    getParameter(String name) --- String 通过name获得值

    getParameterValues(String name)  --- String[ ] 通过name获得多值checkbox----》》System.out.println(Arrays.toString(likes));

    getParameterMap()  --- Map<String,String[ ]> key :name value: 多值 将查询的参数保存在一个Map中

    getParameterNames()  --- Enumeration<String> 获得所有name》》》

    》》》》》》》》》eg:    

              Map<String,String[]> map = request.getParameterMap();

              Enumeration<String> names = request.getParameterNames();

              while (names.hasMoreElements()) {
                   String name = (String) names.nextElement();
                   //根据请求参数的名称获取对应请求参数名的值
                   String[] value = request.getParameterValues(name);
              System.out.println("name:"+name+">>>value:"+Arrays.toString(value));
            }

     

    a.GET提交乱码处理

            String username = request.getParameter("username"); //1.处理"?":

        //使用iso8859-1编码

        byte bytes[] = username.getBytes("iso8859-1");

        //2.将编码后的二进制数据解码

        //解码时使用utf-8

        username = new String(bytes,"utf-8"); System.out.println("username:"+username);

        此种方式在面对get,post提交方式都可以解决乱码

    b.POST提交乱码处理:使用request.setCharacterEncoding("utf-8");

    二.request功能2--请求转发 (web应用内部,地址栏不发生变化)

    1. 请求转发的实现请求转发中的细节问题
      1. 创建一个调度器------在RequestDemo4里面RequestDispatcher dis = request.getRequestDispatcher("/servlet/RequestDemo5");
      2. 利用调度器实现请求转发-------dis.forward(request, response);

      a. 在请求转发之前,是不允许进行响应操作,如果强行冲刷缓冲区实现相应操作,则会抛出异常,导致程序无法运行。

        冲刷缓冲区:response.flushBuffer();

      b.在请求转发之前,response缓冲区中的内容会被清空一次,这些被清空的内容无法携带至下一个请求的servlet,也就无法在页面中展示。

      c.请求转发就是一条普通的语句,和其他代码一样都可以按照顺讯正常执行。

      d.在请求转发过程中允许多重转发,但是不允许在同一个servlet中多次转发。

    三.request功能3--请求包含 (web应用内部,地址栏不发生变化)

          RequestDispatcher dis = request.getRequestDispatcher("/servlet/RequestDemo10");

      dis.include(request, response);//RequestDemo9包含10输出

    四.request功能4--请求包含

        一个对象具有一个可以被看见的范围,在这个范围内可以实现资源的共享,在这个对象身上具有一个map,可以通过这个map进行数据的存取操作。

    a.域对象身上的api:

    setAttribute

    设置域属性

    getAttribute

    获取域属性

    removeAttribute

    删除域属性

    getAttributeNames

    获取所有域属性的名称

                            eg:l利用功能2实现跳转到JSP页面

                                                request.getRequestDispatcher("/index.jsp").forward(request, response);

                              <body>
                              姓名:<%= request.getAttribute("name") %>
                              年龄:<%= request.getAttribute("age") %>
                              </body>

    b.生命周期:一次请求开始请求对象产生,一次请求结束请求对象消亡

    c.作用范围整个请求链就是request的作用范围。

    d.主要功能:在整个请求链中实现资源的共享。

    response对象

    向浏览器发送数据

    乱码处理

      getOutputStream()

      getWriter()

    1)字节流

      //发送数据使用的是工程的字符集gbk,浏览器解码数据使用的也是 gbk,所以不会出现乱码。

      response.getOutputStream().write("中国".getBytes());

      //通过设置响应头去通知浏览器使用utf-8字符集接收数据。应该在发送数据之前设置。

      response.setHeader("Content-type", "text/html;charset=utf-8");                 response.getOutputStream().write("中国".getBytes("utf-8"));

    2)字符流

        字符流在发送到浏览器的过程中,仍然是以字节流的形式进行发送,这时会调用服务器中默认的字符集来发送,会使用iso8859-1。

        通知服务器使用utf-8字符集发送数据。

    response.setCharacterEncoding("utf-8");

       通知浏览器使用utf-8字符集接收数据

    response.setHeader("Content-type", "text/html;charset=utf-8");

    3) 单独书写词句也可是实现响应数据中的乱码处理在通知浏览器的过程中,服务器会自动读取通知浏览器使用的字符集,进而使用读取到的字符集发送数据。

      response.setContentType("text/html;charset=utf-8");

      <==>

      response.setHeader("Content-type","text/html;charset=utf-8");

    4)不论是字节流还是字符流,都可以通过通知浏览器使用utf-8的方式解决乱码问题。

      注意:response中字节流和字符流不可以同时使用。

      注意:getOutputStream和getWriter两个流,不需要用户手动关闭,如果手动关闭可能会出现异常。

      注意:response对象不是直接向浏览器输出数据,而是将数据先存储在

    response缓冲区中,再组织称一定结构才发送到了浏览器。

    一.response实现重新定向

    原理:

      302状态码+location响应头来实现

      response.setStatus(302);

      response.setHeader("location","http://www.baidu.com")

    也可以简写成response.sendRedirect("http://www.baidu.com")

        response.sendRedirect(request.getContextPath()+"/servlet/ResponseDemo2");

    特点:

      1.两次响应两次请求

      2.两个请求对象和两个响应对象。服务器之间的资源跳转。浏览器地址会发生变化

    二.response实现定时刷新

    原理:设置一个响应头,其中需要设置两部分内容

    a.设置一个秒值

    b.设置一个刷新后跳转的地址。

    实现:

      response.setHead(“refresh“,”3;url=http://www.tmooc.cn");

    特点:

      1.两次请求两次响应

      2.两个请求对象和两个响应对象,服务器之间的资源跳转。浏览器地址会发生变化

  • 相关阅读:
    关于自发电的一些想法
    折腾了一个晚上的业余时间,终于把一块廉价的tftlcd连到了我的树莓派上
    关于飞行器从外太空返回地球时候的减速器的思考与假象
    echart漏斗图背景多出一个方框的问题解决,浪费了两个小时的教训
    linux加密文件系统 fsck 无法修复一例
    天津
    [转]Bitmap图片缩放
    python spark 配置
    screen
    tar 命令
  • 原文地址:https://www.cnblogs.com/akic/p/10679771.html
Copyright © 2020-2023  润新知