建议先看看 ——> Servlet工作原理

一、Listener

在Tomcat服务中,Listener的设计是基于观察者模式的,目前在Servlet中提供6中两类事件的观察者接口,它们分别是:

实际上这六个Listener都继承了EvenListener,每个Listener由分别定义了自己需要实现的接口:

ServletContextAttributeListener:

public interface ServletContextAttributeListener extends EventListener {

    // 设置属性时
public default void attributeAdded(ServletContextAttributeEvent scae) {
} // 删除属性时
public default void attributeRemoved(ServletContextAttributeEvent scae) {
} // 、更改属性时
public default void attributeReplaced(ServletContextAttributeEvent scae) {
}
}

ServletRequestAttributeListener:

public interface ServletRequestAttributeListener extends EventListener {

    // 更改Request属性时
public default void attributeAdded(ServletRequestAttributeEvent srae) {
} // 更改Request属性时
public default void attributeRemoved(ServletRequestAttributeEvent srae) {
} // 更改Request属性时
public default void attributeReplaced(ServletRequestAttributeEvent srae) {
}
}

HttpSessionAttributeListener:

public interface HttpSessionAttributeListener extends EventListener {

    // 添加 Session 属性时
public default void attributeAdded(HttpSessionBindingEvent se) {
} // 删除 Session 属性时
public default void attributeRemoved(HttpSessionBindingEvent se) {
} // 更改 Session 属性时
public default void attributeReplaced(HttpSessionBindingEvent se) {
}
}
ServletRequestAttributeListener:
public interface ServletRequestAttributeListener extends EventListener {

    public default void attributeAdded(ServletRequestAttributeEvent srae) {
} public default void attributeRemoved(ServletRequestAttributeEvent srae) {
} public default void attributeReplaced(ServletRequestAttributeEvent srae) {
}
}

ServletContextListener:

public interface ServletContextListener extends EventListener {

    // StandardConetxt 创建时
public default void contextInitialized(ServletContextEvent sce) {
} // StandardConetxt 销毁时
public default void contextDestroyed(ServletContextEvent sce) {
}
}

HttpSessionListener:

public interface HttpSessionListener extends EventListener {

    public default void sessionCreated(HttpSessionEvent se) {
} public default void sessionDestroyed(HttpSessionEvent se) {
}
}

二、Filter

Filter可以完成和Servlet同样的工作,除了request和response两个对象外,它还提供了一个FilterChain对象,它可以帮助我们更加灵活地控制请求的流程,该接口定义如下:

Filter:

public interface Filter {

    // 初始化接口,在用户定义的Filter初始化时被调用,它与Servlet的init方法是一样的,
// FilterConfig也和ServletConfig类似,除了可以获取ServletContext之外,还可以在配置文件中声明参数
public default void init(FilterConfig filterConfig) throws ServletException {} // 每个用户的匹配请求进来时,这个方法都被调用,并且是在Servlet的service方法之前被调用,
// 而 FilterChain代表了当前的整个请求链,通过调用FilterChain.doFilter可以将请求继续传递下去,
// 如果需要拦截该请求,那么就不调用FilterChain,就可以直接返回了,所以它是一种责任链模式
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException; // Filter被销毁时,会调用这个方法,web容器调用这个方法之后,容器会再调用一次doFilter方法
public default void destroy() {}
}

除此之外还有两个接口的定义,分别FilterConfig 和FilterChain

FilterConfig:

public interface FilterConfig {

    /**
* Get the name of the filter.
*
*/
public String getFilterName(); /**
* Returns a reference to the {@link ServletContext} in which the caller is
* executing.
*
*/
public ServletContext getServletContext(); /**
* Returns a <code>String</code> containing the value of the named
* initialization parameter, or <code>null</code> if the parameter does not
* exist.
*
*/
public String getInitParameter(String name); /**
* Returns the names of the filter's initialization parameters as an
*/
public Enumeration<String> getInitParameterNames(); }

FilterChain:

public interface FilterChain {

    /**
* Causes the next filter in the chain to be invoked, or if the calling
* filter is the last filter in the chain, causes the resource at the end of
* the chain to be invoked.
*
*/
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException; }

三、<url-pattern>匹配规则

    • 精确匹配:如/foo/.html,只能匹配/foo.html
    • 路径匹配:如/foo/*,将匹配/foo/路径下所有的URL
    • 后缀匹配:如*.html,将匹配所有所有的后缀为.html的路径

匹配的顺序也是:精确匹配——> 最长路径匹配——>后缀匹配

[web]Servlet中的Listener和Filter的更多相关文章

  1. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  2. web.xml 中的listener、 filter、servlet 加载顺序

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  3. web.xml 中的listener、filter、servlet 加载顺序及其【配置详解】

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  4. 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上 ...

  5. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  6. [Java][Web] Servlet中转发和重定向比较

    Servlet中页面跳转的两种方式 请求转发 使用requestDispatcher对象 request.getRequestDispatcher("path").forward( ...

  7. web.xml中自定义Listener

    Listener可以监听容器中某一执行动作,并根据其要求做出相应的响应. 常用的Web事件的监听接口如下: ServletContextListener:用于监听Web的启动及关闭 ServletCo ...

  8. Java Web servlet中的cookie

    点击submit后: 点击查看Cookies: 在C:\Documents and Settings\Administrator\Cookies目录下面会有一个     hongten@webproj ...

  9. 一个web项目中web.xml<context-param>的作用

    转   <context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置 ...

随机推荐

  1. solr 基本命令二(权重查找)

    package zr.com.solr.utils; import java.io.IOException; import java.util.HashMap; import java.util.Li ...

  2. CloudStack + KVM + HA

    KVM高可用性CS4.2暂时没有实现 The Linux Kernel Virtual Machine (KVM) is a very popular hypervisor choice amongs ...

  3. SqlServer——系统函数

    1) CASE CASE有两种使用形式:一种是简单的CASE函数,另一种是搜索型的CASE函数. [1]简单的 CASE 函数 Format: CASE input_expression WHEN w ...

  4. SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?

    什么是数据库? 为什么需要数据库? 是不是所有的软件都是用Sql Server? 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Exp ...

  5. jquery的get()方法

    通过检索匹配jQuery对象得到对应的DOM元素. .get( [index ] ) index 类型: Integer 从0开始计数,用来确定获取哪个元素. .get() 方法允许我们直接访问jQu ...

  6. asp.net webform过滤器(注意我们可以在拦截请求的同时设置回调函数)

    .过滤器代码 public class PageFilter : IHttpModule { public String ModuleName { get { return "PageFil ...

  7. Oracle——约束

    NOT NULLUNIQUE PRIMARY KEYFOREIGN KEYCHECK 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名 --指定约束名 CREA ...

  8. 解决gitosis中authorized_keys不自动更新问题

    1.拷贝一个管理员权限用户的id_rsa.pub到服务器端 这里我拷贝的是yang电脑的key,命令如下: scp  /home/yang/.ssh/id_rsa.pub serveradmin@服务 ...

  9. HDU 6127 Hard challenge (极角扫描)

    题意:给定 n 个点,和权值,他们两两相连,每条边的权值就是他们两个点权值的乘积,任意两点之间的直线不经过原点,让你从原点划一条直线,使得经过的直线的权值和最大. 析:直接进行极角扫描,从水平,然后旋 ...

  10. 第一课 了解SQL

    1.1数据库基础 数据库:数据库是一个以某种有组织的方式存储的数据集合,可以想象是一个文件柜 数据库管理软件:DBMS用来操做创建数据库的软件 表:某种特定类型数据的结构化清单,数据库的下一层就是表 ...