Servlet | Filter | Listener | |
---|---|---|---|
实现类 | 继承 HttpServlet 类 | 实现 Filter 接口 | 根据需要实现十个接口中的某几个 |
初始化 | 默认情况是在第一次使用时初始化 可以通过配置 web.xml 文件来实现服务器启动时初始化 | Web容器启动时初始化 | Web容器启动时初始化 |
和<url-pattern>的关系 | 一对多 一个 Servlet 可以对应多个 url | 多对多 | 不需要配置 |
Servlet/Filter/Listener 的加载顺序:
- 启动 Web 项目,Tomcat 的 JVM 读取 web.xml 文件创建 Web 容器。
- Web 容器加载 web.xml 配置文件中
<context-param></context-param>
和<listener></listener>
- Web 容器创建一个 ServletContext 实例,整个 Web 项目所有部分都共享给这个容器实例(JSP 中的 application)
- Web 容器将
<context-param></context-param>
中的 name 和 value 的标签值转化成键值对的形式交给 ServletContext 对象 - 容器按照配置文件顺序加载 Listener
- 容器加载 Filter
- 容器加载 web.xml 中
<load-onstartup>
标签配置为大于等于0的 Servlet - 在容器销毁时,按照 Servlet → Filter → Listener 的顺序销毁。
加载顺序 context-param → Listener → Filter → Servlet,这个顺序不会因为配置位置而改变,也就是说,即使 Servlet 配置在 Listener 之前,依旧是先加载 Listener
而对于同样是 Filter 来说,配置在前面的会先加载;对于同样是 Servlet 来说,<load-on-starup>
配置的值是非负数时,数字越小,越优先加载;如果没有配置,或者配置的是负数,那么只有在 Servlet 被请求时,才会加载
Servlet
- Servlet 线程不安全
- 一个 Servlet 实现类只能有一个实例
- 一个 Servlet 可以对应多个 url-pattern
Filter
- 多个 Filter 组成一个 FilterChain
- 多个Filter的执行有先后顺序,规则是在
<filter-mapping>
中,配置在前面的 Filter 执行要早于配置在后面的 Filter。 - Filter 和 url-pattern 可以是多对多的关系