JAVA Web.xml加载顺序过程详解
web.xml加载过程(步骤):
1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将
4.容器创建
5.在监听中会有contextInitialized(ServletContextEventargs)初始化方法,在这个方法中获得:
ServletContext=ServletContextEvent.getServletContext();
context-param的值=ServletContext.getInitParameter("context-param的键");
6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
换句话说,这个时候,你对
7.举例.你可能想在项目启动之前就打开数据库.
那么这里就可以在
8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.
web.xml节点加载顺序:
可以肯定的是,节点的加载顺序与它们在web.xml文件中的先后顺序无关。即不会因为filter写在listener的前面而会先加载filter。最终得出的结论是:listener->filter->servlet
同时还存在着这样一种配置节点:context-param,它用于向ServletContext提供键值对,即应用程序上下文信息。我们的listener,filter等在初始化时会用到这些上下文中的信息,那么context-param配置节是不是应该写在listener配置节前呢?实际上context-param配置节可写在任意位置,因此真正的加载顺序为:
context-param->listener->filter->servlet
对于某类配置节而言,与它们出现的顺序是有关的。以filter为例,web.xml中当然可以定义多个filter,与filter相关的一个配置节是filter-mapping,这里一定要注意,对于拥有相同filter-name的filter和filter-mapping配置节而言,filter-mapping必须出现在filter之后,否则当解析到filter-mapping时,它所对应的filter-name还未定义。web容器启动时初始化每个filter时,是按照filter配置节出现的顺序来初始化的,当请求资源匹配多个filter-mapping时,filter拦截资源是按照filter-mapping配置节出现的顺序来依次调用doFilter()方法的。
servlet同filter类似,此处不再赘述。
【加载Spring】
比如filter需要用到bean,但加载顺序是:先加载filter后加载spring,则filter中初始化操作中的bean为null;
所以,如果过滤器中要使用到bean,可以将spring的加载改成Listener的方式:
org.springframework.web.context.ContextLoaderListener
最终结论:
web.xml的加载顺序是:[context-param->listener->filter->servlet->spring],而同类型节点之间的实际程序调用的时候的顺序是根据对应的mapping的顺序进行调用的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。