j2ee20:servlet04监听器(监听四大web域)(用于访问人数的统计)、mvc模式的引入

第一:概念

1.监听器listener:一个对象去监听另外一个对象的变化(监听器的目的在于掌握什么时候监听,知道在什么时候监听之后就可以在这个方法里写一些代码了)
2.在四大web域中好多对象都不用程序员自己创建,因此这些对象的生命周期都不由程序员控制。但是由于不受程序员控制,因此需要通过监听器来监听这些内置对象。
3.监听器类监听session对象的创建和销毁,实现HttpSessionListener接口实现监听session的创建和销毁。
创建监听器类之后就要创建该对象,在web.xml中配置之后就可以让配置文件去创建。(web.xml是在启动服务器的时候加载的,因此写在web.xml中的监听器就会被加载执行了,去执行的先是构造函数,然后这个监听器类此时处于等待状态,等待监听session 的变化)
4.常用的监听器:
 ----1. 实现 HttpSessionListener接口:监听session对象的创建和销毁(也就是监听session的声明周期)。
把启动服务器就需要执行的代码放在构造函数中,因为构造函数会在启动服务器的时候就会执行。把统计人数的代码写在sessionCreated这个方法中,因为该方法在每次创建session的时候会被执行。
----2.实现HttpSessionAttributeListener接口:监听session对象的状态(属性)的变化(也就是监听该对象封装的值的变化:添加、删除、替换)
---3.实现ServletContextListener接口:监听application对象的声明周期
application在启动服务器的时候被创建,因此在启动服务器的时候就会执行监听器的init初始化方法。
application对象就是上下文对象,翻译过来就是这个意思
---4.实现ServeltContextAttributeListener接口
---5.实现ServletRequestListener接口:监听request对象
---6.实现ServletRequestAttributeListener接口:监听request属性的变化
5.访问人数的统计(不是在线人数的统计):区别在于访问人数的统计可以关闭客户端,在线人数的统计必须每个客户端都开着。
把关于访问人数的统计放在session的声明周期这个监听器里。当每次创建一个session对象的时候就在application中保存一个数并每次加1。
之所以要把数放在application对象中,是因为application对象在关闭服务器的时候才销毁,这样即使关闭浏览器(session销毁)也不会影响。
6.程序的开发模式:
javaBean:一个可以被重复使用的组件。servlet调用javabean(相当于是dao,任何类都是javabean(普通的java类),但是在这里只的是dao)
model1:mv模式,请求由jsp接收,由jsp响应。代码处理和页面显示都由jsp处理。
model2:mvc模式:对程序的处理都放在了servlet中了,对页面的显示交给了jsp。model:访问层是个javaBean(包括entity和dao,entity是数据bean,dao是数据访问bean)  view:数据显示层(视图)  control:控制层(接收、处理(调用javaBean)、响应)


总结:过滤器是对四大web域的过滤,先对请求进行过滤,过滤通过才能请求servlet
监听器是监听四大web域,监听四大web域对象的状态的变化。

 

 

第二:代码实现

1.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><listener><listener-class>com.comm.SessionListener</listener-class></listener><listener><listener-class>com.comm.SessionAttributeListener</listener-class></listener><listener><listener-class>com.comm.RequestListener</listener-class></listener><listener><listener-class>com.comm.ApplicationListener</listener-class></listener><servlet><servlet-name>exitServlet</servlet-name><servlet-class>com.action.ExitServlet</servlet-class></servlet><servlet-mapping><servlet-name>exitServlet</servlet-name><url-pattern>/exitServlet</url-pattern></servlet-mapping></web-app>

 

 

2.编写session监听器类,监听登录人数的统计

package com.comm;import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * HttpSessionListener:
 *  监听session对象的创建和销毁
 * HttpSessionAttributeListener
 *  监听session状态的变化
 *
 *
 * ServletContextListener
 * ServletContextAttributeListener
 *
 * ServletRequestListener
 * ServletRequestAttributeListener
 * **/

public class SessionListener implements HttpSessionListener {
 public SessionListener()
 {
  System.out.println("-------------SessionListener");
 }
 @Override
 public void sessionCreated(HttpSessionEvent hse) {
  // TODO Auto-generated method stub
  
  //System.out.println("--------------sessionCreated");
  /**
   * 统计已访问多系统的人数
   * **/
  int num=1;
  ServletContext application = hse.getSession().getServletContext();
  
  Object obj = application.getAttribute("num");
  if(obj!=null)
  {
   num=(Integer)obj;
   num++;
  }
  application.setAttribute("num", num);
  
 }
 @Override
 public void sessionDestroyed(HttpSessionEvent hse) {
  System.out.println("--------------sessionDestroyed");
  
 }}

 

3.监听session对象的属性变化

package com.comm;import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class SessionAttributeListener implements HttpSessionAttributeListener { public SessionAttributeListener()
 {
  System.out.println("------------------SessionAttributeListener");
 }
 @Override
 public void attributeAdded(HttpSessionBindingEvent hsbe) {
  // TODO Auto-generated method stub
  System.out.println("------------------attributeAdded");
 }
 @Override
 public void attributeRemoved(HttpSessionBindingEvent hsbe) {
  // TODO Auto-generated method stub
  System.out.println("------------------attributeRemoved");
 }
 @Override
 public void attributeReplaced(HttpSessionBindingEvent hsbe) {
  // TODO Auto-generated method stub
  System.out.println("------------------attributeReplaced");
 }
}

 

4.监听application对象的创建和销毁

package com.comm;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationListener implements ServletContextListener { public ApplicationListener()
 {
  System.out.println("================ApplicationListener");
 }
 @Override
 public void contextDestroyed(ServletContextEvent sce) {
  // TODO Auto-generated method stub
  System.out.println("===============contextDestroyed");
 }
 @Override
 public void contextInitialized(ServletContextEvent sce) {
  // TODO Auto-generated method stub
  //sce.getServletContext().setAttribute(arg0, arg1)
  System.out.println("===============contextInitialized");
 }}

 

5.监听request对象的创建和销毁

package com.comm;import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener implements ServletRequestListener { public RequestListener()
 {
  System.out.println("***********RequestListener");
 }
 @Override
 public void requestDestroyed(ServletRequestEvent arg0) {
  // TODO Auto-generated method stub
  System.out.println("***********requestDestroyed");
 }
 @Override
 public void requestInitialized(ServletRequestEvent arg0) {
  // TODO Auto-generated method stub
  System.out.println("***********requestInitialized");
 }}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值