参考
https://www.cnblogs.com/qq376324789/p/8610562.html
详细标签的解释
https://www.cnblogs.com/Kevin-mao/p/5664056.html

Web容器

web容器(web服务器)主要有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等,而Tomcat、Jetty、JBoss、webLogic同时也是servlet容器,或者说他们还包含了servlet容器。没有servlet容器,你也可以用web容器直接访问静态页面,比如安装一个apache等,但是如果要显示jsp/servlet,你就要安装一个servlet容器了,但是光有servlet容器是不够的,因为它要被解析成html输出,所以你仍需要一个web容器。大多数servlet容器同时提供了web容器的功能,也就是说大多servelt容器可以独立运行你的web应用。
web**容器是管理 servlet(通过servlet容器),监听器(Listener),过滤器(Filter)**的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。
创建顺序
context-param -> listener -> filter -> servlet

三大web组件的生命周期

1、Listener

Listener生命周期:一直从程序启动到程序停止运行。
1.ServletContextListener
程序启动调用Listener的contextInitialized()方法,程序停止调用Listener的contextDestroyed()方法
2.ServletRequestListener
每次访问一个Request资源前,都会执行requestInitialized()方法,方法访问完毕,都会执行requestDestroyed()方法。
3.HttpSessionListener
每次调用request.getSession(),都会执行sessionCreated()方法,执行session.invalidate()方法,都会执行sessionDestroyed()方法。
4.ServletRequestAttributeListener
每次调用request.setAttribute()都会执行attributeAdded()方法,如果set的key在request里面存在,就会执行attributeReplacerd()方法,调用request.removeAttribute()方法,都会执行attributeRemoved()方法。

2、Filter

程序启动调用Filter的init()方法**(永远只调用一次),程序停止调用Filter的destroy()方法(永远只调用一次),doFilter()方法每次的访问请求如果符合拦截条件都会调用程序第一次运行,会在servlet调用init()方法以后调用,不管第几次调用,都在调用doGet(),doPost()方法之前。**

3、Servlet

程序第一次访问**,会调用servlet的init()方法初始化(只执行一次),每次程序执行都会根据请求调用doGet()或者doPost()方法,程序停止调用destory()方法。

ServletContextListener监听器的创建与销毁

  1、contextInitialized(ServletContextEvent sce):当Servlet容器启动Web应用时调用该方法。
      在调用完该方法之后,容器再对Filter初始化,并且对那些在Web应用启动时就需要被初始化的Servlet进行加载
  2、contextDestroyed(ServletContextEvent sce):当Servlet容器终止Web应用时调用该方法。
      在调用该方法之前,容器会先销毁所有的Servlet和Filter过滤器。

一次请求的初始化顺序

filter初始化(程序启动时)——requestListener初始化(请求资源前)——servlet初始化(第一次访问该servlet)——执行doFilter()( 过滤)——销毁requestListener(响应完成)——销毁servlet(程序关闭)——销毁filter(程序关闭)  

主要标签的配置

1.context-param

作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值

servlet2.0配置

  1. <context-param>
  2. <param-name>facelets.DEVELOPMENT</param-name>
  3. <param-value>true</param-value>
  4. </context-param>

servlet3.0配置

//3.0 中配置方式如下:
@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application implements ServletContextInitializer 
{     
    public static void main(String[] args) {         
        SpringApplication.run(Application.class, args);     
        }     

    @Override     
    public void onStartup(ServletContext servletContext)             
    throws ServletException {         
         servletContext.setInitParameter(                 
        "facelets.DEVELOPMENT",                 
        "true");    
        } 
}

2.listener

servlet2.0配置
其中多个listener是按照在web.xml中的声明明顺序执行的。

<listener>    
      <listerner-class>listener.SessionListener</listener-class>    
</listener>

servlet3.0配置

package me.gacl.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 使用@WebListener注解将实现了ServletContextListener接口的MyServletContextListener标注为监听器
 */
@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContex销毁");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContex初始化");
        System.out.println(sce.getServletContext().getServerInfo());
    }
}

3.filter

servlet 2.0配置
filter是按照在web.xml中的声明顺序执行的
filter标签一定要先于对应的filter-mapping出现在xml文件,否则在服务器启动的时候报错,找不到过滤器。

<filter>
    <filter-name>FilterDemo02</filter-name>
    <filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
    <!--配置FilterDemo02过滤器的初始化参数-->
    <init-param>
        <description>配置FilterDemo02过滤器的初始化参数</description>
        <param-name>name</param-name>
        <param-value>gacl</param-value>
    </init-param>
    <init-param>
        <description>配置FilterDemo02过滤器的初始化参数</description>
            <param-name>like</param-name>
            <param-value>java</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>FilterDemo02</filter-name>
    <!--“/*”表示拦截所有的请求 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

servlet3.0配置
@WebFilter(urlPatterns=””) 执行顺序和类名字符排序!

package com.xc.common.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(
    filterName = "FilterDemo02", urlPatterns = { "/*" }, 
    initParams = { 
        @WebInitParam(name = "name", value = "xc"),
        @WebInitParam(name = "like", value = "java") 
    }
)
public class FilterDemo02 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("----FilterDemo02过滤器初始化----");
        // 得到过滤器的名字
        String filterName = filterConfig.getFilterName();
        // 得到在web.xml文件中配置的初始化参数
        String initParam1 = filterConfig.getInitParameter("name");
        String initParam2 = filterConfig.getInitParameter("like");
        // 返回过滤器的所有初始化参数的名字的枚举集合。
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();

        System.out.println(filterName);
        System.out.println(initParam1);
        System.out.println(initParam2);
        while (initParameterNames.hasMoreElements()) {
            String paramName = (String) initParameterNames.nextElement();
            System.out.println(paramName);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FilterDemo02执行前!!!");
        chain.doFilter(request, response); // 让目标资源执行,放行
        System.out.println("FilterDemo02执行后!!!");
    }

    @Override
    public void destroy() {
        System.out.println("----过滤器销毁----");
    }
}

4.servlet

servlet 2.0配置

<servlet>
    <servlet-name>servlet1</servlet-name>
    <!-- servlet对应的java类 -->
    <servlet-class>controller.Servlet1</servlet-class>
    <!-- 在tomcat启动时就创建servlet的实例,而不是等到第一次请求时.其中数字表示优先级,数字小的优先级高-->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

servlet 3.0配置

package com.what21.servlet.webservlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
        urlPatterns = "/five",
        initParams =
        {
            @WebInitParam(name = "name", value = "username"),
            @WebInitParam(name = "value", value = "password")
        },
        loadOnStartup = 1,
        asyncSupported = true
)
public class FiveServlet extends HttpServlet {

    private static final long serialVersionUID = -2574757602020384180L;

    @Override
    public void init(ServletConfig config) {
        String name = config.getInitParameter("name");
        String value = config.getInitParameter("value");
        System.out.println("name = " + name);
        System.out.println("value = " + value);
        System.out.println("init().....");
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().print("<h1>FiveServlet service()<h1>");
    }

}

listener监听器

Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

分为三大类:
ServletContextListener 监听应用程序启动和停止事件
ServletRequestListener request对象创建和销毁事件
HttpSessionListener session对象创建和销毁事件

ServletContextAttributeListener application作用域 setAttribute,removeAttribute事件
ServletRequestAttributeListener request作用域 setAttribute,removeAttribute事件
HttpSessionAttributeListener session 作用域 setAttribute,removeAttribute事件

HttpSessionActivationListener session 的激活和钝化
HttpSessionBindingListener session变量绑定事件

实体类实现序列化接口的意义

session的激活和钝化
1) 当tomcat服务器停止时,会把session中所有变量存储到磁盘上, 称为钝化
2) 当tomcat服务器重新启动时,把刚才存入磁盘的信息读取出来,恢复至session作用域, 称为激活
钝化过程调用是java序列化
激活过程调用是java反序列化
向Session中存储的变量要实现序列化接口(Serializable)