监听域对象创建和销毁的Listener
1.什么是Servlet监听器?
先来看看什么是监听器。监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时立即采取相应的行动。Servlet监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序的ServletContext,HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
按监听的事件类型Servlet监听器可分为如下三种类型:
- 监听域对象自身的创建和销毁的事件监听器
- 监听域对象中的属性的增加和删除的事件监听器
- 监听绑定到HtppSession域中的某个对象的状态的事件监听器
2.域对象创建和销毁的事件监听器
域对象创建和销毁的事件监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象的创建和销毁事件的监听器。域对象的创建和销毁时机:
- ServletContext:当web服务器启动时为每个web应用程序创建相应的ServletContext对象,web服务器关闭时为每个web应用程序销毁相应的ServletContext对象。
- HttpSession:浏览器开始与服务器会话时创建,调用HttpSession.invalidate();超过了session的最大有效时间间隔;服务器进程被停止。
- ServletRequest:每次请求开始时创建,每次访问结束后销毁。
3.如何编写Servlet监听器?
- Servlet规范为每种事件监听器都定义了相应的接口,编写事件监听程序只需要实现这些接口。
- 在web.xml中进行注册,web服务器按照它们在web.xml中的注册顺序来加载和执行这些Servlet事件监听器。
4.ServletContextListener接口
ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。
编写监听器,代码如下:
package com.javaweb.Listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class servletContextListenerTest implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁");
} }
在web.xml中进行配置:
<listener>
<description>ServletContextListener</description>
<listener-class>com.javaweb.Listener.servletContextListenerTest</listener-class>
</listener>
ServletContextListener是最常用的Listener,可以在当前web应用被加载时对当前web应用的相关资源进行初始化操作;创建数据库连接池,创建Spring的IOC容器,读取当前web应用的初始化参数。
监听域对象创建和销毁的Listener还有HttpSessionListener以及ServletRequestListener。用法类似ServletContextListener。
5.通过Listener理解域对象生命周期
5.1 request:是一个请求,当一个响应返回时,即被销毁,当发送一个请求时被创建。
index.jsp
<body>
<a href="Listener/test.jsp">to test page</a>
<%
request.setAttribute("resquestKey","requestValue");
%>
</body>
test.jsp
<body>
<%= request.getAttribute("resquestKey") %>
</body>
运行index.jsp,发送一个请求,返回一个响应页面,
request请求被销毁。此时在index.jsp页面设置的属性request.setAttribute("resquestKey","requestValue");在test.jsp页面中获取不到对应的属性值,入下:
可以通过请求转发(请求转发只有一个request)实现上述功能:
<%
request.setAttribute("resquestKey","requestValue");
%>
<jsp:forward page="/Listener/test.jsp"></jsp:forward>
在index.jsp页面点击超链接到TestServlet,在TestServlet中将请求转发到test.jsp页面。中间涉及到的是一个request请求。
index.jsp
<body>
<a href="TestServlet">testServlet</a>
</body>
testServlet.java
package com.javaweb.Listener; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class testServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("requestKey", "requestValue2");
request.getRequestDispatcher("/Listener/test.jsp").forward(request, response);
} }
test.jsp
<body>
<%= request.getAttribute("requestKey") %>
</body>
web.xml中进行配置:
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.javaweb.Listener.testServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
运行后可以获得设置的request属性值。
若将testServlet.java中的请求转发request.getRequestDispatcher("/Listener/test.jsp").forward(request, response);改为请求重定向response.sendRedirect("/Listener/test.jsp");则涉及到两个request请求。
5.2 session:当第一次访问web应用的一个JSP或Servlet时,且该JSP或servelet中还需要创建session对象,此时服务器会创建一个session对象。
session销毁:session过期;直接调用session的invalidate方法;当前web应用被卸载。
session过期:
<%
HttpSession session=request.getSession(true);
session.setMaxInactiveInterval(10);
%>
session的invalidate方法:
<%
HttpSession session=request.getSession(true);
session.invalidate();
%>
关闭浏览器,并不意味着session被销毁,还可以通过sessionid找到服务器中的session对象。
5.3 application:贯穿于当前的web应用的生命周期,当前web应用被加载时创建application对象,当前web应用被卸载时销毁application对象。
wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!
监听域对象创建和销毁的Listener的更多相关文章
- Java监听器中ServletRequestListener监听Request的创建和销毁
ServletRequest和HttpServletRequest的区别 HttpServletRequest和ServletRequest都是接口,HttpServletRequest继承自Serv ...
- centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例
centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例 一.监听配置(命令:netca) 1.以 oracle 用户输入命令,启动图形化工具配置监听 [oracle@lo ...
- 使用HttpSessionListener接口监听Session的创建和失效
转自:http://uule.iteye.com/blog/824115 HttpSessionListener : Session创建事件发生在每次一个新的session创建的时候,类似地Sessi ...
- nginx源代码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接
作为一个webserver,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是依据配置文件的内容来创建的,在nginx.conf文件里有多少个地址就须要创建多少个 ...
- android 监听动画对象后不能播放动画
采用监听 AnimationListener 发现不能播放动画了. 解决办法: 将动画的启动方式:animation.startnow去掉,改为如下即可 view.startAnimation(an ...
- javaScript学习关于常用注册监听和对象的创建
JS 中的自定义对象(扩展内容) Object 形式的自定义对象 对象的定义: ...
- Listener 监听对象的创建和销毁
HttpSessionListener.ServletContextListener.ServletRequestListener分别用于控制Session.context.request的创建和销毁 ...
- javaWeb学习之Listener监听
] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet listener filt ...
- 域对象中属性变更及感知session绑定的事件监听器
域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...
随机推荐
- react.js学习之路六
学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...
- HTML5中本地储存概念是什么,什么优点 ,与cookie有什么区别?
html5中的Web Storage 包括了两种存储方式: sessionStorage 和 localStorage. seessionStorage 用于本地存储一个会话(session)中的 ...
- [AIR] 与本地进程(应用程序)进行通讯
毫不夸张的说,此功能可以将Windows命令行程序(cmd.exe)通过AIR应用封装起来,并指挥它做任何你想做的事情 AIR2.0及以上与本地进程的交互主要体现在以下几方面: 启动进程并提供初始参数 ...
- svn提交新文件夹同时不需要更新全部上级目录
关于svn的指定目录指定位置更新:当在提交了新建的目录后可以使用 a) 在需要更新的上级目录上单击右键 在延伸菜单中选择 b) 弹出对话框中选择,check repository c) 新添加的 ...
- windows10下使用ubuntu,并搭建nodejs环境
1.首先要在win10的设置里打开开发人员使用模式 2.在bash下,下载ubuntu系统 3.安装git,因为要把下载nvm的话,需要git sudo apt-get install git 4.安 ...
- 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...
- K2路由器刷机笔记
临近双11,K2路由器广告加的越来越放肆,实在太难忍受就刷了个固件.这里把路由器刷机的一般流程记录一下. 一.开启telnet 刷固件,首先要取得路由器系统的控制权,这样我们才能自由的进行操作. 方法 ...
- ubuntu->桌面版-常用设置
1.目前使用unity桌面 ,使用Gnome,未来将会采用 Qt/QML 语言写的桌面 2.汉化 系统: 在 设置(setting)->语言支持(language support)->选择 ...
- 51 Nod 1024 Set
1024 矩阵中不重复的元素 1 秒 131,072 KB 10 分 2 级题 一个m*n的矩阵. 该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b 第二列是a^( ...
- mocha测试框架
中文翻译文档:https://www.jianshu.com/p/9c78548caffa 阮一峰:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tut ...