• 9.response


           1. response概述

                  代表HTTP响应。

           2. response继承结构

                  ServletResponse  

                  |

                  |---HttpServletResponse   在基础的response接口之上添加了HTTP协议相关的内容,善于HTTP协议相关开发。

           3. response组成

      状态行  HTTP协议版本   状态码 200 原因叙述OK
    多个响应头 location      refresh       Expires  Cache-control pragma
     一个空行   
     响应实体内容 响应数据  HTML   json

                  302 +location   请求重定向

                  304    缓存

                  404    资源路径不存在

                  500   服务器报错

           4. response操作

           § 设置状态码的方法

                  void setStatus(int sc)   

                   void setStatus(int sc, String sm)  // sc设置状态码,设置状态描述

           § 设置响应头的方法

                  void setHeader(String name, String value)

                  void setDateHeader(String name, long date)

                  void setIntHeader(String name, int value)

                  void addHeader(String name, String value)

                  void addDateHeader(String name, long date)

                  void addIntHeader(String name, int value)

           § 设置响应内容的方法

                  ServletOutputStream getOutputStream() // 调用这两个方法就是将数据写到缓存中去

                  PrintWriter getWriter()

    response功能一---解决乱码

           1. response

                  在response的响应实体内容中,可能会包含中文,这样就可能需要进行乱码处理。在面对response的字节流和字符流时,有不同的处理方法。

                  a. 字节流

                         response.getOutputStream()以字节流的形式发送数据,

                         i. 在将字符转换为byte类型数据时,如果采用默认的平台(myeclipse的默认编码)码GBK。则直接发送到浏览器不会产生乱码。因为浏览器也是GBK字符集。两者统一。

                                   getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表

                        

                         ii. 在字符转换为byte类型数据时,使用utf-8进行转换,那么浏览器接收数据必须也是utf-8字符集。所以应该通知浏览器使用utf-8接收。通知浏览器的方式:

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

                  b. 字符流

                         response.getWriter()以字符流的形式发送数据。

                         i. 服务器在发送字符流数据的时候,底层仍然是以字节流的形式发送。发送是会采用当前服务器默认的字符集转换字符为字节,所以会使用iso8859-1来编码数据。相当于他自己自动调用了getOutputStream()

                         ii. 浏览器接收数据是GBK,现在要求服务器发送数据和浏览器接收数据都是用utf-8。所以需要通知服务器使用utf-8发送数据,及通知浏览器使用utf-8接收数据

                                //通知服务器发送数据时的字符集

                                response.setCharacterEncoding("utf-8");

                                //通知浏览器接收数据时的字符集

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

                         iii. 总结:

                                1) 在通知浏览器使用某一字符集接收数据时,服务器会自动采用此字符集来发送数据。

                                2) 不论是字节流还是字符流,都通过通知浏览使用utf-8字符集这种形式,来解决乱码问题。

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

                                当服务器检测到你叫浏览器用utf-8编码接受,这时候服务器就自动的用utf-8像浏览器发送数据,所以一句话就好

                                <==>

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

                               

                         iv. 注意:

                                1) 乱码处理的语句需要放在所有的响应内容之前。

                                2) 字节流和字符流不能同时使用。因为字符流发送数据,服务器是转换为字节流,所以你采用两种流一块用的话,服务器就不知道到底要不要转换

                                3) 不要关闭字节流和字符流,会导致服务器异常。浏览器会自动结束这些流。

    response功能二---请求重定向

           1. 请求重定向

                  是一种资源跳转方式。可以在不同服务器之间进行跳转。

     

                  a. 实现原理

    //请求重定向实现
    public class ResponseDemo2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //实现原理:302+location
            response.setStatus(302); //设置为302状态码
    //        response.setHeader("location", "/day09-reqres/servlet/RequestDemo9");//这是相同服务器的跳转
    //        response.setHeader("location", "http://www.tmooc.cn"); //不同服务器的跳转
            response.sendRedirect("http://www.csdn.net"); //也可以用这个写法
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
    
        }
    
    }

    response功能三--定时刷新 

        1. 定时刷新

            是一种资源跳转方式。可以在服务器之间进行跳转。

     

           a. 也可以服务器内进行跳转

           b. 实现原理

               设置refresh响应头

           c. 代码实现

             

      //处理响应乱码
    
                       response.setContentType("text/html;charset=utf-8");
    
                       //设置响应内容
    
                       response.getWriter().write("<h3 align='center'><font color='red'>恭喜注册成功,3秒之后跳转</font></h3>");
    
                       //定时刷新实现原理:设置refresh响应头
    
                       response.setHeader("refresh", "3;url=http://www.tmooc.cn"); //3是设置3秒,分号后面是跳转的路

    三种资源跳转方式总结 

           1. 请求转发--request

                 

                  请求转发的特点:

                         一次请求 一次响应

                         一个请求对象 一个响应对象

                         服务器内部的资源跳转方式(其实仅限于当前web应用内部)

                         浏览器地址栏不发生改变

           2. 请求重定向--response

                 

                  请求重定向特点:

                         两次请求  两次响应

                         两个请求对象 两个响应对象

                         服务器之间的资源跳转方式

                         浏览器地址栏会发生变化

           3. 定时刷新--response

                 

                  定时刷新的特点:

                         两次请求  两次响应

                         两个请求对象 两个响应对象

                         服务器之间的资源跳转方式

                         浏览器地址栏会发生变化

                  a. 定时刷新和请求重定向到区别:

                         定时刷新会经过指定时间之后再跳转。定时刷新是通过refresh响应头实现。

                         请求重定向会在执行时立刻发生跳转。请求重定向是通过302状态码加上location响应头实现。

           4. ~情景

                  a. 要求在同一个服务器内部跳转?

                         请求转发、请求重定向、定时刷新都能实现。

                  b. 要求在不同不服务器之间跳转?

                         请求重定向、定时刷新都可以实现。

                  c. 要求地址栏不发生变化?

                         请求转发

                  d. 要求地址栏发生变化?

                         请求重定向、定时刷新都可以实现。

                         i. 要求经过指定时间之后再跳转?

                                定时刷新可以实现。

                         ii. 立刻跳转的情景

                                搜索、查阅商品信息

                         iii. 经过指定时间的情景

                                转账,购物、注册

  • 相关阅读:
    2018.11.16 RX- IC
    第15.29节 PyQt(Python+Qt)入门学习:containers容器类部件QScrollArea滚动区域详解
    PyQt(Python+Qt)学习随笔:QTabWidget部件选项卡可用状态访问方法isTabEnabled、setTabEnabled
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的tabBar、count、indexOf方法
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的currentWidget和widget方法
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件移除选项卡的removeTab和clear方法
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件添加选项卡的addTab和insertTab方法
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件设置tabsClosable后不能关闭选项卡的原因
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件的documentMode属性作用
    PyQt(Python+Qt)学习随笔:QTabWidget选项卡部件概述和属性介绍
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11348579.html
Copyright © 2020-2023  润新知