request&reponse

Request对象

Request理解

  • request是由tomcat创建的,request对象是来获取请求信息主要是用于获取请求行、请求头、请求体中的数据

Request对象的体系

  • ServletRequest 接口 继承
  • HttpServletRequest子接口 实现
  • org.apache.catalina.connector.RequestFacade 实现类

Request作用

  • 接收客户端的请求,获取请求中的信息。除了可以获取请求中携带的数据之外,还可以获取比如主机地址、端口、请求方式、项目名称等一系列信息。

  • 请求分类:请求行、请求头、请求体

  • 获取请求行数据

    • 请求行中,可以通过request对象的相应方法获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。

    • 示例

      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * @author: ChengLong
       * @version: 11.0.2
       * @datetime: 2021/8/17 9:12
       */
      /*
      * 请求行数据获取
      *
      * */
      @WebServlet("/rd1")
      public class Request_Demo01 extends HttpServlet {
          @Override
          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              String scheme = req.getScheme();
              System.out.println("协议:"+scheme);
              System.out.println("服务名称:"+req.getServerName());
              System.out.println("端口号:"+req.getServerPort());
              System.out.println("项目名称:"+req.getContextPath());   //必须掌握
              System.out.println("请求方式:"+req.getMethod());    //必须掌握
              System.out.println("获取查询参数:"+req.getQueryString());
              System.out.println("不包含协议和端口:"+req.getRequestURI());
              System.out.println("包含协议和端口:"+req.getRequestURL());     //必须掌握
          }
      }
      
      
  • 获取请求头数据

    • 请求头是当前对用户发送的数据的描述信息。

    • 请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。

    • 如果想查看请求头信息,也可以在Servlet中requeqt通过getHeader方法获取。

    • 获取请求头数据的方法

      方法名 描述
      String getHeader(String name) 根据请求头的名称获取请求头信息
      Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举
    • 示例

      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.util.Enumeration;
      
      /**
       * @author: ChengLong
       * @version: 11.0.2
       * @datetime: 2021/8/17 9:31
       */
      
      /*
      * 请求头数据获取
      *       request.getHeader("name")   根据请求头的key获取请求头的value
      *       request.getHeaderNames()    获取所有请求头的key
      * */
      @WebServlet("/rd3")
      public class Request_Demo03 extends HttpServlet {
          @Override
          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //        根据请求头的key获取请求头的value
              System.out.println("主机地址"+req.getHeader("Host"));
      
              //获取所有请求头的key
              Enumeration<String> names = req.getHeaderNames();
      
              while (names.hasMoreElements()){
                  String key = names.nextElement();
                  //System.out.println("所有请求头的key"+key);
                  String value = req.getHeader(key);
                  System.out.println(key+":"+value);
              }
          }
      }
      
      
  • 获取请求正文(体)数据

    • 获取请求参数(必会)

      • 只有post请求方式,才有请求体,在请求头中封装了post请求参数

        方法名 描述
        String getParameter(String name) 根据参数名获取参数值
        String[] getParameterValues(String name) 根据参数名获取参数值(可以是多个值)
        Enumeration getPatameterNames() 获取所有的参数名
        Map<String,String[]> getParameterMap() 获取所有参数的map集合
      • 示例

        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        import java.util.Arrays;
        import java.util.Enumeration;
        import java.util.Map;
        import java.util.Set;
        
        /**
         * @author: ChengLong
         * @version: 11.0.2
         * @datetime: 2021/8/17 9:50
         */
        
        /*
                get:请求参数包含中文不会出现乱码
                    原因:tomcat8版本以上自动将get请求乱码自动解码
                post:请求体中如果包含中文会出现乱码
                       原因:编码和解码的方式不一致。页面编码是utf-8类型,而request默认解码类型iso-8859-1
                       req.setCharacterEncoding("utf-8")        在接收前写
        *   请求体的数据获取
        *           req.getParameter(key)   根据一个键获取一个值
        *           req.getParameterValues(key) 根据请求体中一个键获取多个值
        *           req.getParameterMap() 将请求体中所有的数据收到map中
        * */
        @WebServlet("/rd4")
        public class Request_Demo04 extends HttpServlet {
            @Override
            protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                req.setCharacterEncoding("utf-8");
                String username = req.getParameter("username");
                String password = req.getParameter("password");
                String sex = req.getParameter("sex");
                String[] hobbies = req.getParameterValues("hobby");
                String work = req.getParameter("work");
                String grjj = req.getParameter("grjj");
                System.out.println(username);
                System.out.println(password);
                System.out.println(sex);
                System.out.println(Arrays.toString(hobbies));
                System.out.println(work);
                System.out.println(grjj);
        
                Map<String, String[]> map = req.getParameterMap();
                Set<Map.Entry<String, String[]>> entries = map.entrySet();
        
        
                for (Map.Entry<String, String[]> entry : entries) {
                    System.out.println(entry.getKey()+":"+Arrays.toString(entry.getValue()));
                }
        
                //获取所有的key
                Enumeration<String> parameterNames = req.getParameterNames();
                while (parameterNames.hasMoreElements()){
                    System.out.println(parameterNames.nextElement());
                }
            }
        }
        
        
    • 中文乱码

      • get:请求参数如果包含中文不会出现乱码
        在tomcat8版本以上自动将get请求乱码默认解码
      • post:请求体中如果包含中文会出现乱码
        编码和解码方式不同造成,页面的编码是utf-8类型,而request默认解码类型iso-8859-1
        解决:request.setCharacterEncoding("utf-8") 这行代码一定要放在接收参数之前设置
  • 获取ServletContext对象

    • 示例

      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * @author: ChengLong
       * @version: 11.0.2
       * @datetime: 2021/8/17 15:33
       */
      
      /*获取方式一
      * req.getServletContext();
      * 获取方式二
      * getServletContext();
      *
      *域对象
              setAttribute(string,object) 存数据
              getAttribute(string) 根据键取值
              removeAttribute(string) 根据key移除值
      *
      * */
      @WebServlet("/scd1")
      public class ServletContextDemo01 extends HttpServlet {
          @Override
          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //        获取方式一
              ServletContext con = req.getServletContext();
              System.out.println(con);
      //        获取方式二
              ServletContext servletContext = getServletContext();
              con.setAttribute("msg","这个对象是真简单啊");
              System.out.println(servletContext);
          }
      }
      
      
  • 域对象:共享数据

    • 域对象:可以实现不同组件之间的数据共享、实现servlet与servlet之间数据共享、servlet与jsp页面直接数据共享

    • request请求域对象:一次请求有效

    • session会话对象:一次会话有效(浏览器不关闭默认情况下30分钟后session中存放的数据也会消失)

    • ServletContext应用域对象:每一个web应用都有一个唯一ServletContext对象、服务器不关闭数据不小数

    • 常用方法

      方法名 描述
      void setAttribute(String name,Object obj) 向作用域中存储数据
      Object getAttribute(String name) 从作用域中获取数据
      void removeAttribute(String name) 从作用域中移除数据
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author: ChengLong
     * @version: 11.0.2
     * @datetime: 2021/8/17 10:37
     */
    
    /*
    * request域对象
    *       一次请求有效
    *           setAttribute(str,object)    向域对象中添加值
    *           getAttribute(str)   根据域对象的key获取域对象值
    *           removeAttribute(str)    根据key移除域对象的值
    * */
    @WebServlet("/rd6")
    public class Request_Demo06 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //存值
            req.setAttribute("msg","这个域对象非常的简单");
            //取值
            String msg =  (String) req.getAttribute("msg");
            System.out.println(msg);
    
            //移除值
            req.removeAttribute(msg);
        }
    }
    
    
  • 请求转发

    • 理解

      • 一种在服务器内部资源跳转的方式。浏览器请求ServletA资源时,ServletA资源不足或者没有资源,ServletA请求其他的资源然后响应给浏览器,这个过程叫转发;
    • 特点

    • 一次请求一次响应

      • 请求转发地址栏不用加项目名
      • 请求转发不能访问外网
      • 浏览器地址栏不会发生变化
      • 可以共享request域中的数据

Reponse对象

Response理解

  • response是由tomcat创建的
  • response对象是来设置响应信息

Response对象的体系

  • ServletResponse 接口 继承
  • HttpServletResponse子接口 实现
  • org.apache.catalina.connector.ResponseFacade 实现类

Response作用

  • 针对页面发送的请求做出数据响应,向页面输出信息,包括文本、图片、视频等。

  • 响应分类:响应行、响应头、响应体。

  • 设置响应行

    • 响应行中包含的信息:可以通过开发者模式F12-Network查看

    • 响应行包含协议和状态码

    • 状态码

      • 1xx -信息,服务器收到请求,需要请求者继续执行操作

      • 2xx -成功,操作被成功接收并处理

      • 3xx -重定向,需要进一步的操作以完成请求

      • 4xx -客户端错误,请求包含语法错误或无法完成请求

      • 5xx -服务器错误,服务器在处理请求的过程中发生了错误

      • 常见状态码

        • 200 响应成功

        • 404 表示请求资源找不到

          • 浏览器访问路径错误
          • tomcat服务未开启,项目没有部署到tomcat服务器中
          • 你要访问的页面资源在WEB-INF文件夹中,无法访问
        • 401 未授权

        • 302 资源重定向

        • 500 表示服务器端代码出错,可以通过控制台查看异常消息

        • response.sendError(sc, msg)来设置状态信息,但一般不会手动设置,仅用来做测试。

    • 设置响应头

      • 响应头:服务器通知浏览器的一些信息
      • 在浏览器中打开network工具时,每一次的请求响应数据,都可以被捕捉到,而在内容中Response Headers 中的内容就是当前这一次请求响应的响应头信息。
      • response.setHeader(String name, String value):一个关键字对应一个值,如果设置了多个值,则会覆盖。
      • response.addHeader(String name, String value);一个关键字可以对应多个值
      • 在实际开发中,同一个响应头信息只会对应一个值,所以在使用时一般没什么区别
      • refresh:完成定时跳转
      • Content-Type: 响应内容的MIME类型 (text/html;charset=utf-8) image/jpg
      • Content-Length: 响应体的长度(在UTF-8的编码格式下,一个汉字对应3个字节)
      • Date: 发送响应的开始时间
      • Content-Disposition:告诉浏览器以下载方式打开数据(做文件下载时使用)
    • 设置响应体

      • 响应的数据就是响应体。响应对象response在返回数据、响应数据的时候,会将一些HTML、text、流数据等信息通过响应主体返回给页面,而响应体绝大多数都是文本类型

      • 响应数据需要通过流来进行数据传输,而response自带的流有两个

        • response.getWriter().write()
          response.getWriter().print()
        • response.getOutputStream
        • 注意:这两个流不能同时存在。
    • 重定向

      • 理解

        • 重定向是客户端行为,当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象会自动销毁,所以两次请求的request对象并非同一个,所以两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应。
      • 实现

      • 特点

        • 多次请求多次响应
        • 可以访问外网
        • 浏览器地址栏会发生变化
        • 不可以携带request域对象中数据
        • 重定向路径必须加项目名

ServletContext对象

  • ServletContext理解

    • ServletContext是servlet中最大的域对象成为应用域
    • 当tomcat服务器启动的时候、tomcat会为部署在webapps中每一个web应用创建一个ServletContext对象来表示当前项目上下文环境。(每一个项目都有一个唯一的ServletContext对象),它作为最大的共享域、里面包含的数据直到服务器关闭对象销毁数据才丢失
    • 域对象:实现不同组件的数据共享、servlet与servlet数据共享、servlet与页面jsp直接的数据共享
    • setAttibute(string,object) 存数据
    • getAttibute(key) 根据键取值
    • removeAttibute(key) 根据key移除值
  • ServletContext的获取

    • request.getServletContext(); 推荐
    • getServletContext();
  • ServletContext的作用

    • 获取MIME类型

      • MIME类型:在互联网中通信过程中定义一种文件数据类型
    • 格式:
      大类型/小类型 如 text/html image/jpg video/mp4

      • 获取方法:
        String getMimeType(String file)
          import javax.servlet.ServletContext;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          
          /**
           * @author: ChengLong
           * @version: 11.0.2
           * @datetime: 2021/8/17 21:28
           */
          /*
              判断文件类型
                context.getMimeType(文件名)
           */
          @WebServlet("/scd3")
          public class ServletContextDemo03 extends HttpServlet {
              @Override
              protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  ServletContext context = getServletContext();
                  String a1 = "a.jpg";
                  String type = context.getMimeType(a1);
                  System.out.println(type);
                  String b1 = "a2.mp4";
                  String type1 = context.getMimeType(b1);
                  System.out.println(type1);
              }
          }
      
      • 域对象:共享数据

        • ServletContext是一个全局作用域对象,在整个Web应用内所有用户所有请求的数据(周期长)。
        • request作用域仅限于一次请求范围内可以实现信息的共享,一次请求结束,request对象消失,内部的值也随之消失,周期短,但效率高,不会占用过多的内存资源;而ServletContext是一个全局作用域对象,整个web项目的所有组件(Servlet、jsp)共享信息,周期长,可用来保存所有web组件之间需要共享的信息。它在tomcat服务器启动时创建,关闭时销毁。
      • 获取文件的真实路径

        • getRealPath("web下的资源路径");

          import javax.servlet.ServletContext;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          
          /**
           * @author: ChengLong
           * @version: 11.0.2
           * @datetime: 2021/8/17 15:33
           */
          
          /*ServletContext  获取任意路径的资源在服务器中真实路径
          src下a.txt文件
          *
          * */
          @WebServlet("/scd4")
          public class ServletContextDemo04 extends HttpServlet {
              @Override
              protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  ServletContext servletContext = getServletContext();
          
                  //获取src目录下文件在服务器中真实路径
                  String path = servletContext.getRealPath("/WEB-INF/classes/a.txt");
                  System.out.println(path);   // D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\WEB-INF\classes\a.txt
          
                  //获取html目录下在服务器中真实路径
                  String path1 = servletContext.getRealPath("/html/b.txt");
                  System.out.println(path1);  //D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\html\b.txt
          
                  //获取根路径下文件在服务器中真实路径
                  String path2 = servletContext.getRealPath("c.txt");
                  System.out.println(path2);  // D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\c.txt
          
                  /*
                  D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\WEB-INF\classes\a.txt
                  D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\html\b.txt
                  D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\c.txt
                  */
              }
          }
          
          
posted @ 2021-08-17 21:49  Lucky_龍  阅读(99)  评论(0)    收藏  举报