做web后端工程师,逃不过的web.xml,我们都知道配置这个文件是日常工作了,那么我们来把一些必须知道知识点梳理下。
我们把web项目启动的时候,首先加载的就是web.xml这个文件,只有这个文件所有的配置信息没错之后,web项目才算真正地跑起来。
那么我们一起打开web.xml的配置信息的大门吧。
首先,我们需要肯定一个整体的信息的就是,无论的web.xml里面的配置信息顺序是怎么样,我们的执行顺序是不会按照你写在文件中的配置顺序执行的,web.xml有自己的执行顺序
初始化过程:
- 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。
- 接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。
- 接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。
- 容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
- 在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。
- 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。
而同个类型下的执行顺序是根据对应的mapping的信息执行的
依照xml的执行顺序,我们来依次了解一下各个执行顺序的标签是什么意思
值得我们注意的是,web项目在启动的时候,容器(Tomcat)会创建一个域对象ServletContext,我们先简单介绍一下
ServletContext
这个官方的解释是servlet上下文,启动的时候,服务器会给每一个工程创建一个对象,这个对象就是ServletContext对象,且这个对象是全局唯一。而且整个工程内的servlet都共享这个对象。
首先我们先记住,ServletContext是一个域对象,不要急,这就给你介绍一下域对象
通过上图,相信你可以明白域对象是在这次充当什么角色的
那么究竟域对象究竟是什么呢
域对象是服务器在内存上创建的存储空间,用于不同动态资源(servlet)之间传递与共享数据
凡是域对象都有以下的三个方法
SetAttribute(name,value) |
往域对象里面添加数据,添加时以key-value形式添加 |
GetAttribute(name); |
根据指定的key读取域对象里面的数据 |
RemoveAttribute(name) |
根据指定的key从域对象里面删除数据 |
相信看到这里,不少打过代码的童鞋已经了解到了域对象究竟是啥东西了,SetAttribute这些方法,我们在往域对象传数据的时候,是经常使用的。
那么接下来我们就可以来了解一下
context-param
作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
在里面有param-name跟param-value
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
把这个信息读取完成之后,我们是转化为键值对的,交给了ServletContext
按照顺序,我们接下来需要了解的是Listener
Listener翻译过来就是监听器,顾名思义就是用来监听我们web活动的,这个很好理解,servlet一共提供了八个监听器
三个域对象的创建和销毁监听器
对象类型 |
对应的监听器 |
ServletContext |
ServletContextListener |
HttpSession |
HttpSessionListener |
HttpServletRequest |
HttpServletRequestListener |
监听三个对象的属性变更的监听器(属性添加,属性移除,属性替换)
对象类型 |
对应的监听器 |
ServletContext |
ServletContextAttributeListener |
HttpServletRequest |
ServletRequestAttributeListener |
HttpSession |
HttpSessionAttributeListener |
监听HttpSession对象中的JavaBean的状态的改变(绑定,解除绑定,钝化和活化)
对象类型 |
对应的监听器 |
HttpSession |
HttpSessionBindingListener(绑定,解除绑定) |
HttpSession |
HttpSessionActivationListener(钝化和活化) |
那么关于监听的介绍就到这里,深入的内容我会写另外一篇博客给大家深入介绍
接下来是关于filter,也就是过滤器,过滤器顾名思义就是用来过滤一些需要的信息
filter
过滤器实际上就是对web提交过来的数据,对服务器处理的信息,进行再交付给对方。你可以理解为一个中间加工处理的地方。
通常都是用来拦截request,和response进行拦截过滤处理
通过上图,我们可以更直观地了解到过滤器的工作角色,值得我们注意的是,过滤器可能会有多个,经过过滤器一过滤完之后,还需要通过滤器二进行过滤处理,因为每个过滤器都有自己特定的过滤功能
关于多个过滤器的执行顺序,我们请求到达Servlet之间是可以经过多个过滤器的,这些过滤器的执行顺序是依赖于<filter-mapping>里面配置的顺序。
servlet
servlet全称Java Servlet,是用Java编写的服务端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
在web.xml这里主要是将你所写的servlet对应的类配置到当中去,具体的servlet的详解可以看我关于servlet详解的文章