zoukankan
html css js c++ java
web.xml加载过程
web.xml加载过程(步骤):
1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:
<listener></listener> 和 <context-param></context-param>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比 所 有的Servlet都要早.
换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
7.举例.你可能想在项目启动之前就打开数据库.
那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接.
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的方式 :
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
最终结论:
web.xml 的加载顺序是:[context-param -> listener -> filter -> servlet -> spring] ,而同类型节点之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用
查看全文
相关阅读:
No module named 'pydispatch'
python 安装 vrml
python3.7 安装pyopengl,环境搭建
机智人 激光雷达 配置
ubuntu server 16.04(amd 64) 配置网桥,多网卡使用激活
ubuntu server 多网卡
ubuntu16.04中开启和关闭防火墙
c++ 判断给定区间是否是一个heap. O(N) (is_heap)
c++ 判断容器A是否是容器B的子集,如果是,返回true(includes)
c++ 容器元素填充指定数量的元素(generate_n)
原文地址:https://www.cnblogs.com/shaohz2014/p/3792760.html
最新文章
Ajax 完整教程 (转)
Android 开发框架介绍
动态加载so文件
给Java新手的一些建议----Java知识点归纳(Java基础部分)
Android app应用多语言切换功能实现
JavaScript 设计模式之工厂模式
$.ajax()方法详解
bugfree 数据库配置 显示No such file or directory
安装 mysql8.0.13 (Ubuntu 16.04 desktop amd64)
bugfree 安装配置(Ubuntu16.04 amd 64 Desktop)
热门文章
python 删除列表中的字典元素
webstorm注册码 永久有效!!! 前端工程师福利
Sublime Text 3.1.1 Build 3176 注册码破解
sudo: /etc/sudoers is world writable sudo: no valid sudoers sources found, q...
ubuntu 14.04 添加、删除用户,修改用户名称,修改主机名
python json 文件读写
yaml 文件保存
json 保存
java 使用正则判断是不是一个数字
c++ 算法 栅格中两点之间连线
Copyright © 2011-2022 走看看