web学习:web.xml使用:listener标签的使用
1.认识web.xml
从零开始学习java web,学习web最开始就不得不说web.xml,以前只知道web.xml对web应用来说很重要,却不知道为什么,现在来记录下学习web.xml的标签。
web.xml的加载过程(引用)
在web-app元素内,元素的配置顺序与工程的加载顺序无关,web.xml的加载过程为:
1.启动一个web项目,web容器(如tomcat)读取web.xml文件,读取其中的配置信息
2.容器创建一个servlet上下文(servletContext),这个web项目所有部分共享这个上下文
3.容器将转换为键值对,交给servletContext
4.容器创建中的监听器实例
5.触发contextInitialized方法,listener被调用(当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法contextInitialized;contextDestroyed,web.xml有contextLoaderListener监听器,spring等框架实现了本监听器的接口方法)
6.调用完contextInitialized方法后,容器再对filter初始化
7.容器对web.xml中的指定load-on-startup的值时,
1.当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet。
2.如果值小于0或未指定时,则表示只有在第一次请求的容器才在该servlet调用初始化函数(springMVC的初始化为此阶段。
3.正值越小,(优先级1,2,3...->递减)servlet的优先级越高,应用启动时就越先加载。
4.值相同时,容器就会自己选择顺序来加载。
1.1 listener标签
一般我们会在web.xml中见到如下的listener标签
<listener>
<listener-class>web.xml.testListener</listener-class>
</listener>
1.1.1 listener-class标签是我们什么的listener的全路径,该类需要实现系统已经实现的listener接口。
1.2 简单使用
这些设置完之后我们就可以来看看这些标签到底是如何使用的:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<!-- xml配置 -->
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>myparam</param-name>
<param-value>我是context-param</param-value>
</context-param>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>web.xml.testFilter</filter-class>
<init-param>
<param-name>testfilter</param-name>
<param-value>我是测试过滤器</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<listener>
<listener-class>web.xml.testListener</listener-class>
</listener>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>web.xml.testServlet</servlet-class>
<init-param>
<param-name>test</param-name>
<param-value>我是测试param</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
//这里是我写的测试listener
public class testListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听器运行");
System.out.println("ServletContext创建");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁");
System.out.println("监听器销毁");
}
}
将程序用web容器跑起来,启动过程中的输出如下
2019-4-2 17:52:16 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\esendev\jdk1.6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\esendev\jdk1.6\jre\bin;D:/esendev/jdk1.8.0_65/bin/server;D:/esendev/jdk1.8.0_65/bin;D:/esendev/jdk1.8.0_65/lib/amd64;D:\app\longw\product\11.2.0\dbhome_1\bin;D:\oracle\longw\product\11.2.0\dbhome_1\bin;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;";D:\esendev\jdk1.8.0_65\bin";D:\esendev\jdk1.8.0_65\jre\bin;C:\WINDOWS\System32\OpenSSH\;D:\esendev\Git\cmd;C:\Users\longw\AppData\Local\Microsoft\WindowsApps;D:\Python\Python37-32;;D:\esendev\eclipse_kjzz\eclipse;
2019-4-2 17:52:16 org.apache.coyote.http11.Http11BaseProtocol init
信息: Initializing Coyote HTTP/1.1 on http-8088
2019-4-2 17:52:16 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 347 ms
2019-4-2 17:52:16 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2019-4-2 17:52:16 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/5.5.28
2019-4-2 17:52:16 org.apache.catalina.core.StandardHost start
信息: XML validation disabled
监听器运行
ServletContext创建
初始化filter
我是context-param
我是测试过滤器
MyFilter
2019-4-2 17:52:16 org.apache.coyote.http11.Http11BaseProtocol start
信息: Starting Coyote HTTP/1.1 on http-8088
2019-4-2 17:52:16 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8019
2019-4-2 17:52:16 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/28 config=null
2019-4-2 17:52:16 org.apache.catalina.storeconfig.StoreLoader load
信息: Find registry server-registry.xml at classpath resource
2019-4-2 17:52:16 org.apache.catalina.startup.Catalina start
信息: Server startup in 494 ms
可以看见该监听器是检测ServletContext的创建,当ServletContext创建时,该监听器运行contextInitialized方法,当ServletContext销毁时,该监听器运行contextDestroyed方法。这个监听器可以用来干嘛呢?比如我们可以在ServletContext启动时初始化我们需要的各种初始化参数。监听器其实就是用来给我们做额外参数的初始化的(个人理解:框架比较常用)