• 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. 分析请求资源路径,依据分析结果,来调用
        不同的分支来处理。
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/dpl9963/p/7889246.html
Copyright © 2020-2023  润新知