1、Servlet、ServletConfig与GenericServlet
    首次请求的顺序 
    => 生成HttpServletRequest与HttpServletResponse
     =>调用service()方法,以前边两个对象作为参数
      =>Web容器启动,
       =>读取Servlet设置信息,实例化Servlet类
         =>为每个Servlet设置信息产生一个ServletConfig对象。
           =>调用Servlet接口的init()方法,以产生的ServletConfig对象作为参数。
       完成初始化。
      说明:容器会为每个Servlet设置信息产生一个Servlet及ServletConfig实例,GenericServlet同时实现了Servlet及Servlet-Config。
          GenericServlet主要的目的,就是将初始Servlet调用init()方法传入的ServletConfig封装起来。
          GenericServlet在实现Servlet的init()方法时,也调用了另一个无参数的init()方法,在编写Servlet()时,如果有一些初始时所要运行的动作,可以重新定义这个无参数的init()方法,而不是直接重新定义有ServletConfig参数的init()方法。
         GenericServlet也包括了Servlet和ServletConfig所定义方法的简单实现,实现内容主要是通过ServletConfig来取得一些相关信息。所以在继承HttpServlet实现Servlet时,就可以通过这些方法来取得所要的相关信息,而不是直接意识到ServletConfig的存在。
2、使用ServletConfig
     可以从ServletConfig中取得Servlet设置信息。
     getinitparameter()、getInitParameterNames() 可以取得Servlet时的初始参数。
     若要设置个别Servlet的初始参数,可以在@WebServlet中使用@WebInitParam设置initParams属性。在web.xml中设置参数使用<init-param>等标签进行设置。web.xml中设置会覆盖标注的设置 。
3、使用ServletContext
    ServletContext接口定义了运行Servlet的应用程序环境的一些行为与观点,可以使用ServletContext实现对象取得所请求资源的URL、设置与储存属性、应用程序初始参数,甚至动态设置Servlet实例。
   通过ServletConfig的getServletContext()方法取得ServletContext对象。
   1)getRequestDispatcher()
       取得RequestDispatcher实例,使用时路径的指定必须以“/”开头,这个斜杠代表应用程序环境根目录(Context Root)。
   2)getResourcePaths()
    取得Web应用程序的某个目录中有哪些文件,使用时路径的指定必须以“/”开头。
   3)getResourceAsStream()
       取得Web应用程序的某个目录中文件的内容,运行结果返回InputStream实例,使用时路径的指定必须以“/”开头。
  每个Web应用程序都会有一个相对应的ServletContext,针对“应用程序”初始化时用到的参数,可以在Web.xml设置,通常这会结合ServletContextListener来做。
4、监听器
    ServletContext监听器
   1)ServletContextListener
     生命周期监听器。在Web应用程序初始化后或即将结束销毁前分别调用contextInitialized()和contextDestroyed()方法。
   2)ServletContextAttributeListener
    监听属性改变的监听器。如果想要对象被设置、移除或替换ServletContext属性时,可以收到通知以进行一些操作,则可以实现ServletContextAttributeListener。对应方法有attributeAdded()、attributeRemoved()与attributeReplaced()。通过传入的参数可以调用一些方法,如getName(),getValue()等得到属性名称和值等。
   HttpSession监听器
  3)HttpSessionListener
     生命周期监听器。在HttpSession对象创建或结束时,调用sessionCreated()与sessionDestroyed()。
    可以使用传入的参数HttpSessionEvent实例的getSession()方法取得HttpSession实例,以针对Session对象作出创建或者结束等操作。
  4)HttpSessionAttributeListener
   属性改变监听器。具体同2)     
  5 )HttpSessionBindingListener
  对象绑定监听器。当实现此接口的类对象被加入HttpSession或者从中移除时,调用对应的valueBound()和valueUnbound()方法,以HttpSessionBindingEvent 对象作为参数。
  6)HttpSessionActivationListener
 对象迁移监听器。一般情况不会用到该监听器,在分布式环境时,应用程序对象可能分散在多个JVM中。当HttpSession从一个JVM迁移至别一个JVM时,涉及到序列化操作,这时就会调用sessionWillPassivate()和sessionDidActivate()。
  HttpServletReques监听器
  7)ServletRequestListener 
 生命周期监听器。在HttpServletRequest对象创建或结束时,调用requestInitialized()与requestDestroyed()。以ServletRequestEvent对象为参数,通过参数可取得ServletRequest,以针对请求对象做出相应初始化和结束操作。
  8)ServletRequestAttributeListener
  属性改变监听器。具体同2)     
5、过滤器
   过滤器介于Servlet的service()之前,可拦截过滤浏览器对Servlet的请求,过滤器介于Servlet的service()之后,可以改变Servlet对浏览器的响应。
   在Servlet/JSP中要实现过滤器,必须实现Filter接口,并使用@WebFilter标注或web.xml中定义过滤器,让容器知道该加载哪些过滤器。web.xml中的设置会覆盖标的设置。
   Filter接口有三个要实现的方法:init(FilterConifg filterConfig)、doFilter(ServletRequest request)、destroy()。
   FilterConifg类似于Servlet接口init()方法参数上的ServletConfig
   doFilter方法则类似于Servlet接口的service()方法。可以在doFilter方法中进行service()方法的前置处理。然后决定是否调用FilterChain的doFilter()方法。调用 了FilterChain的doFilter()方法后,运行下一个过滤器,如果没有了,就调用Servlet的service()方法。
  如果因为某种情况没有调用FilterChain的doFilter(),则请求就不会继续交给接下来的过滤器或目标Servlet,这时就是所谓的拦截了请求。
  默认是浏览器发出请求触发过滤器,如果是通过RequestDispatcher的forward()或include()的请求,可设置@WebFilter的dispatcherTypes。
6、封装器  
 HttpServletRequestWrapper   请求封装器
 应用场景,如:实现留言板字符替换的功能;实现编码统一设置的功能
 HttpServletResponseWrapper 响应封装器
 应用场景,如:对响应的内容进行压缩再发送;
7、异步处理
   Web容器会为每一个请求分配一个线程,并且默认情况下,响应完成前,该线程占用的资源不会被释放。
   在Servlet3.0中,在ServletRequest上提供了startAsync()方法。分无参和有参两个重载,这两个方法都会返回AsyncContext接口的实现对象;无参的会直接利用原有的请求与响应对象来创建AsyncContext,有参的可以传入自行创建的请求、响应封装对象。
   在调用了startAsync()方法取得AsyncContext对象之后,此次请求的响应会被延后,并释放容器分配的线程。
   可以通过AsyncContext的getRequest()、getResponse()方法取得请求、响应对象,此次对客户端的响应将暂缓至调用AsyncContext的complete()或dispatch()方法为止。
   对于延后响应的请求,创建一个实现Runnable接口的AsyncRequest对象,并将其调度一个线程池(Thread pool),线程池的线程数是固定的,让这些必须长时间处理的请求,在这些有限数量的线程中完成,而不是每次请求都占用容器分配的线程。
   若要能调用ServletRequest的startAsync()以取得AsyncContext,必须告知容器此Servlet支持异步处理,可以通过@WebServlet标注或web.xml设置。
   如果Servlet要进行异步处理,而前端有过滤器,则过滤器也需要标识为支持异步处理。同样可通过@WebServlet标注或web.xml设置。

我的Java之旅 第八课 Servlet 进阶API、过滤器与监听器的更多相关文章

  1. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  2. 我的Java之旅 第六课 JAVA WEB 请求与响应

    一.有关URL编码    1.在URL的规范中定义了一些保留字符,如::  /  ?  & =  @  % 等,在URI中有它的作用.如果要在URI中包含这些字符,必须转码,即%字符后跟十六进 ...

  3. 我的Java之旅 第五课 JAVA 语言语法 集合

    JAVA集合只能存放引用类型的的数据,不能存放基本数据类型,int 可以用 Integer代替. 一.集合接口  1.  Iterable<E> 实现这个接口允许对象成为 "fo ...

  4. 我的Java之旅 第四课 JAVA 语言语法 基础

    1  整型           int num = 1_000_000; //从java 7开始支持的语法 ,只是让人更易读,java编绎器会去除   2  字符串        一定不能使用==运算 ...

  5. 我的Java之旅 第三课 从Applet到JSP

    一.Applet   Applet是一种特殊的Java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行.   App ...

  6. 我的Java之旅 第七课 JAVA WEB 会话管理

    1.隐藏域       隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie    Cookie类    setMaxAge() 设置有效期 ...

  7. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  8. SpringBoot学习(八)-->SpringBoot之过滤器、监听器

    本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...

  9. JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...

随机推荐

  1. 构建一个Gods Eye Android应用程序:第1部分 – 收集已安装的Android应用程序

    首先问候一下我的黑客伙伴们,在之前的Introduction to Amunet 教程中,我们了解到Amunet可能是一个间谍Android应用程序. 我不浪费太多时间因而直入主题. 在本教程中,我们 ...

  2. linux安全加固浅谈

    难易程度:★★★阅读点:linux;python;web安全;文章作者:xiaoye文章来源:i春秋关键字:网络渗透技术 前言linux被越来越多的企业使用,因此掌握一些基本的linux安全加固是有必 ...

  3. Java学习笔记43(打印流、IO流工具类简单介绍)

    打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...

  4. day 75vue 脚手架学习 脚手架的使用

    前情提要: vue 自定化开发工具  (vue-cli的使用) 一:安装脚手架,以及准备 1: 下载地址, https://nodejs.org/en/download/ 2:如果下载成功,在cmd ...

  5. spring boot -thymeleaf-字符串操作

    以下是一些小测试 <span th:text="${#strings.length(hi)}" ></span> <span th:text=&quo ...

  6. [视频]K8飞刀 Google黑客功能教程

    [视频]K8飞刀 Google黑客功能教程 链接:https://pan.baidu.com/s/1kbK5jNH8ZaddUEeQ9IwTaw 提取码:lwl6

  7. PCA历程详细python代码(原创)

    #PCA主成分分析,原文为文末的链接,代码为自己亲自手码 def cov_out1(dx,dy): #第一步:求解x,y各自的均值 mean_x=0 mean_y=0 for i in range(l ...

  8. JAVA中的COPYONWRITE容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  9. 根据PDF模板生成PDF文件(基于iTextSharp)

    根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...

  10. redis 集群搭建: redis-cluster

    前言 redis数据存储在内存中, 就会受到内存的限制, 大家都知道, 一台电脑, 硬盘可以有1T, 但是内存, 没有听说有1T的内存吧. 那如果数据非常多, 超过一台电脑的内存空间, 怎么办呢? 正 ...