javaee学习之路(七)Servlet监听器

时间:2021-01-14 17:34:51

例1、基本的监听实例。
第一步、编写监听类.

package cn.itcast.listener;
import *;
/**
* servletContext对象上下文的监听
* @author Administrator
*
*/

public class MyServletContextListener implements ServletContextListener {
/**
* 当servletContext对象被创建时调用
*/

public void contextInitialized(ServletContextEvent sce) {
System.out.println("servletContext对象被创建 contextInitialized()");
//map中放置系统共有的信息
Map map=new HashMap();
map.put("mary", "xxxxxxxxxxxx");
ServletContext sc=sce.getServletContext();
System.out.println("sc "+sc);
sc.setAttribute("map", map);
}
/**
* 当servletContext对象销毁时调用
*/

public void contextDestroyed(ServletContextEvent sce) {
System.out.println("servletContext对象销毁 contextDestroyed() ");
}
}

第二步、在web.xml中注册监听器
……

 <listener>
<listener-class>cn.itcast.listener.MyServletContextListener</listener-class>
</listener>

……
第三步、编写测试servlet. TestSrvlet.java

package cn.itcast.web;
import *;
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取上下文
ServletContext sc = this.getServletContext();
System.out.println("servlet中的sc "+sc);
Map map = (Map)sc.getAttribute("map");
System.out.println(map.get("mary"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
doGet(request, response);
}
}

第四步、运行,观察结果:启动tomcat并在IE中键入:
http://localhost:8080/day18ServletListener/servlet/TestServlet
……
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@1735f84
……
信息: Server startup in 1851 ms
servlet中的sc org.apache.catalina.core.ApplicationContextFacade@1735f84
xxxxxxxxxxxx

重启服务器,可以看到:
……
servletContext对象销毁 contextDestroyed()
……
2012-10-24 19:22:44 org.apache.catalina.core.StandardContext addApplicationListener
信息: The listener “com.sun.faces.application.WebappLifecycleListener” is already configured for this context. The duplicate definition has been ignored.
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@f7ce53

例2、ServletSessionListener监听
javaee学习之路(七)Servlet监听器
第一步、编写监听类 MyHttpSessionListener.java

package cn.itcast.listener;
import *;
/**
* HttpSessionListener接口用于监听HttpSession对象的创建和销毁
*/

public class MyHttpSessionListener implements HttpSessionListener {
/**
* 创建一个Session时
*/

public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建一个Session时 sessionCreated ");
/*
* Map map=new HashMap();
map.put("mary", "xxxxxxxxxxxx");
ServletContext sc=sce.getServletContext();
System.out.println("sc "+sc);
sc.setAttribute("map", map);
*/

//获取ServletContext对象
ServletContext sc = se.getSession().getServletContext();
Map map=(Map)sc.getAttribute("map");
System.out.println("HttpSessionListener "+map.get("mary"));
}
/**
* 销毁一个Session时
*/

public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个Session时 sessionDestroyed");
}
}

第二步、在web.xml文件中注册监听器
……

<listener>
<listener-class>cn.itcast.listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>cn.itcast.listener.MyHttpSessionListener</listener-class>
</listener>

……
第三步、session.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'session.jsp' starting page</title>
</head>
<%
//session.setMaxInactiveInterval(3);3秒后消亡
System.out.println("创建一个Session时 sessionCreated ");
%>

<body>
This is my JSP page. <br>
</body>
</html>

第四步、执行结果:
1、启动tomcat
……
servletContext对象被创建 contextInitialized()
sc org.apache.catalina.core.ApplicationContextFacade@10948cf
……
信息: Server startup in 1561 ms
2、在IE中键入:
http://localhost:8080/day18ServletListener/session.jsp 执行结果:
创建一个Session时       sessionCreated
HttpSessionListener      xxxxxxxxxxxx
创建一个Session时      sessionCreated
例3、ServletRequestListener监听器
第一步、编写监听器类MyServletRequestListener.java

package cn.itcast.listener;
import *;
public class MyServletRequestListener implements ServletRequestListener {
/**
* 销毁一个ServletRequest对象时
*/

public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("销毁一个ServletRequest对象时 requestDestroyed");
System.out.println("ServletRequestListener监听中的"+sre.getServletRequest());
}
/**
* 创建一个ServletRequest对象时
*/

public void requestInitialized(ServletRequestEvent sre) {
System.out.println("创建一个ServletRequest对象时 requestInitialized ");
}
}

第二步、在web.xml中注册(注释掉前面的监听器)

<listener>
<listener-class>cn.itcast.listener.MyServletRequestListener</listener-class>
</listener>

第三步、request.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'session.jsp' starting page</title>

</head>
<%
System.out.println("jsp页面中的request:"+request);
%>

<body>
This is my JSP page. <br>
</body>
</html>

第四步、启动tomcat并在IE中键入:http://localhost:8080/day18ServletListener/request.jsp
得到如下结果:
javaee学习之路(七)Servlet监听器

例4、域对象中属性的变更的事件监听器之ServletContextAttributeListener
javaee学习之路(七)Servlet监听器
第一步、编写监听器类MyServletContextAttributeListener.java

package cn.itcast.listener;
import *;
public class MyServletContextAttributeListener implements
ServletContextAttributeListener {

/**
* web容器调用
* 在servletContext中增加属性时,调用
*/

public void attributeAdded(ServletContextAttributeEvent scab) {
System.out.println("servletContext增加属性 attributeAdded*****************");
System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());
}
/**
* web容器调用
* 在servletContext中删除属性时,调用
*/

public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println("servletContext删除属性 attributeRemoved*****************");
System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());
}
/**
* web容器调用
* 在servletContext中替换属性时,调用
*/

public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println("servletContext替换属性 attributeReplaced******************");
System.out.println("属性的key:"+scab.getName()+":属性的value:"+scab.getValue());
}
}

第二步、在web.xml中注册

<listener>
<listener-class>cn.itcast.listener.MyServletContextAttributeListener</listener-class>
</listener>

第三步、applicationAttr.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<%
application.setAttribute("username","zhang");
application.setAttribute("username","zhang1");
application.removeAttribute("username");
%>

<body>
This is my JSP page. <br>
</body>
</html>

第四步、观察运行结果:
1、启动tomcat
javaee学习之路(七)Servlet监听器
例5、域对象中属性的变更的事件监听器之HttpSessionAttributeListener
第一步、编写监听器类MyHttpSessionAttributeListener.java

package cn.itcast.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements
HttpSessionAttributeListener {

/**
* web容器调用
* 在session中增加属性时,调用
*/

public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("httpSession增加属性 attributeAdded***********************");
System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());

}
/**
* web容器调用
* 在session中删除属性时,调用
*/

public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("httpSession删除属性 attributeAdded***********************");
System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());
}
/**
* web容器调用
* 在session中替换属性时,调用
*/

public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("httpSession替换属性 attributeAdded***********************");
System.out.println("属性的key:"+se.getName()+":属性的value:"+se.getValue());
}
}

第二步、注册

<listener>
<listener-class>cn.itcast.listener.MyHttpSessionAttributeListener</listener-class>
</listener>

第三步、session.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<%
session.setAttribute("username","zhang");
session.setAttribute("username","zhang1");
session.removeAttribute("username");
%>

<body>
This is my JSP page. <br>
</body>
</html>

第四步、运行,启动tomcat在IE中键入:
http://localhost:8080/day18Listener/sessionAttr.jsp得到结果:
httpSession增加属性 attributeAdded***********************
属性的key:username:属性的value:zhang
httpSession替换属性 attributeAdded***********************
属性的key:username:属性的value:zhang
httpSession删除属性 attributeAdded***********************
属性的key:username:属性的value:zhang1

例6、域对象中属性的变更的事件监听器之ServletRequestAttributeListener 同例5
例7、感知session绑定的事件监听器之HttpSessionBindingListener。
第一步、编写javabean User.java

package cn.itcast.listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener{
private String name;
private String psw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
/**由web容器调用
* 在session中放置javabean
*/

public void valueBound(HttpSessionBindingEvent event) {
System.out.println("valueBound************************");
System.out.println("HttpSessionBinding session"+event.getSession());
String name=event.getName();
User user = (User)event.getValue();
if(user!=null){
System.out.println("属性的key:"+name+" 属性的value:"+user.getName()+" "+user.getPsw());
}

}
/**
* 在session中删除javabean
*/

public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("valueUnbound***********************");
String name=event.getName();
User user = (User)event.getValue();
if(user!=null){
System.out.println("属性的key:"+name+" 属性的value:"+user.getName()+" "+user.getPsw());
}else{
System.out.println("user==null");
}
}
}

第二步、sessionBing.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%@ page import="cn.itcast.listener.*"%>
……
<%
User user=new User();
user.setName("zhang");
session.setAttribute("user",user);
//上一行代码,web容器会调用valueBound方法,
System.out.println("jsp页面中的session:"+session);
User user1=new User();
user1.setName("zhangfeng");
session.setAttribute("user",user1);
session.removeAttribute("user");
%>

<body>
This is my JSP page. <br>
</body>
</html>

第三步、启动tomcat并在IE中键入:
javaee学习之路(七)Servlet监听器
例8、感知session绑定的事件监听器之HttpSessionBindingListener。
第一步、

package cn.itcast.listener;
import *;
public class User implements HttpSessionActivationListener,java.io.Serializable{
private String name;
private String psw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
/**
* 把session对象保存到硬盘上(要序列化)
*/

public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("钝化******************************");
}
/**
* 把session对象从硬盘上读取(要序列化)
*/

public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("活化******************************");
}
}

第二步、sessionBing.jsp

<%
User user=new User();
user.setName("zhang");
session.setAttribute("user",user);
//上一行代码,web容器会调用valueBound方法,
// System.out.println("jsp页面中的session:"+session);
// User user1=new User();
//user1.setName("zhangfeng");
//session.setAttribute("user",user1);
//session.removeAttribute("user");
%>

第三步、运行观察结果:
1. 启动tomcat,在IE中键入:http://localhost:8080/day18Listener1/sessionBing.jsp
2. 关闭tomcat可以看到:
……
钝化********************
……
此时打开C:\apache-tomcat-6.0.20\work\Catalina\localhost\day18Listener1
可以看到钝化的结果:将session写入到了硬盘上面!!!
3. 启动tomcat:
……
信息: Starting Servlet Engine: Apache Tomcat/6.0.20
活化********************
……
信息: Server startup in 2072 ms
C:\apache-tomcat-6.0.20\work\Catalina\localhost\day18Listener1中的session文件消失:读入到了文件中了!(活化的结果)

注意:sessionBing.jsp中注释部分一定要注释,否则出错!!!
实例:网站的在线人数统计
javaee学习之路(七)Servlet监听器
javaee学习之路(七)Servlet监听器
javaee学习之路(七)Servlet监听器
1、User.java

package cn.itcast.bean;
/**
* 用户类
* @author Administrator
*
*/

public class User {
private String username;
private String psw;
……
}

2、SessionUser.java

package cn.itcast.bean;
import *;
public class SessionUser extends User implements HttpSessionBindingListener{
private String ip;//登录用户和游客的IP
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public void valueBound(HttpSessionBindingEvent event) {
//System.out.println("valueBound******************");
//这里的this(SessionUser对象)与login.jsp中新建的SessionUser一样
//1.获取session
HttpSession session=event.getSession();
//2.获取sessionid
String sessionid=session.getId();
//3.获取上下文对象
ServletContext sc=session.getServletContext();
//4.从上下文对象中获取onlinemap(Map)
Map<String,SessionUser> map = (Map)sc.getAttribute("onlinemap");
//5.放置sessionUser对象到Map中
map.put(sessionid, this);
}
public void valueUnbound(HttpSessionBindingEvent event) {}
}

3、MyServletContextListener.java

package cn.itcast.listener;
import *;
/*
* 上下文监听
*/

public class MyServletContextListener implements ServletContextListener {
/**
* 服务器启动时调用,执行顺序最先执行
*/

public void contextInitialized(ServletContextEvent sce) {
//System.out.println("contextInitialized");
//初始化集合
Map<String,SessionUser> map=new HashMap<String,SessionUser>();
//获取servletContext
ServletContext sc=sce.getServletContext();
if(sc!=null){
//System.out.println("map***********************");
sc.setAttribute("onlinemap", map);
}
}
public void contextDestroyed(ServletContextEvent sce) {
}
}

4、login.jsp

<%
//获取客户端IP
String ip=request.getRemoteAddr();
System.out.println(ip);
//创建SessionUser对象
SessionUser sessionUser=new SessionUser();
sessionUser.setIp(ip);
//用户名为空null
//放置到Session中
session.setAttribute("userInfo",sessionUser);
%>

<body>
<h2>登陆页面游客可以访问login.jsp</h2>
<form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">
用户名:<input type="text" name="username"/>
密码:<input type="password" name="psw"/>
<input type="submit" value="登录"/>
</form>
<hr>
<a href="">中俄建交十周年</a>
</body>
</html>

5、onlinenum.jsp
……

 <body>
显示注册用户信息:<br/>
<c:forEach items="${applicationScope.onlinemap}" var="sessionUser">
<c:if test="${sessionUser.value.username!=null}">
${sessionUser.value.ip}~~~~~~~${sessionUser.value.username}~~~~~~
<a href="${pageContext.request.contextPath}/servlet/RemoveServlet?sessionid=${sessionUser.key}">转为游客</a><br/>
</c:if>
</c:forEach>
<br/> <br/>

显示游客信息:<br/>
<c:forEach items="${applicationScope.onlinemap}" var="sessionUser">
<c:if test="${sessionUser.value.username==null}">
${sessionUser.value.ip}~~~~~~~${sessionUser.value.username}<br/>
</c:if>
</c:forEach>

……
6、LoginServlet.java

package cn.itcast.web;
import *;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String path="";
HttpSession session=request.getSession(false);
//<input type="text" name="username"/>
String username=request.getParameter("username");
if(session!=null){
//session.setAttribute("userInfo",sessionUser);
User user=(User)session.getAttribute("userInfo");
user.setUsername(username);
path="/WEB-INF/jsp/title.jsp";
}
request.getRequestDispatcher(path).forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

7、title.jsp
……

<body>
<h2>只有登录用户才能看到此页面</h2>
<hr>
<a href="">中俄反恐演习顺利结束!</a>

……
8、RemoveServlet.java

package cn.itcast.web;
import *;
public class RemoveServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取Sessionid
String sessionid=request.getParameter("sessionid");
//获取ServletContext对象
ServletContext sc=this.getServletContext();
//从ServletContext中获取集合
Map<String,SessionUser> onlinemap=(Map<String,SessionUser>)sc.getAttribute("onlinemap");
//从集合中找出sessionUser对象
SessionUser sessionUser=onlinemap.get(sessionid);
//更改用户名为null
sessionUser.setUsername(null);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

9、MyHttpSessionListener.java

package cn.itcast.listener;
import *;
public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
}
/**web容器自动调用
* 当session过期后或消亡的时候,才能执行该方法
*/

public void sessionDestroyed(HttpSessionEvent se) {
//1.获取session
HttpSession session=se.getSession();
//2.获取sessionid
String sessionid=session.getId();
//3.获取上下文
ServletContext sc=session.getServletContext();
//4.获取集合
Map<String,SessionUser> onlinemap=(Map<String,SessionUser>)sc.getAttribute("onlinemap");
//5.从集合中清除
onlinemap.remove(sessionid);
//6.session中userInfo也 删除
session.removeAttribute("userInfo");
}
}

10、web.xml
……

<listener>
<listener-class>cn.itcast.listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>cn.itcast.listener.MyServletContextListener</listener-class>
</listener>

……
11.观察效果:
在浏览器中开多个窗口,访问:http://localhost:8080/day18onlineCount/login.jsp
然后在浏览器中键入:http://localhost:8080/day18onlineCount/onlinenum.jsp 即可进行后台管理