35.监听器listener

本文深入解析Servlet监听器的各类接口,包括监听对象创建/销毁、属性变化及session相关事件。通过具体实现类示例,展示如何监听request、session和servletContext对象的状态变更,以及属性的添加、移除和修改。

监听器接口:

一、监听对象创建/销毁的监听器接口

         Interface ServletRequestListener     监听request对象的创建或销毁

         Interface HttpSessionListener        监听session对象的创建或销毁

         Interface ServletContextListener     监听servletContext对象的创建或销毁

二、监听对象属性的变化

         Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改

         Interface HttpSessionAttributeListener    监听session对象属性变化: 添加、移除、修改

         Interface ServletContextAttributeListener  监听servletContext对象属性变化

 

三、session相关监听器

         Interface HttpSessionBindingListener   监听对象绑定到session上的事件     

         Interface HttpSessionActivationListener(了解) 监听session序列化及反序列化的事件

public class MyRequestListener implements ServletRequestListener{

	// 对象销毁
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		// 获取request中存放的数据
		Object obj = sre.getServletRequest().getAttribute("cn");
		System.out.println(obj);
		System.out.println("MyRequestListener.requestDestroyed()");
	}

	// 对象创建
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("MyRequestListener.requestInitialized()");
	}
}

public class MyServletContextListener implements ServletContextListener{

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("MyServletContextListener.contextDestroyed()");
	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("1..........MyServletContextListener.contextInitialized()");
	}

}

public class MySessionListener implements HttpSessionListener{

	// 创建
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("MySessionListener.sessionCreated()");
	}

	// 销毁
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("MySessionListener.sessionDestroyed()");
	}

}
<!-- 监听request对象创建、销毁 -->
	<listener>
		<listener-class>cn.itcast.a_life.MyRequestListener</listener-class>
	</listener>
	<!-- 监听session对象创建、销毁 -->
	<listener>
		<listener-class>cn.itcast.a_life.MySessionListener</listener-class>
	</listener>

	<!-- 监听servletContext对象创建、销毁 -->
	<listener>
		<listener-class>cn.itcast.a_life.MyServletContextListener</listener-class>
	</listener>

2.属性类

public class MySessionAttrListener implements HttpSessionAttributeListener {

	// 属性添加
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		// 先获取session对象
		HttpSession session = se.getSession();
		// 获取添加的属性
		Object obj = session.getAttribute("userName");
		// 测试
		System.out.println("添加的属性:" + obj);
	}

	// 属性移除
	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("属性移除");
	}

	// 属性被替换
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// 获取sesison对象
		HttpSession session = se.getSession();
		
		// 获取替换前的值
		Object old = se.getValue();
		System.out.println("原来的值:" + old);
		
		// 获取新值
		Object obj_new = session.getAttribute("userName");
		System.out.println("新值:" + obj_new);
		
	}

}
<listener>
		<listener-class>cn.itcast.b_attr.MySessionAttrListener</listener-class>
	</listener>

3.

public class Admin implements HttpSessionBindingListener {

	private int id;
	private String name;
	
	public Admin() {
		super();
	}
	public Admin(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
	
	// 构造函数
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	// 对象放入session
	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("Admin对象已经放入session");
	}
	// 对象从session中移除
	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		System.out.println("Admin对象从session中移除!");
	}
	
}

 

在启动Java Web应用时,遇到 `java.lang.ClassNotFoundException: org.jeecgframework.web.system.listener.InitListener` 错误,通常表明应用服务器(如Tomcat)无法在类路径中找到指定的监听器类。以下是一些可能的解决方法: ### 1. 检查依赖库是否正确配置 确保 `org.jeecgframework.web.system.listener.InitListener` 类所在的JAR文件已正确添加到项目的依赖管理中,并且已部署到服务器的 `WEB-INF/lib` 目录下。如果使用Maven或Gradle等构建工具,检查 `pom.xml` 或 `build.gradle` 文件中是否包含相关的依赖配置。 ### 2. 验证类路径配置 确认 `WEB-INF/classes` 目录或相关的JAR包中确实包含 `org.jeecgframework.web.system.listener.InitListener` 类。可以通过解压JAR文件或检查编译输出目录来验证。 ### 3. 检查 `web.xml` 中的监听器配置 确保在 `web.xml` 文件中正确配置了监听器。例如: ```xml <listener> <listener-class>org.jeecgframework.web.system.listener.InitListener</listener-class> </listener> ``` 如果类名或包路径有误,请进行相应的修改。 ### 4. 清理并重新构建项目 有时,构建过程中可能会残留旧的配置或编译文件。尝试清理项目并重新构建,以确保所有资源和类文件都正确生成。例如,在Maven项目中可以使用以下命令: ```bash mvn clean install ``` ### 5. 检查服务器部署配置 如果使用Eclipse等IDE进行部署,确保服务器配置中正确关联了项目的部署目录。检查 `server.xml` 或其他服务器配置文件,确保应用的部署路径和类路径设置正确。 ### 6. 检查类加载器问题 某些应用服务器可能由于类加载器的层次结构问题导致类无法加载。尝试将相关的JAR文件放置在服务器的共享库目录中,或者调整类加载器的配置。 ### 7. 检查版本兼容性 确保使用的 `org.jeecgframework` 框架版本与当前的Java版本和应用服务器版本兼容。如果不兼容,尝试升级或降级相关组件。 ### 8. 日志分析 详细查看服务器日志,寻找其他可能相关的错误或警告信息,这些信息可能提供关于类加载失败的更多线索。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值