• 2.Servlet 请求、响应及重定向


    PS:以下仅为个人学习笔记,涩及方面略窄 

    #######################     Request     #######################

    /**
    *    request代表用户通过浏览器发起的请求:
    *    Request对象将浏览器发送来的Http请求
    *    解析为对象的属性.只要使用request对象
    *    的方法就可以获取Http请求的全部信息
    */

    1. 获取请求头的名称

     Enumeration<String> names = req.getHeaderNames(); 

    request中有一个 getHeaderNames()方法,用来获取全部请求头的名称

    返回值是一个Enumeration(枚举,java老旧的一种迭代器,现被Iterator替代)

    2. 可通过HeaderNames获取对应请求头

     可以获得 ->

    主机IP和端口,连接方式,缓存控制,用户代理 等信息.

    while (names.hasMoreElements()) {
          String name = names.nextElement();
          System.out.println(name+": "+req.getHeader(name));
    }

    由于Enumeration有着迭代器的性质,可以通过迭代获取所有信息,控制台输出举例如下:

    host: localhost:8088
    connection: keep-alive
    cache-control: max-age=0
    user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
    upgrade-insecure-requests: 1
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    accept-encoding: gzip, deflate, br
    accept-language: zh-CN,zh;q=0.9

    3. URI 和 URL区别

    String uri = req.getRequestURI();
    StringBuffer utl = req.getRequestURL();
    System.out.println(
    "uri: "+uri); System.out.println("url: "+utl.toString());

    URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。

    (可以理解成一个资源名)

    而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

    (可以理解成一个资源的完整名称,包括文件所在位置)

    至于区别输出如下:

    uri: /Dpl_7_Servlet/request  

    url: http://localhost:8088/Dpl_7_Servlet/request
                     (项目名)    (servlet名)

    4.如何读取请求参数值?

    (1)request提供的getParameter方法。

    String  getParameter(String paramName);
    注:
        a.如果请求参数名写错,会返回null值。
        b.如果不填写任何数据,会获得空字符串。

    (2)request提供的getParameterValues

    #######################     Response     #######################

    /**
    *   任何发送到浏览器的响应信息都可以
    * 利用response对象来设置并且发送到客户端
    */

    # 设置响应状态码 (就是设置响应状态行)

     response.setStatus(200); 

    HTTP协议中有多种状态码:如 200-请求成功 404-请求失败,未找到资源 500-服务器遭遇错误 等


    # 设置响应头部
     response.setContentType("text/html;charset=utf-8"); 

    text/html: 代表响应类型

    charset=utf-8:  浏览器在解码时会使用不同的编码,这里设置编码是给浏览器解码时统一的编码

    # 设置响应Body中的编码

     response.setCharacterEncoding("UTF-8"); 

    在输出时,默认使用iso-8859-1来编码,所以在Servlset输出

    中文时会乱码,为了解决乱码问题会使用response设置字符编码


    # 发送body内容,利用流发送
    //使用Printwriter 发送文本

    1 PrintWriter pw = response.getWriter();
    
    2 pw.println("世界你好!"); 

     

    //使用OutputStream 发送非文本(如图片等)

         
        //获取文件输入流

          BufferedInputStream bis

            = new BufferedInputStream(
                new FileInputStream(
                    new File("1.jpg")));

         //响应状态行
            response.setStatus(200);
            //发送响应头
            response.setContentType("image/jpg");
            response.setContentLength((int)pngFile.length());
            //发送body
            OutputStream out = response.getOutputStream();
            int b ;
            while( (b=bis.read())!=-1){
                out.write(b);
            }
            bis.close();
            out.close();

    #######################     重定向     #######################

    (1)什么是重定向?

    服务器通知浏览器,向一个新地址发送请求。
    注:
        服务器可以发送一个302状态码以及一个location消息头(
        值是一个地址,称之为重定向地址)给浏览器,浏览器收到之
        后,会立即向重定向地址发送请求。

    (2)如何重定向?

    response.sendRedirect(String url);
    注:url就是重定向地址。
    注: 重定向之前,容器会清空response对象上存放的所有数据。
    也就是说,实体内容里面是没有任何数据的。

    (3)特点

    a.重定向地址是任意的。
    b.重定向之后浏览器地址会发生变化。  

    2.Servlet容器如何处理请求资源路径?

    比如 http://ip:port/servlet-day03/abc.html
    "/servlet-day03/abc.html"
    step1. 容器默认会认为访问的是一个servlet
        即查找和"/abc.html"匹配的servlet。
    注:
        匹配规则:
        a.精确匹配:
                <url-pattern>/abc.html</url-pattern>
        b.通配符匹配:
                <url-pattern>/*</url-pattern>
                <url-pattern>/demo/*</url-pattern>
            *:匹配零个或者多个任意的字符。
        c.后缀匹配:
                <url-pattern>*.do</url-pattern>
            *.do  匹配所有以.do结尾的请求。
    step2.如果找不到匹配的servlet,则访问对应的文件。
        找到了就返回该文件。如果找不到,返回404。  

    3.如何让一个servlet处理多种请求?

    step1. 采用后缀匹配。
    step2. 分析请求资源路径,依据分析结果,来调用
        不同的分支来处理。
  • 相关阅读:
    2019-10-14-云之幻-UWP-视频教程
    2019-10-14-云之幻-UWP-视频教程
    2018-2-13-win10-uwp-自定义控件-SplitViewItem
    2018-2-13-win10-uwp-自定义控件-SplitViewItem
    2019-9-19-dotnet-找不到-PostAsJsonAsync-方法
    2019-9-19-dotnet-找不到-PostAsJsonAsync-方法
    2018-5-28-WPF-Process.Start-出现-Win32Exception-异常
    2018-5-28-WPF-Process.Start-出现-Win32Exception-异常
    Java实现 LeetCode 606 根据二叉树创建字符串(遍历树)
    Java实现 LeetCode 606 根据二叉树创建字符串(遍历树)
  • 原文地址:https://www.cnblogs.com/dpl9963/p/7889246.html
Copyright © 2020-2023  润新知