javaWeb中servlet开发——监听器
监听的定义

对application的监听
application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口:
servletContextListener:是对整个上下文环境的监听
servletContextAttrubiteListener:是对属性的监听。
import javax.servlet.* ;
public class ServletContextListenerDemo implements ServletContextListener {
public void contextInitialized(ServletContextEvent event){
System.out.println("** 容器初始化 --> " + event.getServletContext().getContextPath()) ;
}
public void contextDestroyed(ServletContextEvent event){
System.out.println("** 容器销毁 --> " + event.getServletContext().getContextPath()) ;
try{
Thread.sleep(300) ;
}catch(Exception e){}
}
}
在web.xml中配置<listener>
如果在web.xml中有servlet、filter、listener,则配置顺序如下
<filter>
<filter-mapping>
<listener>
<servlet>
<servlet-mapping>
使用servletContextAttributeListener操作属性
import javax.servlet.* ;
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent scab){
System.out.println("** 增加属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
}
public void attributeRemoved(ServletContextAttributeEvent scab){
System.out.println("** 删除属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
}
public void attributeReplaced(ServletContextAttributeEvent scab){
System.out.println("** 替换属性 --> 属性名称:" + scab.getName() + ",属性内容:" + scab.getValue()) ;
}
}
web.xml中配置
<listener>
<listener-class>
org.lxh.listenerdemo.ServletContextAttributeListenerDemo
</listener-class>
</listener>
jsp中显示:
<%
request.setAttribute("info","www.MLDNJAVA.cn") ;
%>
对session的监听

注意:session是属于http协议范畴,所以这些接口是在javax.servlet.http中定义的。
在servlet中,要想取得session依靠的是httpServletRequest接口中的getSession()方法。
import javax.servlet.http.* ;
public class HttpSessionListenerDemo implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se){
System.out.println("** SESSION创建,SESSION ID = " +se.getSession().getId() ) ;
}
public void sessionDestroyed(HttpSessionEvent se){
System.out.println("** SESSION销毁,SESSION ID = " +se.getSession().getId() ) ;
}
}
之后进行web.xml配置,启动服务器
当客户端第一次连接到服务器时,服务器会自动为用户创建一个session,同时分配一个sessionId。
session已经被创建,在第一次访问时触发事件,但什么时候被注销?
如果要想session被注销,有两种方法,但这两种方法都不是关闭页面可以实现的。
方法1:session注销---invaldate();
方法2:超时时间设置——在tomcat中一般时间设置为30min,也可以自己在web.xml中修改
<% // 手工注销
session.invalidate() ;
%>
当调用invalidate()方法时session就被销毁了。
当然,时间越长,占用内存越大。
web.xml中设置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
对session中的属性进行监听
import javax.servlet.http.* ;
public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent se){
System.out.println(se.getSession().getId() + ",增加属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
}
public void attributeRemoved(HttpSessionBindingEvent se){
System.out.println(se.getSession().getId() + ",删除属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
}
public void attributeReplaced(HttpSessionBindingEvent se){
System.out.println(se.getSession().getId() + ",替换属性 --> 属性名称" + se.getName() + ",属性内容:" + se.getValue()) ;
}
}
<%
session.setAttribute("info","www.MLDNJAVA.cn") ;
%>
到此为止,都与servletContext非常相似,之前所有的的监听都要在web.xml中进行配置,但是在session中有一个HttpSessionBindingListener也是实现监听的接口,但是这个接口不需要配置,可以直接使用。
import javax.servlet.http.* ;
public class LoginUser implements HttpSessionBindingListener {
private String name ;
public LoginUser(String name){
this.setName(name) ;
}
public void valueBound(HttpSessionBindingEvent event){
System.out.println("** 在session中保存LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
}
public void valueUnbound(HttpSessionBindingEvent event){
System.out.println("** 从session中移出LoginUser对象(name = " + this.getName() + "),session id = " + event.getSession().getId()) ;
}
public String getName(){
return this.name ;
}
public void setName(String name){
this.name = name ;
}
}
此时不需要配置web.xml,但是jsp中就比较麻烦。
<%
LoginUser user = new LoginUser("MLDN") ;
session.setAttribute("info",user) ; // 直接保存LoginUser对象
%>
对request监听

import javax.servlet.* ;
public class ServletRequestListenerDemo implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent sre){
System.out.println("** request初始化。http://" +
sre.getServletRequest().getRemoteAddr() +
sre.getServletContext().getContextPath()) ;
}
public void requestDestroyed(ServletRequestEvent sre){
System.out.println("** request销毁。http://" +
sre.getServletRequest().getRemoteAddr() +
sre.getServletContext().getContextPath()) ;
}
}
在web.xml中进行配置
<listener>
<listener-class>
org.lxh.listenerdemo.ServletRequestListenerDemo
</listen
对request中属性操作
import javax.servlet.* ;
public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {
public void attributeAdded(ServletRequestAttributeEvent srae){
System.out.println("** 增加request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
}
public void attributeRemoved(ServletRequestAttributeEvent srae){
System.out.println("** 删除request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
}
public void attributeReplaced(ServletRequestAttributeEvent srae){
System.out.println("** 替换request属性 --> 属性名称:" + srae.getName() + ",属性内容:" + srae.getValue()) ;
}
}
从实际来说,对request监听用的不多,用的最多的是对servletContext 和httpSession的监听。
监听实例

import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class OnlineUserList implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener {
private ServletContext app = null ;
public void contextInitialized(ServletContextEvent sce){
this.app = sce.getServletContext() ;
this.app.setAttribute("online",new TreeSet()) ; // 准备集合
}
public void contextDestroyed(ServletContextEvent sce){
}
public void attributeAdded(HttpSessionBindingEvent se){
Set all = (Set) this.app.getAttribute("online") ;
all.add(se.getValue()) ;
this.app.setAttribute("online",all) ;
}
public void attributeRemoved(HttpSessionBindingEvent se){
Set all = (Set) this.app.getAttribute("online") ;
all.remove(se.getSession().getAttribute("userid")) ;
this.app.setAttribute("online",all) ;
}
public void attributeReplaced(HttpSessionBindingEvent se){}
public void sessionCreated(HttpSessionEvent se){}
public void sessionDestroyed(HttpSessionEvent se){
Set all = (Set) this.app.getAttribute("online") ;
all.remove(se.getSession().getAttribute("userid")) ;
this.app.setAttribute("online",all) ;
} }
<form action="login.jsp" method="post">
用户ID:<input type="text" name="userid">
<input type="submit" value="登陆">
</form>
<%
String userid = request.getParameter("userid") ;
if(!(userid==null || "".equals(userid))){
session.setAttribute("userid",userid) ;
response.sendRedirect("list.jsp") ;
}
%>
<%
Set all = (Set) this.getServletContext().getAttribute("online") ;
Iterator iter = all.iterator() ;
while(iter.hasNext()){
%>
<h3><%=iter.next()%></h3>
<%
}
%>
javaWeb中servlet开发——监听器的更多相关文章
- javaWeb中servlet开发——过滤器
servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...
- javaWeb中servlet开发(5)——WEB开发模式:Mode I与Mode II
1.servlet开发 2.model I模式 客户端通过访问JSP,调用里面的javabean,而通过javabean调用处理数据库的操作,javabean中有专门处理数据库的操作,数据库主要以DA ...
- javaWeb中servlet开发(4)——servlet跳转
servlet跳转 1.跳转类型 客户端跳转:跳转后地址栏改变,无法传递request范围内属性,是在所有的操作都执行完毕之后才发生跳转的操作,跳转语法是,response.sendRedict() ...
- javaWeb中servlet开发(3)——Servlet生命周期
生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 publi ...
- javaWeb中servlet开发(2)——servlet与表单
1.重写doGet方法 public class InputServlet extends HttpServlet{ public void doGet(HttpServletRequest req, ...
- javaWeb中servlet开发(1)——helloworld
1.servlet 1.1 servlet简介 1.2 servlet流程 不管是servlet还是jsp,所有的程序都是在服务器端处理的,所以必须了解一个servlet基本流程 servlet和JS ...
- javaweb(五)——Servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- JavaWeb中servlet读取配置文件的方式
我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...
- javaweb(六)——Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
随机推荐
- freopen()——重定向标准输入输出流
freopen()——重定向标准输入输出流 头文件:stdio.h 函数原型:FILE * freopen(const char *filename , const char *type , FIL ...
- RBF高斯径向基核函数【转】
XVec表示X向量.||XVec||表示向量长度.r表示两点距离.r^2表示r的平方.k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2))= exp(-gamma*r^2) ...
- hdu 4268 multiset+贪心
Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? /* ...
- thinkphp where()条件查询
今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置.where方法的用法是ThinkPHP查询语言的精髓,也是Think ...
- 简单几何(判断矩形的位置) UVALive 7070 The E-pang Palace(14广州B)
题目传送门 题意:给了一些点,问组成两个不相交的矩形的面积和最大 分析:暴力枚举,先找出可以组成矩形的两点并保存起来(vis数组很好),然后写个函数判断四个点是否在另一个矩形内部.当时没有保存矩形,用 ...
- 逆序数2 HDOJ 1394 Minimum Inversion Number
题目传送门 /* 求逆序数的四种方法 */ /* 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N] 它的 ...
- reqSUB错误
---- ERROR ---- Error in dispatcher subroutine reqSUB: Invalid PAR(1): 0502 上面是用adams/ca加载一个汽车模型时 ...
- Unity3d中SendMessage 用法简单笔记
Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastMes ...
- 如何在 .Net Framework 4.0 项目上使用 OData?
最新的 Microsoft ASP.NET Web API 2.1 OData 5.1.0 已只能在 .Net Framework 4.5 的安装了,如果要在 VS2010的 .Net Framewo ...
- Android解析XML(PULL方式)
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...