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. 11.webview、shareSDK

    布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...

  2. Android Fragment用法知识点的讲解

    Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...

  3. Linux 后台运行命令:nohup 和 &

    [参开文章]:nohup 与 & 的区别 1. nohup 1.1 基本概念 将程序以忽略挂起信号的方式运行起来: 不可以免疫 Ctrl + C  的 SIGINT 中断信号: 可以免疫 SI ...

  4. Linux下Clamav 杀毒软件安装使用文档

    一.安装Clamav杀毒工具 0.安装Clamav需要的依赖包 yum install libxml* openssl* -y 1.创建clamav组 groupadd clamav 2.创建clam ...

  5. 单点登录SSO图示和讲解(有代码范例)转帖

    完整的代码范例已完成,因和本文时序图严格对照,注释整理还需要一些工作,完成后将在下一篇放出.大家下载配置后,本地跑起来会是图一动画所示的运行效果,敬请期待. 敢说最准确,因为: 我严格对照所画时序图的 ...

  6. Odoo : ORM API

    记录集 model的数据是通过数据集合的形式来使用的,定义在model里的函数执行时它们的self变量也是一个数据集合 class AModel(models.Model): _name = 'a.m ...

  7. 【转】ASP.NET Core MVC 配置全局路由前缀

    本文地址:http://www.cnblogs.com/savorboard/p/dontnet-IApplicationModelConvention.html作者博客:Savorboard 前言 ...

  8. 【Promise】Promise实现请求超时处理(加强版)

    昨天闲来无事,于是把之前写过的promise优化了一下,代码如下: /*写文件.追加写.读文件*/ var fs = require('fs'); function wrapper(fn,contex ...

  9. 高德地图添加marker及反地理编码获取POI

    项目中集成百度.高德.腾讯地图已是司空见惯的事情,今天我总结了一下项目中用到的高德地图常用的功能: 1.展示高德地图并定位显示定位图标: 2.添加实时大头针: 3.反地理编码获取周围兴趣点 效果如下: ...

  10. interface21 - web - Log4jConfigListener(Log4j加载流程)

    前言 最近打算花点时间好好看看spring的源码,然而现在Spring的源码经过迭代的版本太多了,比较庞大,看起来比较累,所以准备从最初的版本(interface21)开始入手,仅用于学习,理解其设计 ...