JavaWeb学习——过滤器和监听器

过滤器

基本的知识在菜鸟教程中有详细的介绍

菜鸟教程——过滤器

  <!--配制第一个过滤器-->
  <filter>
		<filter-name>Filter1</filter-name>
		<filter-class>com.servlet.filter.Filter1</filter-class>
  </filter>
  <filter-mapping>
		<filter-name>Filter1</filter-name>
		<url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!--配制第一个过滤器-->
  <filter>
		<filter-name>Filter2</filter-name>
		<filter-class>com.servlet.filter.Filter2</filter-class>
  </filter>
  <filter-mapping>
		<filter-name>Filter2</filter-name>
		<url-pattern>/*ed</url-pattern>
  </filter-mapping>

  <!--配制第一个过滤器-->  
  <filter>
		<filter-name>Filter3</filter-name>
		<filter-class>com.servlet.filter.Filter3</filter-class>
  </filter>
  <filter-mapping>
		<filter-name>Filter3</filter-name>
		<url-pattern>/filtertest</url-pattern>
  </filter-mapping>
  
package com.servlet.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 过滤器的使用:
 *  作用:对服务器接受的请求资源和响应给浏览器的资源进行管理
 *  	保护servlet	
 *  使用:
 *  	创建了一个实现Filter接口的普通java类
 *  	覆写接口中的方法:init doFilter  destory
 *  	在web.xml中配置过滤器过滤器
 *  	注意:
 *  		url-pattern: /* 
 *  				表示阻拦所有的请求
 *   		url-pattern: /*.ed 
 *  				表示阻拦以ed为结尾的的请求
 *   		url-pattern: /filtertest 
 *  				表示阻拦具体servlet的请求‘
 *  	过滤器的生命周期:
 *  		浏览器开启——》浏览器关闭
 *  	总结:
 *  		过滤器程序员声明和配置,服务器根据请求中的uri调用
 *  	执行:
 *  	      浏览器发起请求到服务器,服务器接收到请求后,根据在URI信息在web。xml中找到相对应过滤器执行doFilter方法,该方法
 *  	对此请求处理后符合则放行,放行后如何有符合过滤器要的继续过滤,找到servlet进行请求处理,servlet对请求完毕后,也就是
 *  	service方法结束, ,还应该继续返回执行相应的doFilter方法中的代码
 *  	
 *  	案例:
 *  		1.统一编码格式
 *  		2.session的处理
 *  		3.权限管理
 *  		4.资源管理(统一水印,和谐词汇等等)
 *  	
 */
public class Filter1 implements Filter{

    @Override
    public void destroy() {
	System.out.println("第一个过滤器被初始化了");
	
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
	    FilterChain chain) throws IOException, ServletException {
	
	//统一编码格式
	req.setCharacterEncoding("utf-8");
	resp.setContentType("text/html;charset=utf-8");
	
	//session处理 ;如果session数据过期或者不存在,我们就让其从新保存session
	HttpSession hs = ((HttpServletRequest)req).getSession();
	if(hs.getAttribute("user")==null){
	    //重定向
	    ((HttpServletResponse)resp).sendRedirect("/Users/login.jsp");
	}else{
	    
		System.out.println("我是第一个过滤器");
		chain.doFilter(req, resp);
	}
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
	
	System.out.println("第一个过滤器死了");
    }

}
package com.servlet.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;

public class Filter2 implements Filter {

    @Override
    public void destroy() {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
	    FilterChain arg2) throws IOException, ServletException {
	System.out.println("执行第二个过滤器");
	arg2.doFilter(arg0, arg1);
	
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
	// TODO Auto-generated method stub
	
    }

}
package com.servlet.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;

public class Filter3 implements Filter {

    @Override
    public void destroy() {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
	    FilterChain arg2) throws IOException, ServletException {
	System.out.println("执行第三个过滤器");
	arg2.doFilter(arg0, arg1);
	
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
	// TODO Auto-generated method stub
	
    }

}

 

 

监听器

问题:在 Servlet 技 术 中 我 们 学 习 了 request、session、 application 作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也就无法再指定的时机对数据和对象进行操作, 比如 session 销毁的时候,在线人数-1。
解决:使用监听器
概念:Servlet 监听器是 Servlet 规范中定义的一种特殊类,用 于监听 ServletContext、HttpSession 和 ServletRequest 等域
对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听对象:Request、  Session 、 Application
监听内容:创建、销毁、属性改变事件
监听作用:在事件发生之前,之后进行一些处理,比如统计在线人数
使用:监听 request 监听 session 监听 application
案例:统计网站在线人数。

package com.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 监听器的作用:
 * 	作用:
 * 	  监听作用域对象request、session、application的创建,销毁,和内容的改变
 * 	使用:
 * 	web配置   <listener><listener-class>
 * 	创建一个实现了指定接口的java类
 * 	Request
 * 		1.监听request==> ServletRequestListener   监听request的销毁和初始化
 * 		2.监听request==> ServletRequestAttributeListener  监听request作用域数据的更改
 * 			形参
 * 			getName()  获取监听数据的键
 * 			getValue() 获取监听数据的值
 * 
 * 	Session
 * 		1.监听session==> HttpSessionListener   
 * 		2.监听session==> HttpSessionAttributeListener  
 * 			形参
 * 			getName()
 * 			getValue()
 * 	Application
 * 		1.监听ServletContextListener==> HttpSessionListener   
 * 		2.监听ServletContextAttributeListener==> HttpSessionAttributeListener  
 * 			形参
 * 			getName()
 * 			getValue()
 * 			
 * 	
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * @Desciption :
 * @date :2019-4-3 下午6:53:09
 * @author :田坤
 */

public class Listener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{

    
    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
	System.out.println("reuest被销毁了");
	
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
	System.out.println("request初始化");
	
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {

	System.out.println("request中添加了属性:"+arg0.getName()+"--"+arg0.getValue());
	
    }
    
    /******************SESSION******************************************/
    
    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
	System.out.println("Session被初始化了");
	
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
	System.out.println("Session被销毁了");
	
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent arg0) {
	System.out.println("Session添加了属性:"+arg0.getName()+"---"+arg0.getValue());
	
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
	// TODO Auto-generated method stub
	
    }
    
    /****************Application*********************/
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
	System.out.println("application被销毁了");
	
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
	System.out.println("application被初始化了");
	
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent arg0) {
	System.out.println("Application添加了属性:"+arg0.getName()+"---"+arg0.getValue());
	
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent arg0) {
	// TODO Auto-generated method stub
	
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent arg0) {
	// TODO Auto-generated method stub
	
    }

   


   
}

猜你喜欢

转载自blog.csdn.net/qq_41965731/article/details/88997421
今日推荐