web项目下的web.xml listener监听总结
2019独角兽企业重金招聘Python工程师标准>>>
监听域对象中属性的监听器
域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
首先可以肯定的是,加载顺序与它们在 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 类似 ,此处不再赘述。
由此,可以看出,web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。
实现HttpSessionAttributeListener 的例子
web.xml中配置:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>com.brand.common.listener.LogoutListener</listener-class>
</listener>
LogoutListener.java 程序代码:
package com.brand.common.listener;
import java.util.Map;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.tugou.bean.UserInofrmationBean;
public class LogoutListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
@SuppressWarnings("unchecked")
public void sessionDestroyed(HttpSessionEvent event) {
// 在session销毁的时候 把loginUserMap中保存的键值对清除
UserInofrmationBean user = (UserInofrmationBean) event.getSession()
.getAttribute(UserInofrmationBean.USER_FRONT_SESSION);
Map<String, String> loginUserMap = (Map<String, String>) event.getSession().getServletContext().getAttribute(
"loginUserMap");
if(loginUserMap!=null){
loginUserMap.clear();
}
event.getSession().getServletContext().setAttribute("loginUserMap",loginUserMap);
}
}
2、实现ServletContextAttributeListener的监听例子,读取fdfs.properties配置文件
web.xml配置:
<listener>
<description>初始化资源信息</description>
<listener-class>com.brand.common.listener.InitEnvListener</listener-class>
</listener>
InitEnvListener.java程序代码:
package com.brand.common.listener;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.web.context.WebApplicationContext;
public class InitEnvListener implements ServletContextListener {
@SuppressWarnings("unused")
private WebApplicationContext springContext;
public void contextDestroyed(ServletContextEvent evt) {
}
public void contextInitialized(ServletContextEvent evt) {
try{
FileInputStream in =null;
InputStreamReader inreader=null;
try{
Properties props = new Properties();
File fdfsConfig=new File(Thread.currentThread().getContextClassLoader().getResource("fdfs.properties").getPath());
in= new FileInputStream(fdfsConfig);
inreader=new InputStreamReader(in,"utf-8");
props.load(inreader);
String imagerootpath = props.getProperty("imagerootpath");
evt.getServletContext().setAttribute("fdfs.imagerootpath", imagerootpath);//页面上取时用application
}finally{
if(inreader!=null){
inreader.close();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
转载于:https://my.oschina.net/kevin007F/blog/524911
web项目下的web.xml listener监听总结相关推荐
- Web项目下的WebRoot和WebContent
Web项目发布到Tomcat中. 在Eclipse中生成项目是WebContent目录 而在MyEclipse中生成的项目目录名字好像叫做WebRoot,那么如果把MyEclipse的项目导入到Ecl ...
- Web三大组件的注册——Servlet、Filter、Listener(监听三大作用域: ServletContext、HttpSession、ServletRequest )
Web三大组件的注册 Servlet @WebServlet("/user.action") <servlet> </servlet> <servle ...
- web.py开发web 第四章 Sqlalchemy(事件监听与初始化)
2019独角兽企业重金招聘Python工程师标准>>> 上一章讲了sqlalchemy的数据库创建,我想大家应该会慢慢喜欢上用这种方式来创建数据库吧,sqlalchemy不仅仅能自动 ...
- 红橙Darren视频笔记 自定义RatingBar touch事件学习 dp转px listener监听
效果图: 一 需求分析 我们需要实现评分的控件 那么主要有几步 1.绘制出评分控件 2.响应用户的触摸改变星星数 3.控件发生星星变化时通知监听者 二 自定义属性 需要属性: 星星总数 选中星星的图片 ...
- pacemaker的HA集群无法启动listener监听故障的处理
项目场景: 提示:这里简述项目相关背景: 之前帮客户在Oracle Linux 7.9下搭建了一套HA集群(pacemaker),最近做测试时候发现了一个集群切换后的BUG. 因为软件安装完全在共享存 ...
- Flutter Listener 监听手指的滑动方向、监听手指上下滑动
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- Android的Listener监听事件分析
Android中的回调一直是我难以理解的一部分,总是很容易绕进去,但是细细想一下其实这些方法或者称之为函数都是在一个线程乃至一个进程中执行,肯定会存在先后的顺序,下面就先分析一下Listener,以后 ...
- eclipse查看web项目下classes文件夹的方法
1. web-inf下的classes目录一般是存放程序的class文件的. 通常的eclipse视图看不到此文件夹,需要切换视图为Navigator (Window->show view-&g ...
- Listener监听器之HttpSessionListener
编写一个OnlineUserListener. package anni; import java.util.List; import javax.servlet.ServletContext; im ...
最新文章
- FPGA的设计艺术(13)使用generate语句构建可重用的逻辑设计
- Linux之telnet命令使用详解—网络故障定位(四)
- KVM中virtio-user工作思路(十二)
- CSS你可能还不知道的一些知识点
- 《深入理解计算机系统》读书笔记六:整数表示
- pig连接oracle数据库,Pig安装讲解
- 谁扰乱了中国的工资秩序?
- python2.7 安装第三方库
- MIUI刷第三方rec教程(回退系统)
- Linux操作系统——vi文本编辑器
- Catia CAA二次开发视频教程+源代码+PDF教程
- 尚德机构第四季度营收5.688亿元 亏损大幅缩小
- 嵌入式Linux开发
- 【车牌识别】模板匹配新能源车牌识别【含Matlab源码 865期】
- jsjquery获取url域名及参数的方法
- 数据的正态分布验证和方差齐性检验
- 看雪ctf 流浪者 WP
- Emacs_快捷键列表
- http协议中get和post的区别(转)
- 台达伺服ASDA-B2调试
热门文章
- 关于单链表的几个问题
- jenkins自动部署配置
- 面试时被问如何进行接口测试怎么回答
- python类中包含一个特殊的变量、它可以访问类的成员_Python 类的特殊成员介绍...
- 鸿蒙os编码_如何看待鸿蒙OS代码示例?
- R语言实现混频数据分析
- 程序员:凭什么他大专12K,而我硕士研究生才5K?
- 设计师面试提前准备好这10个面试问题,助你面试成功
- 计算机课程可在平板上做吗,老师做直播,孩子上网课,掌控线上学习就靠这个平板电脑了...
- 单位阶跃信号是周期信号吗_iPhone12的信号有改观吗?