JavaWeb(六)——监听器与过滤器

第六章:监听器与过滤器

第1节:监听器


知识点1:监听器的作用

1.定义

​ 当事件发生的时候,需要进行一些处理,就可以使用监听器处理.

2.作用

​ 监听器监听的是事件,当事件发生的时候,监听器进行相应的处理.
在这里插入图片描述


知识点2:监听器相关API

1.事件类

​ 事件类定义了事件类型

​ Servlet API定义了6种事件类型:

(1)上下文相关事件
①ServletContextEvent:上下文事件

1)触发时机

​ 当上下文对象发生改变,比如:创建上下文,销毁上下文的时候,会触发上下文事件

2)创建上下文

​ 服务器启动的时候会触发创建上下文事件

3)销毁上下文

​ 服务器停止的时候会触发销毁上下文事件

②ServletContextAttributeEvent:上下文属性事件

1)触发时机

​ 当上下文的属性发生改变,如添加,删除,覆盖上下文的属性时,会触发上下文属性事件

2)添加上下文的属性

​ 调用servletContext.setAttribute(name,value)方法的时候会触发上下文属性事件

3)删除上下文属性

​ 调用servletContext.removeAttribute(name)方法的时候会触发上下文属性事件

4)覆盖上下文属性

​ 调用servletContext.setAttribute(name,value)方法的时候会触发上下文属性事件

(2)请求相关事件
①ServletRequestEvent:请求事件

1)触发时机

​ 请求对象发生改变的时候,创建请求对象,销毁请求对象的时候会触发请求事件.

2)创建请求对象

​ 当客户端浏览器请求一个servlet的时候就会创建请求对象,就会触发请求事件

3)销毁请求对象

​ 当服务器将响应发送给客户端浏览器以后请求对象被销毁,也会触发请求事件

②ServletReqeustAttributeEvent:请求属性事件

1)触发时机

​ 当请求属性发生改变,如:添加,删除,覆盖请求的属性,会触发请求属性事件

2)添加请求属性

​ 调用request.setAttribute(name,value)方法时会触发请求属性事件

3)删除请求属性

​ 调用request.removeAttribute(name)方法时会触发请求属性事件

4)覆盖请求属性

​ 调用request.setAttribute(name,value)方法时会触发请求属性事件

(3)会话相关事件
①HttpSessionEven会话事件

​ 会话对象发生改变,创建会话对象,销毁会话对象,活化或者钝化会话对象,会触发会话事件.

1)创建会话对象

​ 调用request.getSession()方法或者request.getSession(true)创建session会话对象,会触发会话事件

2)销毁会话对象

​ 默认30分钟.销毁会话对象,会触发会话事件

​ web.xml配置 50分钟 销毁会话对象,会触发会话事件

​ 调用session.invalidate()方法销毁会话对象,会触发会话事件

​ 调用session.setMaxInactiveInterval(多少秒)方法销毁会话对象,会触发会话事件

3)活化会话对象

​ session会话对象从磁盘取出反序列化到内存形成session会话对象,活化会话对象,会触发会话事件

4)钝化会话对象

​ session会话对象序列化到磁盘,钝化会话对象,会触发会话事件

②HttpSessionBindingEvent会话绑定事件

1)触发时机

​ 当会话属性发生改变,如:添加,删除,覆盖会话的属性,会触发会话绑定事件

2)添加会话属性

​ 调用session.setAttribute(name,value)方法时会触发请求绑定事件

3)删除会话属性

​ 调用session.removeAttribute(name)方法时会触发请求绑定事件

4)覆盖会话属性

​ 调用session.setAttribute(name,value)方法时会触发请求绑定事件

2.监听器接口

​ 监听器接口定义了监听事件的方法

​ Servlet API中定义了8种监听器接口,用来监听不同的事件类型

(1)上下文相关的监听器

​ ①上下文监听器ServletContextListener,监听上下文事件ServletContextEvent

​ ②上下文属性监听器ServletContextAttributeListener,监听ServletContextAttributeListener上下文属性事件

(2)请求相关的监听器

​ ①请求监听器ServletRequestListener

​ ②请求属性监听器ServletRequestAttributeListener

(3)会话相关的监听器

​ 会话监听器HttpSessionListener

​ 会话活化监听器HttpSessionActivationListener

​ 会话属性监听器HttpSessionAttributeListener

​ 会话绑定监听器 HttpSessionBindingListener


知识点3:监听器的开发与配置

​ 写一个类实现XXXListener接口

​ 重写接口中的方法,实现监听的功能

​ web.xml配置listener

1、创建MyContextListner

2、重写接口中的方法,实现监听的功能
package com.tjetc.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Application Lifecycle Listener implementation class MyContextLisener
 *
 */
public class MyContextLisener implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public MyContextLisener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
    	System.out.println("MyContextLisener.contextDestroyed()..."+sce.getServletContext());
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
         System.out.println("MyContextLisener.contextInitialized()..."+sce.getServletContext());
    }
}

输出:

​ 信息: 正在启动 Servlet 引擎:[Apache Tomcat/9.0.34]

​ MyContextLisener.contextInitialized()…


知识点4:上下文相关监听器

①创建MyContextAttributeListener,实现ServletContextAttributeListener接口
②重写接口的方法
③写MyContextAttributeServlet,向上下文添加属性,覆盖属性,删除属性
④运行MyContextAttributeServlet
package com.tjetc.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * Application Lifecycle Listener implementation class MyContextAttributeLisener
 *
 */
public class MyContextAttributeLisener implements ServletContextAttributeListener {

    /**
     * Default constructor. 
     */
    public MyContextAttributeLisener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextAttributeListener#attributeAdded(ServletContextAttributeEvent)
     */
    public void attributeAdded(ServletContextAttributeEvent scae)  { 
         System.out.println("MyContextAttributeLisener.attributeAdded():"+scae.getName()+"="+scae.getValue());
    }

	/**
     * @see ServletContextAttributeListener#attributeRemoved(ServletContextAttributeEvent)
     */
    public void attributeRemoved(ServletContextAttributeEvent scae)  { 
         // TODO Auto-generated method stub
    	System.out.println("MyContextAttributeLisener.attributeRemoved():"+scae.getName()+"="+scae.getValue());
    }

	/**
     * @see ServletContextAttributeListener#attributeReplaced(ServletContextAttributeEvent)
     */
    public void attributeReplaced(ServletContextAttributeEvent scae)  { 
         // TODO Auto-generated method stub
    	System.out.println("MyContextAttributeLisener.attributeReplaced():"+scae.getName()+"="+scae.getValue());
    }
	
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//得到上下文对象
		ServletContext servletContext = getServletContext();
		//向上下文中添加属性
		servletContext.setAttribute("name", "zs");
		//覆盖属性
		servletContext.setAttribute("name", "lisi");
		//删除属性
		servletContext.removeAttribute("name");
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

输出

MyContextAttributeLisener.attributeAdded():name=zs MyContextAttributeLisener.attributeReplaced():name=zs MyContextAttributeLisener.attributeRemoved():name=lisi


知识点5:会话相关监听器

HttpSessionListener:会话监听器,当会话对象被创建后或销毁前需要一些自定义处理时,可以用此监听器监听;

HttpSessionActivationListener:会话活化监听器,会话对象存在于服务器端,只要没有失效,服务器就得分配空间给其使用;为了能够提高使用效率,服务器有内在的活化钝化机制,可以将暂时不使用的会话对象钝化到外存,需要使用时再活化到内存。当活化后或钝化前需要一些自定义处理时,可以使用该监听器;

HttpSessionAttributeListener:会话属性监听器,当会话中的属性被添加、删除、替换时,要进行一些自定义处理时,可以使用该监听器,使用时可以用事件对象获取属性的名字等信息。

HttpSessionBindingListener:会话绑定监听器,当类实现了HttpSessionBindingListener接口后,该类对象绑定或解除绑定到会话时,就会被该监听器监听。绑定指的是调用setAttribute方法,解除绑定指的是调用removeAttribute方法,或者会话超时、会话失效等。


第2节:过滤器


知识点1:过滤器的作用

​ 把通用的、相同的处理代码用过滤器实现,可以共享,然后在web.xml中将过滤器配置给相关的资源使用即可

在这里插入图片描述

知识点2:过滤器的开发方法

1.写一个类实现Filter接口

2.重写Filter接口的三个方法
在这里插入图片描述

知识点3:过滤器的各个方法执行顺序

1.构造方法

2.init(filterConfig)初始化方法

3.doFilter()方法

4.destroy()方法

package com.tjetc.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述


知识点4:FilterConfig接口方法

在这里插入图片描述

MyFilter的初始化方法:

public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("MyFilter.init()方法:"+fConfig);
		String filterName = fConfig.getFilterName();
		System.out.println(filterName);
		//得到初始化参数的值
		String name = fConfig.getInitParameter("name");
		System.out.println(name);
		//得到所有初始化参数的名字
		Enumeration<String> names = fConfig.getInitParameterNames();
		while (names.hasMoreElements()) {
			String string = (String) names.nextElement();
			System.out.println(string);
		} 
		//得到上下文对象
		ServletContext servletContext = fConfig.getServletContext();
		System.out.println(servletContext);
	}

在这里插入图片描述


知识点5:FilterChain接口的方法

在这里插入图片描述

知识点6:编码过滤器

package com.tjetc.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class CodeFilter
 */
public class CodeFilter implements Filter {
	FilterConfig filterConfig;
    /**
     * Default constructor. 
     */
    public CodeFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		String encoding = filterConfig.getInitParameter("encoding");
		System.out.println(encoding);
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		response.setContentType("text/html;charset="+encoding);
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
		filterConfig=fConfig;
	}

}

输出

​ UTF-8

​ 赵六

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章