`

Jsp/Servlet复习笔记-----第5章 过滤器和事件监听器

    博客分类:
  • JSP
阅读更多

5.1.1 概念
过滤器(filter)是能够对请求和响应的头属性(header)和能容体(body)进行操作的特殊Web构件。与一般Web构件(如servlet,JSP)不同的是,过滤器自身并不直接生成Web响应,若干个过滤器可以依次对一个Web资源的请求和响应进行作用。
过滤器取代了早先的Servlet链接的功能。更主要的是,过滤器是Servlet2.3版本之后的标准Web构件。它的使用方法比较方便,功能也相当强。如图5-1所示,过滤器可以在Web请求到达servlet(或JSP)之前和在servlet返回响应之后对二者进行操作。过滤器和servlet之间是多对多的关系,一个过滤器可以对多个servlet的请求和响应进行过滤(如Filter A),一个servlet也可以被多个过滤器作用(如servlet3被Filter B,C,D过滤器链过滤)。




过滤器的主要功能包括:
* 对Web请求进行分析,对输入数据进行预处理
* 阻止请求和响应的进行;
* 根据功能改动请求的头信息和数据体;
* 根据功能改动响应的头信息和数据体;
* 和其他Web资源协作。
* 对用户请求进行统一认证;
* 对用户发送的数据进行过滤或替换;
* 对用户的访问进行记录和审核;
读者可能会提出一个问题:这些功能在servlet中都可以实现。确实。前面讲到的servlet API 能够对Web请求和响应进行各种各样的操作,而过滤器的主要意义是提供了一种更方便高效的编程结构。对于许多servlet都需要的功能,使用过滤器独立实现会简化servlet,避免功能重复。另外,Web容器提供了方便的过滤器管理机制,可以让编程人员更轻松地编写Web程序。
可见过滤器程序的特点是通用性和可移植性。如果一个过滤器在程序中只能用在一个servlet或JSP上面而不能被其他Web程序借用,这个过滤器的存在就没有太大意义。通常的过滤器可以用在多种情况下,比如安全保护、运行记录、图像转化、数据压缩、加密解码以及XML转化等。
5.1.2 过滤器的使用
Servlet技术中有关过滤器的API包括javax.servlet包中的Filter,FilterChain和FilterConfig接口。
过滤器要实现javax.servlet.Filter接口。与servlet相似,Filter接口中有init(),destroy()方法。Init方法在初始化时做准备工作,destroy方法在它被Web容器清除之前完成收尾工作,主要的过滤功能在doFilter方法中实现。
程序5.1是javax.servlet.Filter接口的源代码:

Java代码
1.package javax.servlet;  
2. 
3.import java.io.IOException;  
4. 
5.public interface Filter {  
6.    public void init(FilterConfig filterConfig) throws ServletException;  
7.      
8.    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )  
9.        throws IOException, ServletException;  
10. 
11.    public void destroy();  
12.} 
package javax.servlet;

import java.io.IOException;

public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;

    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )
throws IOException, ServletException;

public void destroy();
}

程序 5.1
5.1.3 如何使用过滤器实现职责链模式
5.1.4 如何使用过滤器实现装饰器(decrator)设计模式
5.1.5 用MyEclipse开发过滤器使用的例子
登陆验证:

Java代码
1.package org.sky.darkness.filter ;  
2. 
3.import java.io.* ;  
4.import javax.servlet.* ;  
5.import javax.servlet.http.* ;  
6. 
7.public class LoginFilter implements Filter  
8.{  
9.    public void init(FilterConfig filterConfig) throws ServletException{}  
10.    public void doFilter(ServletRequest request,  
11.                     ServletResponse response,  
12.                     FilterChain chain)  
13.              throws IOException,  
14.                     ServletException  
15.    {  
16.        // Session属于HTTP范畴,所以ServletRequest对象需要先转换成HttpServletRequest对象  
17.        HttpServletRequest req = (HttpServletRequest)request ;  
18.        HttpSession session = req.getSession() ;  
19.        // 如果session不为空,则可以浏览其他页面  
20.        if(session.getAttribute("uname")!=null)  
21.        {  
22.            chain.doFilter(request,response) ;  
23.        }  
24.        else 
25.        {  
26.            // 通过requestDispatcher跳转到登陆页  
27.            request.getRequestDispatcher("login.jsp").forward(request,response) ;  
28.        }  
29.    }  
30.    public void destroy() {}  
31.};  
32./*  
33.  <filter>  
34.    <filter-name>login</filter-name>  
35.    <filter-class> org.sky.darkness.filter.LoginFilter</filter-class>  
36.  </filter>  
37.  <filter-mapping>  
38.    <filter-name>login</filter-name>  
39.    <url-pattern>/*</url-pattern>  
40.  </filter-mapping> 
package org.sky.darkness.filter ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class LoginFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException{}
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws IOException,
                     ServletException
{
// Session属于HTTP范畴,所以ServletRequest对象需要先转换成HttpServletRequest对象
HttpServletRequest req = (HttpServletRequest)request ;
HttpSession session = req.getSession() ;
// 如果session不为空,则可以浏览其他页面
if(session.getAttribute("uname")!=null)
{
chain.doFilter(request,response) ;
}
else
{
// 通过requestDispatcher跳转到登陆页
request.getRequestDispatcher("login.jsp").forward(request,response) ;
}
}
public void destroy() {}
};
/*
  <filter>
<filter-name>login</filter-name>
<filter-class> org.sky.darkness.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>

Servlet程序的主要分类?
 标准Servlet(JSP)-MVC
 过滤Servlet(过滤器)
 监听Servlet(监听器)

过滤器在WEB中主要起什么作用:
1. 过滤器是程序运行之后加入的
2. 功能:
 任何网站都需要对用户是否登陆进行过滤
 网上聊天系统,屏蔽非法文字
 对请求内容进行统一编码
写一个Filter类都必须继承(implements) Filter接口
public void init(FilterConfig filterConfig)
          throws ServletException
过滤器初始化是在容器启动时自动初始化的

Java代码
1.public void doFilter(ServletRequest request,  
2.                     ServletResponse response,  
3.                     FilterChain chain)  
4.              throws java.io.IOException,  
5.                     ServletException  
6. 
7.public void destroy() 
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws java.io.IOException,
                     ServletException

public void destroy()

Java代码
1.package org.sky.darkness.filter ;  
2. 
3.import java.io.* ;  
4.import javax.servlet.* ;  
5. 
6.public class FirstFilter implements Filter  
7.{  
8.    public void init(FilterConfig filterConfig)  
9.          throws ServletException  
10.    {  
11.        System.out.println("** 过滤器初始化...") ;  
12.    }  
13.    public void doFilter(ServletRequest request,  
14.                     ServletResponse response,  
15.                     FilterChain chain)  
16.              throws IOException,  
17.                     ServletException  
18.    {  
19.        System.out.println("** 过滤器 doFilter (chain之前)...") ;  
20.        chain.doFilter(request,response) ;  
21.        System.out.println("** 过滤器 doFilter (chain之后)...") ;  
22.    }  
23.    public void destroy()  
24.    {  
25.        System.out.println("** 过滤器销毁...") ;  
26.    }  
27.};  
28./* 
29.  <filter> 
30.    <filter-name>first</filter-name> 
31.    <filter-class> org.sky.darkness.filter.FirstFilter</filter-class> 
32.  </filter> 
33.  <filter-mapping> 
34.    <filter-name>first</filter-name> 
35.    <url-pattern>/*</url-pattern> 
36.  </filter-mapping> 
37.*/ 
package org.sky.darkness.filter ;

import java.io.* ;
import javax.servlet.* ;

public class FirstFilter implements Filter
{
public void init(FilterConfig filterConfig)
          throws ServletException
{
System.out.println("** 过滤器初始化...") ;
}
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws IOException,
                     ServletException
{
System.out.println("** 过滤器 doFilter (chain之前)...") ;
chain.doFilter(request,response) ;
System.out.println("** 过滤器 doFilter (chain之后)...") ;
}
public void destroy()
{
System.out.println("** 过滤器销毁...") ;
}
};
/*
  <filter>
<filter-name>first</filter-name>
<filter-class> org.sky.darkness.filter.FirstFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>
*/

xml文件中的配置:
Java代码
1.<filter>  
2.   <filter-name> first </filter-name>  
3.   <filter-class> org.sky.darkness.filter.FirstFilter</filter-class>  
4.</filter>  
5.<filter-mapping>  
6.   <filter-name> first </filter-name>  
7.   <url-pattern>/*</url-pattern>//与servlet的不一样,此处表示对哪个页面进行过滤  
8.</filter-mapping>  
9.   
<filter>
   <filter-name> first </filter-name>
   <filter-class> org.sky.darkness.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name> first </filter-name>
   <url-pattern>/*</url-pattern>//与servlet的不一样,此处表示对哪个页面进行过滤
</filter-mapping>
 
如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发chain.doFilter(request, response)

过滤器执行两次,chain之前执行一次,chain之后执行一次
1.过滤非法文字:
Java代码
1.    string content = request.getParameter(“content”);  
2.    if(content != null){  
3.if(content.indexOf(“AAA”)==-1)chain.doFilter(req,res);  
4.else  out .println(“有非法文字!!!”);  
5.   }else chain.doFilter(req,res); 
string content = request.getParameter(“content”);
    if(content != null){
if(content.indexOf(“AAA”)==-1)chain.doFilter(req,res);
else  out .println(“有非法文字!!!”);
   }else chain.doFilter(req,res);

Java代码
1.package org.sky.darkness.filter ;  
2. 
3.import java.io.* ;  
4.import javax.servlet.* ;  
5. 
6.public class CharFilter implements Filter  
7.{  
8.    public void init(FilterConfig filterConfig)  
9.          throws ServletException  
10.    {  
11.        // System.out.println("** 过滤器初始化...") ;  
12.    }  
13.    public void doFilter(ServletRequest request,  
14.                     ServletResponse response,  
15.                     FilterChain chain)  
16.              throws IOException,  
17.                     ServletException  
18.    {  
19.        String content = request.getParameter("content") ;  
20.        // 如果indexOf返回-1则表示没有查到所要的内容  
21.        if(content!=null)  
22.        {  
23.            if(content.indexOf("AAA")==-1)  
24.            {  
25.                chain.doFilter(request,response) ;  
26.            }  
27.            else 
28.            {  
29.                System.out.println("有非法文字") ;  
30.                // 如果需要的话,此处依然可以使用RequestDispatcher进行跳转  
31.            }     
32.        }  
33.        else 
34.        {  
35.            chain.doFilter(request,response) ;  
36.        }  
37.    }  
38.    public void destroy()  
39.    {  
40.        // System.out.println("** 过滤器销毁...") ;  
41.    }  
42.};  
43./* 
44.  <filter> 
45.    <filter-name>char</filter-name> 
46.    <filter-class>org.sky.darkness.filter.CharFilter</filter-class> 
47.  </filter> 
48.  <filter-mapping> 
49.    <filter-name>char</filter-name> 
50.    <url-pattern>/*</url-pattern> 
51.  </filter-mapping> 
52.*/ 
package org.sky.darkness.filter ;

import java.io.* ;
import javax.servlet.* ;

public class CharFilter implements Filter
{
public void init(FilterConfig filterConfig)
          throws ServletException
{
// System.out.println("** 过滤器初始化...") ;
}
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws IOException,
                     ServletException
{
String content = request.getParameter("content") ;
// 如果indexOf返回-1则表示没有查到所要的内容
if(content!=null)
{
if(content.indexOf("AAA")==-1)
{
chain.doFilter(request,response) ;
}
else
{
System.out.println("有非法文字") ;
// 如果需要的话,此处依然可以使用RequestDispatcher进行跳转
}
}
else
{
chain.doFilter(request,response) ;
}
}
public void destroy()
{
// System.out.println("** 过滤器销毁...") ;
}
};
/*
  <filter>
<filter-name>char</filter-name>
<filter-class>org.sky.darkness.filter.CharFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>char</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>
*/

2. 进行统一编码
Java代码
1.request.setCharacterEncoding(“gb2312”) 
  request.setCharacterEncoding(“gb2312”)

Java代码
1.package org.sky.darkness.filter ;  
2. 
3.import java.io.* ;  
4.import javax.servlet.* ;  
5. 
6.public class EncodingFilter implements Filter  
7.{  
8.    public void init(FilterConfig filterConfig)  
9.          throws ServletException  
10.    {  
11.        // System.out.println("** 过滤器初始化...") ;  
12.    }  
13.    public void doFilter(ServletRequest request,  
14.                     ServletResponse response,  
15.                     FilterChain chain)  
16.              throws IOException,  
17.                     ServletException  
18.    {  
19.        try 
20.        {  
21.            request.setCharacterEncoding("GB2312") ;      
22.        }  
23.        catch (Exception e)  
24.        {  
25.        }  
26.          
27.        chain.doFilter(request,response) ;  
28.    }  
29.    public void destroy()  
30.    {  
31.        // System.out.println("** 过滤器销毁...") ;  
32.    }  
33.};  
34./* 
35.  <filter> 
36.    <filter-name>encoding</filter-name> 
37.    <filter-class> org.sky.darkness.filter.EncodingFilter</filter-class> 
38.  </filter> 
39.  <filter-mapping> 
40.    <filter-name>encoding</filter-name> 
41.    <url-pattern>/*</url-pattern> 
42.  </filter-mapping> 
43.*/ 
package org.sky.darkness.filter ;

import java.io.* ;
import javax.servlet.* ;

public class EncodingFilter implements Filter
{
public void init(FilterConfig filterConfig)
          throws ServletException
{
// System.out.println("** 过滤器初始化...") ;
}
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws IOException,
                     ServletException
{
try
{
request.setCharacterEncoding("GB2312") ;
}
catch (Exception e)
{
}

chain.doFilter(request,response) ;
}
public void destroy()
{
// System.out.println("** 过滤器销毁...") ;
}
};
/*
  <filter>
<filter-name>encoding</filter-name>
<filter-class> org.sky.darkness.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>
*/

3.登陆验证
   Session属于HTTP范畴,所以ServletRequset对象需要先转换为 HttpServletRequest对象
Java代码
1.HttpServletRequest req = (HttpServletRequest)req;  
2.HttpSession session = req.getSession();  
3.if(session.getAttribute(“uname”) != null)  
4.    chain.doFilter(req,res);  
5.else 
6.    request.getRequestDispatcher(“login.jsp”).forward(req,res); 
   HttpServletRequest req = (HttpServletRequest)req;
   HttpSession session = req.getSession();
   if(session.getAttribute(“uname”) != null)
       chain.doFilter(req,res);
   else
       request.getRequestDispatcher(“login.jsp”).forward(req,res);


Java代码
1.package org.sky.darkness.filter ;  
2. 
3.import java.io.* ;  
4.import javax.servlet.* ;  
5.import javax.servlet.http.* ;  
6. 
7.public class LoginFilter implements Filter  
8.{  
9.    public void init(FilterConfig filterConfig)  
10.          throws ServletException  
11.    {  
12.        // System.out.println("** 过滤器初始化...") ;  
13.    }  
14.    public void doFilter(ServletRequest request,  
15.                     ServletResponse response,  
16.                     FilterChain chain)  
17.              throws IOException,  
18.                     ServletException  
19.    {  
20.        // Session属于HTTP范畴,所以ServletRequest对象需要先转换成HttpServletRequest对象  
21.        HttpServletRequest req = (HttpServletRequest)request ;  
22.        HttpSession session = req.getSession() ;  
23.        // 如果session不为空,则可以浏览其他页面  
24.        if(session.getAttribute("uname")!=null)  
25.        {  
26.            chain.doFilter(request,response) ;  
27.        }  
28.        else 
29.        {  
30.            // 通过requestDispatcher跳转到登陆页  
31.            request.getRequestDispatcher("login.jsp").forward(request,response) ;  
32.        }  
33.    }  
34.    public void destroy()  
35.    {  
36.        // System.out.println("** 过滤器销毁...") ;  
37.    }  
38.};  
39./* 
40.  <filter> 
41.    <filter-name>login</filter-name> 
42.    <filter-class> org.sky.darkness.filter.LoginFilter</filter-class> 
43.  </filter> 
44.  <filter-mapping> 
45.    <filter-name>login</filter-name> 
46.    <url-pattern>/*</url-pattern> 
47.  </filter-mapping> 
48.*/ 
package org.sky.darkness.filter ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class LoginFilter implements Filter
{
public void init(FilterConfig filterConfig)
          throws ServletException
{
// System.out.println("** 过滤器初始化...") ;
}
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain)
              throws IOException,
                     ServletException
{
// Session属于HTTP范畴,所以ServletRequest对象需要先转换成HttpServletRequest对象
HttpServletRequest req = (HttpServletRequest)request ;
HttpSession session = req.getSession() ;
// 如果session不为空,则可以浏览其他页面
if(session.getAttribute("uname")!=null)
{
chain.doFilter(request,response) ;
}
else
{
// 通过requestDispatcher跳转到登陆页
request.getRequestDispatcher("login.jsp").forward(request,response) ;
}
}
public void destroy()
{
// System.out.println("** 过滤器销毁...") ;
}
};
/*
  <filter>
<filter-name>login</filter-name>
<filter-class> org.sky.darkness.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>
*/

原则:开发时只专注于具体的业务实现,而对于登陆之类的验证,肯定属于组件,向整个程序中单独加入的。


监听器
5.2.1概念  
5.2.2 事件监听器的使用
5.2.3 MyEclipse开发事件监听器使用的例子
监听器是指对于整个WEB环境的监听
主要有以下三类:
 ServletContext:Servlet上下文
 Session:对Session监听
 Request监听

一、 对ServletContext的监听
在web端实现监听 = 实现一系列的监听接口
1、 ServletContextListener:对整个 servlet上下文进行监听(启动,销毁)
public void contextInitialized(ServletContextEvent sce):上下文初始化
public void contextDestroyed(ServletContextEvent sce):上下文销毁

ServletContextEvent事件:取得一个ServletContext (Applicaton)对象
public ServletContext getServletContext()
2、 ServletContextAttributeListener:对Servlet上下文属性进行监听
public void attributeAdded(ServletContextAttributeEvent scab):增加属性(setAttribute)
public void attributeRemoved(ServletContextAttributeEvent scab) :属性删除(removeAttribute)
public void attributeReplaced(ServletContextAttributeEvent scab):属性替换(第二次设置同一个属性)

ServletContextAttributeEvent事件:
public java.lang.String getName()
public java.lang.Object getValue()

回顾: 设置属性的方法
    Public void setAttribute (String name ,Object  value)

Java代码
1.package org.sky.darkness.listener ;  
2. 
3.import javax.servlet.* ;  
4. 
5.public class ServletContextDemo  
6.    implements ServletContextListener,ServletContextAttributeListener  
7.{  
8.    private ServletContext application = null ;  
9.    // 实现方法  
10.    public void contextInitialized(ServletContextEvent sce)  
11.    {  
12.        this.application = sce.getServletContext() ;  
13.        System.out.println("** 上下文初始化 ...") ;  
14.        System.out.println("** 当前虚拟目录的绝对路径:"+this.application.getRealPath("/")) ;  
15.    }  
16.    public void contextDestroyed(ServletContextEvent sce)  
17.    {  
18.        System.out.println("** 上下文销毁 ...") ;  
19.    }  
20. 
21.    public void attributeAdded(ServletContextAttributeEvent scab)  
22.    {  
23.        System.out.println("** 增加属性:"+scab.getName()+" --> "+scab.getValue()) ;  
24.    }  
25.    public void attributeRemoved(ServletContextAttributeEvent scab)  
26.    {  
27.        System.out.println("** 删除属性:"+scab.getName()+" --> "+scab.getValue()) ;  
28.    }  
29.    public void attributeReplaced(ServletContextAttributeEvent scab)  
30.    {  
31.        System.out.println("** 替换属性:"+scab.getName()+" --> "+scab.getValue()) ;  
32.    }  
33.};  
34. 
35./* 
36.  <listener> 
37.    <listener-class> org.sky.darkness.listener.ServletContextDemo</listener-class> 
38.  </listener> 
39.*/ 
package org.sky.darkness.listener ;

import javax.servlet.* ;

public class ServletContextDemo
implements ServletContextListener,ServletContextAttributeListener
{
private ServletContext application = null ;
// 实现方法
public void contextInitialized(ServletContextEvent sce)
{
this.application = sce.getServletContext() ;
System.out.println("** 上下文初始化 ...") ;
System.out.println("** 当前虚拟目录的绝对路径:"+this.application.getRealPath("/")) ;
}
public void contextDestroyed(ServletContextEvent sce)
{
System.out.println("** 上下文销毁 ...") ;
}

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()) ;
}
};

/*
  <listener>
<listener-class> org.sky.darkness.listener.ServletContextDemo</listener-class>
  </listener>
*/
<!--测试页面-->
Java代码
1.<%  
2.    // getServletContext().setAttribute("name","LiXingHua") ;  
3.    getServletContext().removeAttribute("name") ;  
4.%> 
<%
// getServletContext().setAttribute("name","LiXingHua") ;
getServletContext().removeAttribute("name") ;
%>
上下文监听主要是针对容器的:初始化、销毁、属性操作
二、 对Session监听

对session的创建、销毁、属性操作

Session属于http协议下的内容:javax.servlet.http.HttpSessionXxxx
1、 HttpSessionListener:对session的整体状况的监听
public void sessionCreated(HttpSessionEvent se)
public void sessionDestroyed(HttpSessionEvent se):session销毁

HttpSessionEvent事件:
public HttpSession getSession():取得当前操作的 session
2、 HttpSessionAttributeListener

public void attributeAdded(HttpSessionBindingEvent se)
public void attributeRemoved(HttpSessionBindingEvent se)
public void attributeReplaced(HttpSessionBindingEvent se)

HttpSessionBindingEvent事件:
public HttpSession getSession():取得当前的Session
public java.lang.String getName():取得属性的名称
public java.lang.Object getValue()

Java代码
1.package org.sky.darkness.listener ;  
2. 
3.import javax.servlet.http.* ;  
4. 
5.public class HttpSessionDemo   
6.    implements HttpSessionListener,HttpSessionAttributeListener  
7.{  
8.    private HttpSession session ;  
9.    // 实现方法  
10.    public void sessionCreated(HttpSessionEvent se)  
11.    {  
12.        this.session = se.getSession() ;  
13.        System.out.println("** Session 创建 ....") ;  
14.        System.out.println("** SessionID --> "+this.session.getId()) ;  
15.    }  
16.    public void sessionDestroyed(HttpSessionEvent se)  
17.    {  
18.        System.out.println("** Session 销毁 ....") ;  
19.    }  
20.    public void attributeAdded(HttpSessionBindingEvent se)  
21.    {  
22.        System.out.println("** Session 增加属性:"+se.getName()+" --> "+se.getValue()) ;  
23.    }  
24.    public void attributeRemoved(HttpSessionBindingEvent se)  
25.    {  
26.        System.out.println("** Session 删除属性:"+se.getName()+" --> "+se.getValue()) ;  
27.    }  
28.    public void attributeReplaced(HttpSessionBindingEvent se)  
29.    {  
30.        System.out.println("** Session 替换属性:"+se.getName()+" --> "+se.getValue()) ;  
31.    }  
32.};  
33./* 
34.  <listener> 
35.    <listener-class> org.sky.darkness.listener.HttpSessionDemo</listener-class> 
36.  </listener> 
37.*/ 
38. 
39.<%  
40.    // session.setAttribute("name","LXh") ;  
41.    // session.removeAttribute("name") ;  
42.    session.invalidate() ;  
43.%> 
package org.sky.darkness.listener ;

import javax.servlet.http.* ;

public class HttpSessionDemo
implements HttpSessionListener,HttpSessionAttributeListener
{
private HttpSession session ;
// 实现方法
public void sessionCreated(HttpSessionEvent se)
{
this.session = se.getSession() ;
System.out.println("** Session 创建 ....") ;
System.out.println("** SessionID --> "+this.session.getId()) ;
}
public void sessionDestroyed(HttpSessionEvent se)
{
System.out.println("** Session 销毁 ....") ;
}
public void attributeAdded(HttpSessionBindingEvent se)
{
System.out.println("** Session 增加属性:"+se.getName()+" --> "+se.getValue()) ;
}
public void attributeRemoved(HttpSessionBindingEvent se)
{
System.out.println("** Session 删除属性:"+se.getName()+" --> "+se.getValue()) ;
}
public void attributeReplaced(HttpSessionBindingEvent se)
{
System.out.println("** Session 替换属性:"+se.getName()+" --> "+se.getValue()) ;
}
};
/*
  <listener>
<listener-class> org.sky.darkness.listener.HttpSessionDemo</listener-class>
  </listener>
*/

<%
// session.setAttribute("name","LXh") ;
// session.removeAttribute("name") ;
session.invalidate() ;
%>
Session如何销毁?
1、 session超时
需要在xml文件中进行配置
<session-config>
<session-timetout>1</session-timeout>//session一分钟失效
</session-config>
2、 手工使session失效
Invalidate()

案例:
统计在线人员列表
实现那几个接口?
1、 在线人员列表是对所有人都起作用,所有的数据必须保存在application之中,这意味着在OnlineDemo中必须有一个ServletContext对象
2、 是针对session的变化进行的操作
如果登陆成功,则将用户名保存在session中
3、 如果用户注销,则将相应的用户名删除掉

因为用户名是多个,所以无法确定个数,使用list

Java代码
1.package org.sky.darkness.listener ;  
2. 
3.import java.util.* ;  
4.import javax.servlet.* ;  
5.import javax.servlet.http.* ;  
6. 
7.public class OnLineDemo   
8.    implements ServletContextListener,HttpSessionListener,HttpSessionAttributeListener  
9.{  
10.    // 声明一个ServletContext对象  
11.    private ServletContext application = null ;  
12.    public void contextInitialized(ServletContextEvent sce)  
13.    {  
14.        // 容器初始化时,向application中存放一个空的容器  
15.        this.application = sce.getServletContext() ;  
16.        this.application.setAttribute("alluser",new ArrayList()) ;  
17.    }  
18. 
19.    public void contextDestroyed(ServletContextEvent sce)  
20.    {}  
21. 
22.    public void sessionCreated(HttpSessionEvent se)  
23.    {}  
24.    public void sessionDestroyed(HttpSessionEvent se)  
25.    {  
26.        // 将用户名称从列表中删除  
27.        List l = (List)this.application.getAttribute("alluser") ;  
28.        String value = (String)se.getSession().getAttribute("uname") ;  
29.        l.remove(value) ;  
30.        this.application.setAttribute("alluser",l) ;  
31.    }  
32. 
33.    public void attributeAdded(HttpSessionBindingEvent se)  
34.    {  
35.        // 如果登陆成功,则将用户名保存在列表之中  
36.        List l = (List)this.application.getAttribute("alluser") ;  
37.        l.add(se.getValue()) ;  
38.        this.application.setAttribute("alluser",l) ;  
39.    }  
40.    public void attributeRemoved(HttpSessionBindingEvent se)  
41.    {}  
42.    public void attributeReplaced(HttpSessionBindingEvent se)  
43.    {}  
44.};  
45./* 
46.  <listener> 
47.    <listener-class>cn.mldn.lxh.listener.OnLineDemo</listener-class> 
48.  </listener> 
49.*/ 
package org.sky.darkness.listener ;

import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class OnLineDemo
implements ServletContextListener,HttpSessionListener,HttpSessionAttributeListener
{
// 声明一个ServletContext对象
private ServletContext application = null ;
public void contextInitialized(ServletContextEvent sce)
{
// 容器初始化时,向application中存放一个空的容器
this.application = sce.getServletContext() ;
this.application.setAttribute("alluser",new ArrayList()) ;
}

public void contextDestroyed(ServletContextEvent sce)
{}

public void sessionCreated(HttpSessionEvent se)
{}
public void sessionDestroyed(HttpSessionEvent se)
{
// 将用户名称从列表中删除
List l = (List)this.application.getAttribute("alluser") ;
String value = (String)se.getSession().getAttribute("uname") ;
l.remove(value) ;
this.application.setAttribute("alluser",l) ;
}

public void attributeAdded(HttpSessionBindingEvent se)
{
// 如果登陆成功,则将用户名保存在列表之中
List l = (List)this.application.getAttribute("alluser") ;
l.add(se.getValue()) ;
this.application.setAttribute("alluser",l) ;
}
public void attributeRemoved(HttpSessionBindingEvent se)
{}
public void attributeReplaced(HttpSessionBindingEvent se)
{}
};
/*
  <listener>
<listener-class>cn.mldn.lxh.listener.OnLineDemo</listener-class>
  </listener>
*/


Java代码
1.<%@ page contentType="text/html;charset=gb2312"%>  
2.<%@ page import="java.util.*"%>  
3.<form action="online.jsp" method="post">  
4.用户名:  
5.<input type="text" name="name">  
6.<input type="submit" value="登陆">  
7.<a href="logout.jsp">注销</a>  
8.</form>  
9.<!-- 向session接收输入的用户名 -->  
10.<%  
11.    if(request.getParameter("name")!=null)  
12.    {  
13.        session.setAttribute("uname",request.getParameter("name")) ;  
14.    }  
15.%>  
16.<h2>在线人员</h2>  
17.<hr>  
18.<%  
19.    List l = (List)application.getAttribute("alluser") ;  
20.    Iterator iter = l.iterator() ;  
21.    while(iter.hasNext())  
22.    {  
23.%>  
24.        <li><%=iter.next()%>  
25.<%  
26.    }  
27.%>  
28.-------------------------------------------------------logout.jsp-------------------  
29.<%  
30.    session.invalidate() ;  
31.%>

 

分享到:
评论

相关推荐

    jsp/servlet个人学习笔记

    el表达式语言,jsp标签库,servlet,过滤器,监听器,基础语法,内置对象,站点配置,常见错误,学习总结

    JAVAWeb全课程笔记( html版)

    目录 ...CSS总结 JavaScript总结 DOM总结 tomcat服务器 servlet基础 Request&Response编程 Cookie&Session ...Servlet事件监听器 JavaMail开发 (案例)Estore电子商城 软件国际化 Java基础加强 JQuery Ajax JSON

    Java学习笔记-个人整理的

    {5.2.1}将浮点数四舍五入到指定精度}{98}{subsection.5.2.1} {6}Exception}{99}{chapter.6} {6.1}\ttfamily try-catch}{99}{section.6.1} {6.2}\ttfamily finally}{100}{section.6.2} {6.3}\ttfamily throws}{...

    吴天雄--JavaWeb完整笔记.doc

    模块八:过滤器和监听器(三大组件、八大监听器、session的绑定、解绑、钝化、活化);模块九:文件上传和下载(限制上传(文件的大小和类型)、详细代码、解决下载时文件名乱码问题) --author

    javaweb详细笔记,绝对详细(内含代码)

    javaweb ...知识点 Javascript知识点 jQuery知识点 14 Bootstrap知识点 17 JDBC & 配置文件 & 连接池 19 Xml文档及解析 31 反射 33 Http协议和Tomcat服务器 36 JavaWeb核心之Servlet 41 ...过滤器Filter

    JAVA基础学习总结笔记

    看的东西不在多,而在于精, 程序设计最重要的就是上级操作了, 既然选择了,就该要有...过滤器,监听器 struts相关笔记. 等等...... 里面是当年自学JAVA时的一些笔记,内容都是TXT格式的,都是一些基础性的概念总结。

    javaWeb学习笔记基础知识

    Servlet,请求和响应机制,jsp动态网页技术,会话跟踪 javaBean,JSP常用标签和自定义标签,AJAX实例,以及监听器,过滤器和BaseServlet和分页

    JavaWeb动力节点

    详细Javaweb笔记,源码解析 纯粹Servlet实现增删查改 请求转发和重定向 session和cookie JSP指令、EL表达式、JSTL标签库 过滤器、监听器

    Web程序设计课堂笔记.doc

    1.Tomcat和HTTP协议 2.Servlet基础 3.HttpServletRequest请求对象 4.JSP技术和会话跟踪 5.JSTL和EL表达式 6.过滤器 7.监听器 8.JDBC 9.文件上传和下载 10.JSP的开发模型——MVC设计架构

    JavaWeb笔记

    该文件包含有对JAVA和Web的相关指导讲解,包括Eclipse的用法,JavaWeb开发基础,Servlet编程,JSP编程,监听器,过滤器,文件上传下载,Servlet3.0特性等。

    我的JavaWeb笔记整理

    tomcat、xml、servlet、jsp、listener监听器、EL、JSTL、Cookie、Session、Filter过滤器、JSON、AJAX、i18n、文件上传下载

    JavaWeb笔记.pdf

    关于java写后台,实现动态页面,tomcat,maven的使用,简单介绍了监听器,过滤器listener,filter,简单实现了,对于JSP则不过多记录

    Downloads.rar

    这是北京动力节点的javaweb课堂笔记,包括ssm、spring、MyBatis3、监听器、过滤器、文件上传下载、tomcat、servlet、jsp等等。已整理好,可下载复习使用,视频地址再B站自己搜索。老师为reyco。

Global site tag (gtag.js) - Google Analytics