javaee学习之路(七)Servlet监听器
来源:互联网 发布:js注释快捷键 edit 编辑:程序博客网 时间:2024/06/06 19:37
例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监听
第一步、编写监听类 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
得到如下结果:
例4、域对象中属性的变更的事件监听器之ServletContextAttributeListener
第一步、编写监听器类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
例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中键入:
例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中注释部分一定要注释,否则出错!!!
实例:网站的在线人数统计
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 即可进行后台管理
- javaee学习之路(七)Servlet监听器
- 【Servlet学习之】监听器
- JavaEE学习之路-Servlet Lifecycle
- javaee学习之路(六)Servlet过滤器
- JavaEE学习笔记之Servlet
- 传智播客学习之Servlet监听器
- javaee之监听器
- JavaEE学习之路-Creating and Initializing a Servlet
- javaee学习之路(四)Servlet编程入门
- JavaEE学习之路|我的第一个servlet
- JavaEE学习笔记之Servlet/JSP(2)
- JavaEE学习笔记之Servlet/JSP(3)
- JavaEE学习笔记之Servlet/JSP(4)
- JavaEE学习笔记之Servlet/JSP(5)
- JavaEE学习笔记之Servlet/JSP(6)
- java servlet学习之监听器类
- java servlet学习之监听器类
- java servlet学习之监听器类
- EDate(日期)标签之日期加减
- 交叉编译: undefined reference to `rpl_malloc'
- 菜鸟学排序:折半插入排序
- Topcoder srm 653 div.2 1000 - SingingEasy(区间DP)
- 无法启动此程序,因为计算机中丢失msvcp100.dll。
- javaee学习之路(七)Servlet监听器
- 设计模式实践之旅——Singleton Pattern
- mysql数据库是.frm,.myd,myi备份如何导入mysql
- Objective-C中的@property和@synthesize用法
- ASP.NET中website与webApplication区别
- 设计模式(二)策略模式
- Andriod学习
- Abap Dynamic Select
- 01FastDFS的安装部署