天天看点

JavaWeb学习笔记-part2

HTTP网络协议包

  • 网络协议包:
    • 在网络中传递信息都是以二进制形式存在的
    • 接收方浏览器/服务器在接收到信息后,要做的第一件事就是将二进制数据进行编译成文字、图片、视频、命令
    • 传递信息数据量往往比较巨大,导致接收方很难在一组连续二进制得到对应数据
    • 网络协议包是一组有规律的二进制数据,在这组数据存在固定空间,每一个空间专门存放特定信息,这样接收方在接收到网络协议包之后就可以到固定空间得到对应信息,网络协议包出现极大降低了接收方对接收二进制数据编译难度
  • 常见网络协议包:
    • FTP网络协议包(文件传输协议)
    • HTTP网络协议包(超文本传输协议)

      在基于B/S结构下互联网通信过程中,所有网络中传递信息都是保存在HTTP网络协议包

      • 分类:
        • HTTP请求协议包

          在浏览器准备发送请求时,负责创建与一个HTTP请求协议包

          浏览器将请求信息以二进制形式保存在HTTP请求协议包各个空间

          由浏览器负责将HTTP请求协议包推送到指定服务端计算机

          • 内部空间:
            1. 按照自上而下去划分,分为四个空间
            2. 空间划分:

              请求行:包括URL(请求地址)和method(请求方式)

              请求头:包括请求参数信息(GET)

              空白行(不可见):没有任何内容,起到隔离作用

              请求体(不可见):包括请求参数信息(POST)

        • HTTP响应协议包

          HTTP服务器在定位到被访问的资源文件之后,负责创建一个HTTP响应协议包

          HTTP服务器将定位文件内容或者文件命令以二进制形式写入到HTTP响应协议包各个空间

          由HTTP服务器负责将HTTP响应协议包推送回发起请求的浏览器上

          • 内部空间:
            1. 按照自上而下去划分,分为四个空间
            2. 空间划分:

              状态行:包括HTTP状态码

              响应头:包括content-type(内容类型属性)指定浏览器采用对应编译器对响应体中的二进制数据进行解析

              空白行:没有任何内容,起到隔离作用

              响应体:可能包括被访问的静态资源文件内容、静态资源文件命令、动态资源文件运行结果(二进制形式)

HTTP服务器

  • 服务器:是一种安装在服务端计算机的资源文件调度器,每一种服务器专门接受特定的请求协议。对特定的文件进行调度管理。
  • HTTP服务器是服务器中一种,其行为和HTTP协议相关
  • HTTP服务器可以接收来自浏览器发送的HTTP请求协议包,并自动对HTTP请求协议包内容进行解析
  • 解析后,自动定位被访问的文件,并将定位的文件内容写入到HTTP响应协议包中
  • 最后,负责将HTTP响应协议包推送回发起请求的浏览器上
  • 分类:
    • JBOSS服务器:不支持servlet/JSP规范,一般和Tomcat和Jetty绑定使用
    • Glassfish服务器(开发中):未来可期,颠覆式的改变现如今的服务器体系。
    • Jetty服务器:
    • Weblogic服务器:
    • Websphere服务器:目前最强大的web服务器,往往运用在电子商务应用领域。主要安装在Linux中
    • Tomcat服务器:轻量化且标准化规范,但不适用于中大型系统和高并发状态,因此往往安装在个人计算机中以模拟B/S互联网通讯流程。

Tomcat服务器

  • Tomcat服务器内部工作文件作用:
    • bin文件夹:Tomcat管理命令
    • conf文件夹:Tomcat配置文件
    • lib文件夹:Tomcat使用的jar
    • logs文件夹:Tomcat日志信息
    • temp文件夹:Tomcat临时文件
    • webapps文件夹:Tomcat默认资源文件
    • work文件夹:Tomcat工作空间

创建网站

  • 步骤略
  • 网站内部结构
    • src文件夹:存放作为动态资源文件的Java文件
    • web文件夹:

      存放作为静态资源文件图片、HTML、CSS、js;

      存放网站运行时依赖的jar MYSQL驱动;

      存放网站的核心配置文件(web.xml)

      • WEB-INF:依赖的jar MYSQL驱动/核心配置文件
        • lib文件夹:依赖的jar MYSQL驱动
        • web.xml:通知Tomcat当前网站那些Java类是

Servlet规范

  • Servlet规范来自于JAVAEE规范中的一种
  • 作用:
    • 在Servlet规范中,指定动态资源文件开发步骤
    • 在Servlet规范中,指定HTTP服务器调用动态资源文件的规则
    • 在Servlet规范中,指定HTTP服务器管理动态资源文件实例对象规则
  • Servlet接口实现类:
    • Servlet接口来自于Servlet规范下的一个接口,这个接口存在HTTP服务器提供jar包
    • Tomcat服务器下lib文件有一个Servlet-api.jar存放servlet接口(javax.servlet.Servlet接口)
    • Servlet规范中认为,HTTP服务器能调用的动态资源文件必须是一个Servlet接口实现类
    • 包含的方法:
      • init
      • getServletConfig
      • service——唯一有用需要我们自己实现的方法
      • getServletInfo
      • destroy
  • Tomcat根据Servlet规范调用Servlet接口实现类规则:
    • Tomcat有权创建Servlet接口实现类实例对象:

      Servlet oneServlet = new OneServlet();

    • Tomcat根据实例对象调用service方法处理当前请求:

      oneServlet.service();

    • service方法实际是由父类HttpServlet实现的,大体为:
      void service() {
          Method method = getMethod();
          if(method == "GET") {
              this.doGet();
          } else if(method == "POST") {
              this.doPost();
          }
      }      
    • 在子类OneServlet中实现doGet或doPost方法
    • 通过父类决定在何种情况下调用子类中的方法——设计模式——模板设计模式
  • Servlet接口实现类开发步骤
    • 创建一个java类继承于HttpServlet父类,使之成为一个Servlet接口实现类
    • 重写HttpServlet父类两个方法:doGet或者doPost
    • 将Servlet接口实现类信息注册到Tomcat服务器:

      网站==>web==>WEB-INF==>web.xml

      <!--将servlet接口实现类类路径地址交给Tomcat-->
      <servlet>
          <servlet-name>one</servlet-name><!--声明一个变量储存servlet接口实现类路径-->
          <servlet-class>com.pjh.controller.OneServlet</servlet-class><!--声明一个servlet接口实现类路径-->
      </servlet>
      ​
      <!--
          此时
          Tomcat String one = "com.pjh.controller.OneServlet"
          为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名
      -->
      <servlet-mapping>
          <servlet-name>one</servlet-name>
          <url-pattern>/one</url-pattern><!--设置简短的请求别名,别名在书写时必须以/开头-->
      </servlet-mapping>      
  • Servlet对象生命周期:
    • 网站中所有的Servlet接口实现类的实例对象,都是由HTTP服务器负责创建

      开发人员不能手动创建Servlet接口实现类的实例对象

    • 在默认情况下,HTTP服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象

      在手动配置情况下,要求HTTP服务器在启动时自动创建某个Servlet接口实现类的实例对象

      <servlet>
          <servlet-name>one</servlet-name><!--声明一个变量储存servlet接口实现类路径-->
          <servlet-class>com.pjh.controller.OneServlet</servlet-class><!--声明一个servlet接口实现类路径-->
          <load-on-startup>30</load-on-startup><!--填写一个大于0的整数即可-->
      </servlet>      
    • 在HTTP服务器运行期间,一个Servlet接口实现类只能被创建一个实例对象
    • 在HTTP服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
  • HttpServletResponse接口和HttpServletRequest接口
    • HttpServletResponse接口:
      • HttpServletResponse接口来自于Servlet规范中,存在于Tomcat的servlet-api.jar中
      • HttpServletResponse接口实现类由Http服务器负责提供
      • HttpServletResponse接口负责将doGet或者doPost方法执行结果写入到响应体交给浏览器
      • 开发人员习惯于将HttpServletResponse接口修饰的对象称为响应对象
      • 主要功能:
        1. 将执行结果以二进制形式写入到响应体中
        2. 设置响应头中content-type属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为文字、图片、视频、命令
        3. 设置响应头中location属性,将一个请求地址赋值给location从而控制浏览器向指定服务器发送请求
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String result = "Hello World";
            //响应对象将结果写入到响应体中——start
                //通过响应对象向Tomcat索要输出流
                PrintWriter out = response.getWriter();
                //通过输出流,将执行结果以二进制形式写入响应体中
                out.write(result);
                //或者out.print(); 会将一切数据当作字符串打印出来
                //而write会将数字当作ascii码
        }      
      • 浏览器在接收到相应包之后,根据响应头中content-type属性的值,来采用对应编译器对响应体中二进制内容进行编译处理,在默认情况下,content-type属性的值为"text",此时浏览器会采用文本编译器对响应体二进制数据进行解析。

        因此若需要编译命令,则一定要在得到输出流之前,通过响应对象对响应头中的content-type属性进行一次重新赋值用来指定浏览器采用正确的编译器

      • 通过sendRedirect方法可以远程控制浏览器请求行为:请求地址,请求方式,请求参数。例如,当响应头中存在location属性,则会自动通过地址栏向location指定网站发送请求。
    • HttpServletRequest接口
      • HttpServletRequest接口来自于Servlet规范中,存在于Tomcat的servlet-api.jar中
      • HttpServletRequest接口实现类由Http服务器负责提供
      • HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
      • 开发人员习惯于将HttpServletResponse接口修饰的对象称为请求对象
      • 主要功能:
        1. 读取Http请求协议包中请求行信息
        2. 可以读取保存在Http请求协议包中请求头或者请求体中请求参数信息
        3. 可以代替浏览器向Http服务器申请资源文件调用
        //通过请求对象,读取请求行中url信息
        String url = request.getRequestURL().toString();
        //通过请求对象,读取请求行中method信息
        String method = request.getMethod();
        //通过请求对象,读取请求行中uri属性
        /*
        * URI:资源文件精准定位地址,在请求行并没有URI这个属性
        * 实际上是URL中截取的一个字符串,
        * 这个字符串格式:/网站名/资源文件名
        * URI用于让Http服务器对被访问的资源文件进行定位
        */
        String uri = request.getRequestURI();
        ​
        //通过请求对象获得请求头中所有请求参数名
        //将所有请求参数名称保存在一个枚举对象进行返回
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()) {
            String paramName = parameterNames.nextElement();
            //通过请求对象读取指定的请求参数的值
            String parameter = request.getParameter(paramName);
            System.out.println("请求参数名称:"+paramName+" 请求参数值:"+parameter);
        }      
      • 当用Post方式发送中文参数时,getParameter得到了乱码,其原因在于:

        浏览器以GET方式发送请求,请求参数保存在请求头里,在Http服务器之后,第一件事就是进行解码。请求头二进制数据由Tomcat负责解码,Tomcat9.0默认使用utf-8字符集,可以解释一切国家文字

        而以Post方式发送请求,请求参数保存在请求体里,在Http服务器之后,第一件事就是进行解码。请求体二进制数据由request请求对象负责解码,默认使用ISO-8859-1字符集,如果请求参数内容为中文,将无法解码

        解决方案:

        在post请求方式下,在读取请求体内容前,应该通知请求对象使用utf-8对请求参数重新解码

        request.setCharacterEncoding("utf-8");      
    • 请求对象和响应对象的生命周期:
      • 在Http服务器在接收到浏览器发送的Http请求协议包之后,自动为当前Http请求协议包生成一个请求对象和响应对象
      • 在Http服务器调用doGet/doPost方式时,负责将请求对象和响应对象作为实参传递到方法,确保doGet/doPost正确执行
      • 在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的请求对象和响应对象销毁
      • 请求对象和响应对象生命周期贯穿一次请求的处理过程中
      • 请求对象和响应对象相当于用户在服务端得代言人
  • 欢迎资源文件
    • 前提:用户只会记住网站名,不会记住网站里的资源文件
    • 默认欢迎资源文件:用户向Http服务器发送针对某个网站的默认请求,服务器自动从当前网站返回的资源文件
    • Tomcat对于默认欢迎资源文件定位规则
      • 规则位置:Tomcat安装位置/conf/web.xml
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>      
    • 设置默认欢迎资源文件规则
      • 规则位置:网站/web/WEB-INF/web.xml
      • 规则命令:
        <welcome-file-list>
            <welcome-file>login.html</welcome-file>
            <welcome-file>user/find</welcome-file><!--servlet作为默认欢迎资源时,开头斜线必须抹掉-->
        </welcome-file-list>      
      • 网站设置自定义默认文件定位规则,此时Tomcat自带的定位规则将失效
  • Http状态码:
    • 是有三位数字组成的一个符号
    • Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中状态行上
    • 如果Http服务器针对本次请求,返回了对应资源文件。通过Http状态码通知浏览器应该如何处理这个结果

      如果Http服务器针对本次请求,无法返回对应资源文件。通过Http状态码向浏览器解释无法提供服务的原因

    • 分类:
      • 组成:100-599,分为5个大类
      • 1xx:

        最有特征的100:通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包后,继续向Http服务器索要依赖的其他资源文件

      • 2xx:

        最有特征的200:通知浏览器本次返回的资源文件是一个独立的资源文件,浏览器在接收响应包后不需要继续向Http服务器索要其他资源文件

      • 3xx:

        最有特征的302:通知浏览器本次返回的不是一个资源文件,而是一个资源文件地址,需要浏览器根据这个地址向Http服务器索要这个资源文件

        例如response.sendRedirect("资源文件地址")写入到响应头中location

        而这个行为导致Tomcat将302写入状态行

      • 4xx:

        最有特征的404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助

        最有特征的405:通知浏览器,在服务端已经定位到被访问的资源文件(servlet),但是这个servlet对于浏览器发送的请求方式无法处理

      • 5xx:

        最有特征的500:通知浏览器,在服务端已经定位到被访问的资源文件(servlet),这个servlet对于浏览器发送的请求方式可以处理,但是servlet在处理时,由于java异常导致处理失败

  • 多个Servlet之间调用问题(重点):
    • 前题条件:

      某些来自于浏览器发送请求,往往需要服务端中多个servlet协同处理。但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。

      这样增加用户获得服务难度,导致用户放弃访问当前网站

    • 提高用户使用感受规则:

      无论本次请求涉及到多少个Servlet,用户只需要手动通知浏览器发起一次请求即可

    • 调用规则:
      • 重定向解决方案:
        1. 工作原理:

          用户第一次通过手动方式通知浏览器访问OneServlet,OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行。

          在浏览器接收到这个响应包后,会读取到302状态,此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务

        2. 实现命令:

          response.sendRedirect("请求地址")

          将地址写入到响应包中响应头中location属性

        3. 特征:
          1. 请求地址:

            即可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)

            也可以把其他网站的资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)

          2. 请求次数:

            浏览器至少发送两次请求,但只有第一次是用户手动发送的,后续请求都是由浏览器自动发送

          3. 请求方式:

            重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用资源文件接收方式一定是GET

        4. 缺点:

          重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务的时间

      • 请求转发解决方案:
        1. 工作原理:

          用户第一次通过手动方式通知浏览器访问OneServlet,OneServlet工作完毕后,通过当前请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。

          Tomcat接收到这个请求后,自动调用TwoServlet去完成剩余任务

        2. 实现命令:请求对象代替浏览器向Tomcat发送请求
          1. 通过当前请求对象生成资源文件申请报告对象:

            RequestDispatcher report = request.getRequestDispatcher("/资源文件名"); 一定要以/为开头且不要写网站名

          2. 将报告对象发送给Tomcat:

            report.forward(当前请求对象,当前响应对象);

        3. 优点:
          1. 无论本次涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求
          2. servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数增加处理服务速度
        4. 特征:
          1. 请求次数:

            浏览器只发送一次请求

          2. 请求地址:

            只能向Tomcat服务器申请调用当前网站内部的资源文件

          3. 请求方式:

            在请求转发过程中,浏览器只发送了一个Http请求协议包。参与本次请求转发的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致

  • 多个Servlet之间数据共享实现方案:
    • 数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用
    • Servlet规范中提供四种方案:
      • ServletContext接口
          • 来自于Servlet规范的一个接口。在Tomcat中存在servlet-api.jar。在Tomcat中负责提供这个接口实现类
          • 如果两个servlet来自同一个网站。彼此之间通过网站的ServletContext实例对象实现数据共享
          • 开发人员习惯于将ServletContext对象称为全局作用域对象
        1. 工作原理:

          每个网站都存在一个全局作用域对象,这个全局作用域对象相当于一个map,在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servlet此时都可以从全局作用域对象得到这个数据进行使用

        2. 全局作用域对象生命周期:
          1. 在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
          2. 在Http服务器运行期间,一个网站只存在一个全局作用域对象
          3. 在Http服务器运行期间,全局作用域对象一直存活
          4. 在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理

            全局作用域对象生命周期贯穿网站整个运行期间

        3. 命令实现:one共享给two
          public OneServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //通过请求对象向Tomcat所有当前网站的全局作用域对象
                  ServletContext application = request.getServletContext();
                  //将数据添加到全局作用域对象作为共享数据
                  application.setAttribute("key1",data);
              }
          }
          //————————————————————————————————————————————————————————————————
          public TwoServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //通过请求对象向Tomcat所有当前网站的全局作用域对象
                  ServletContext application = request.getServletContext();
                  //从全局作用域对象得到指定关键字对应数据
                  Object data = application.getAttribute("key1");
              }
          }      
      • Cookie类
        1. Cookie来自于Servlet规范中的一个工具类,存在于Tomcat提供servlet-api.jar中

          如果两个servlet来自同一个网站,并且为同一个浏览器/用户提供服务,此时可以借助Cookie对象进行数据共享

          Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量

        2. 原理:

          用户通过浏览器第一次向网站发送请求申请OneServlet。OneServlet在运行过程中创建一个Cookie储存与当前用户相关数据。OneServlet工作完毕后,将Cookie写入到响应头交还给当前浏览器。

          浏览器收到响应包后,将Cookie存储在浏览器的缓存一段时间后,用户通过同一个浏览器再次向同一个网站发送请求申请TwoServlet时。浏览器需要无条件的将网站之前推送的Cookie,写入请求头中发送过去。

          此时TwoServlet在运行时,就可以通过读取请求头中Cookie的信息,得到OneServlet提供的共享数据

        3. 实现命令:one共享给two
          public OneServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //创建一个Cookie对象,保存共享数据(当前用户数据)
                  Cookie card = new Cookie("key1","abc");
                  //Cookie相当于一个map,但是只能存放一个键值对,这个键值对中的key和value只能是String,key不能是中文
                  //将Cookie写入到响应头,交给浏览器
                  response.addCookie(card);
              }
          }
          //————————————————————————————————————————————————————————————————
          public TwoServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //调用请求对象从请求头得到浏览器返回的Cookie
                  Cookie[] cookieArray = request。getCookie();
                  //循环遍历数据得到每个cookie的key和value
                  for(Cookie card:cookieArray) {
                      String key = card.getName();
                      String value = card.getValue();
                  }
              }
          }      
        4. 生命周期

          在默认情况下,Cookie对象存在在浏览器缓存中,浏览器关闭Cookie就销毁了

          在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机上硬盘上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭浏览器关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达时,Cookie自动从硬盘上被删除

          Cookie.setMaxAge(60);      
      • HttpSession接口
        1. HttpSession来自于Servlet规范中的一个接口,存在于Tomcat提供servlet-api.jar中。其实现类由Http服务器提供,Tomcat提供实现类存在于Servlet-api.jar中

          如果两个servlet来自同一个网站,并且为同一个浏览器/用户提供服务,此时可以借助HttpSession对象进行数据共享

          开发人员习惯于将HttpSession对象称为会话作用域对象

        2. HttpSession与Cookie的区别:
          • 存储位置:

            Cookie存放在客户端计算机中(浏览器内存/硬盘);

            HttpSession存放在服务端计算机内存

          • 数据类型:

            Cookie对象储存共享数据类型只能是String

            HttpSession对象可以储存任意类型的共享数据object

          • 数据数量:

            一个Cookie只能储存一个共享数据

            HttpSession使用map集合储存共享数据,所以可以储存任意数量共享数据

        3. 命令实现:
          public class OneServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //调用请求对象向Tomcat索要当前用户在服务端的储物柜
                  HttpSession session = request.getSession();
                  //将数据储存到用户的储物柜
                  session.setAttribute("key1",共享数据);
              }
          }
          public TwoServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //调用请求对象向Tomcat索要当前用户在服务端的储物柜
                  HttpSession session = request.getSession();
                  //从会话作用域中得到OneServlet提供的共享数据
                  Enumeration goods = session.getAttribute();
                  while(goods.hasMoreElements()){
                      String goodsName = (String)goods.nextElement();
                      int goodsNum = (int)session.getAttribute(goodsName);
                  }
              }
          }      
        4. Http服务器是怎么把HttpSession和浏览器关联起来的

          Tomcat在创建一个HttpSession对象时,自动为这个HttpSession对象生成一个唯一编号

          Tomcat将编号保存到Cookie对象,推送到当前浏览器缓存

          Cookie:JSESSIONID = ""

          当到用户第二次来访时,Tomcat根据请求头JSESSIONID确认用户是否有HttpSession以及哪一个HttpSession是该用户的

        5. getSession()和getSession(false)

          getSession():如果当前用户在服务端已经拥有了自己的私人储物柜要求Tomcat将这个私人储物柜进行返回。如果当前用户尚未在服务端拥有自己的私人储存柜,会创建一个新的。

          getSession():如果当前用户在服务端已经拥有了自己的私人储物柜要求Tomcat将这个私人储物柜进行返回。如果当前用户尚未在服务端拥有自己的私人储存柜,会返回一个null。

        6. HttpSession销毁时机:

          用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中;

          在浏览器关闭时,意味着用户与他的HttpSession关系切断;

          由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将关联的HttpSession进行销毁;

          为了解决这个问题,Tomcat为每一个HttpSession对象设置空闲时间,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession。

        7. HttpSession空闲时间手动设置
          <!--在web.xml中-->
          <session-config>
              <session-timeout>5</session-timeout> <!--中间填空闲时间-->
          </session-config>      
      • HttpServletRequest接口
        1. 在同一个网站中,如果两个Servlet之间通过请求转发方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象因此Servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享

          在请求对象那个实现Servlet之间数据共享功能时,开发人员将请求对象称为请求作用域对象

        2. 命令实现:
          public class OneServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //将数据添加到请求作用域对象中attribute属性
                  request.setAttribute("key1",data);
                  //向Tomcat申请调用TwoServlet
                  request.getRequestDispatcher("/two").forward(request,response);
              }
          }
          public TwoServlet extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response) {
                  //从当前请求对象得到OneServlet写入到共享数据
                  Object data = request.getAttribute("key1");
                  }
              }
          }      
  • Servlet规范拓展
    • 监听器接口——Listener接口:
      • 介绍:

        一组来自于servlet规范下的接口,共有八个。存在于Tomcat提供servlet-api.jar中。

        监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类

        监听器接口用于监控作用域对象生命周期变化时刻以及作用域对象共享数据变化时刻

      • 作用域对象:

        在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为作用域对象

        • 类型:
          1. ServletContext:全局作用域对象
          2. HttpSession:会话作用域对象
          3. HttpServletRequest:请求作用域对象
      • 监听器接口实现类开发规范:三步
        • 根据监听的实际情况,选择对应监听器接口进行实现
        • 重写监听器接口声明监听事件处理办法
        • 在web.xml文件将监听器接口实现类注册到Http服务器
      • ServletContextListener接口:
        • 通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
        • 监听时间处理方法:
          //在全局作用域对象被Http服务器初始化时被调用
          public void contextInitlized();
          //在全局作用域对象被Http服务器销毁时被调用
          public void contextDestroy();      
      • ServletContextAttributeListener接口:
        • 通过这个接口合法的检测全局作用域对象共享数据变化时刻
        • 监听事件处理方法:
          //在全局作用域对象添加共享数据
          public void contextAdd();
          //在全局作用域对象更新共享数据
          public void contextReplaced();
          //在全局作用域对象删除共享数据
          public void contextRemove();      
    • 过滤器接口——Filter接口:
      • 介绍

        来自于Servlet规范下接口,存在于Tomcat提供servlet-api.jar中。

        Filter接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类

        Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截

      • 具体作用:

        拦截Http服务器,帮助Http服务器检测当前请求合法性

        拦截Http服务器,对当前请求进行增强操作

      • Filter接口实现类开发步骤:三步
        • 创建一个Java类实现Filter接口
        • 重写Filter接口中doFilter方法
        • web.xml将过滤器接口实现类注册到Http服务器
      • 代码实现:
        /**
        * http://localhost:8080/myWeb/mn.jpg?age=80
        */
        public class OneFilter implements Filter {
            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
                String age = req.getParameter("age");
                if(Integer.valueOf(age) < 70) {
                    filterChain.doFilter(req, res);
                } else {
                    res.setContentType("text/html;charset=utf-8");
                    PrintWriter out = res.getWriter();
                    out.print("<center><font style='color:red;font-size:40px'>爪巴!</font><center>");
                }
            }
        }      
        <!--web.xml中-->
        <filter>
            <filter-name>oneFilter</filter-name>
            <filter-class>OneFilter</filter-class>
        </filter>
        <!--拦截地址的格式-->
        <!--
            调用具体文件,<url-pattern>/myweb/one</url-pattern>
            在调用某一个文件夹下所有的资源文件,<url-pattern>/myweb/*</url-pattern>
            在调用任意文件夹下某种类型文件,<url-pattern>*.jpg</url-pattern>
            在调用任意文件时,<url-pattern>/*</url-pattern>  
        -->
        <filter-mapping>
            <filter-name>oneFilter</filter-name>
            <url-pattern>/*</url-pattern><!--表示访问所有资源文件都要启用过滤器-->
        </filter-mapping>