Filter&Listener

Filter 过滤器

过滤器概述,执行原理

过滤器类似于servlet,也是用来接收并处理浏览器请求的java类
只不过,与servlet不同的是,filter是在servlet执行之前执行.
servlet接收请求是用来处理业务逻辑的
filter接收请求是用来处理过滤业务的
(1)过滤字符编码
(2)拦截请求
在这里插入图片描述

编写过滤器的步骤_使用过滤器过滤字符编码
 * 创建过滤器的步骤:
 * 1.创建一个普通的java类,实现javax.servlet.Filter接口
 * 2.重写doFilter方法
 * 		该方法就是过滤器用来实现过滤业务的核心方法,类似于servlet中的doGet/doPost方法
 * 3.修改方法中的变量名(不是必须的)
 * 		req resp chain
 * 4.在doFilter方法中完成过滤业务
 * 5.在web.xml中对filter进行配置
 * 		必须配置在所有servlet的上面
 *执行过程:根据访问路径,首先匹配过滤器的url-pattern,执行过滤器中的内容,执行到放行操作后,执行url-pattern匹配的servlet的内容,执行完servlet中的内容,接着执行过滤器放行之后的代码,然后响应会浏览器
//web.xml中的配置
  <filter>
  	<filter-name>filter1</filter-name>
  	<filter-class>com.jpg.filter.Filter1</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>filter1</filter-name>
  	<url-pattern>/abc/myServlet1.do</url-pattern>
  </filter-mapping>
@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		
		System.out.println("进入到filter1");
		
		//执行过滤字符编码的业务
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		//在执行完过滤业务之后,需要对请求进行"放行"操作
		chain.doFilter(req, resp);
		
		//响应回来经过过滤器
		//未来的实际项目开发响应回来的过滤处理非常少见,仅做了解
		System.out.println("响应回来经过filter1");
		
	}
过滤器的生命周期

创建:服务器启动时,服务器会自动的为我们创建出filter对象
销毁:关闭服务器

过滤器中配置多个servlet的方式

在这里插入图片描述
但是不推荐使用,如果有很多个servlet,必须配置很多个servlet,不方便维护

过滤器的url-pattern

如果浏览器发出的请求,与web.xml中的filter的多个url-pattern都匹配,那么这些匹配的filter都执行.执行的顺序为按照web.xml中的上下的配置顺序执行.配置在较上位置的优先执行.这一点与servlet不同,在servlet中,只会执行一个servlet,是根据路径的优先级

过滤器链的作用

过滤器链:FilterChain chain
执行过滤器链: chain.doFilter(req, resp);
过滤器链的执行表示的是,在我们的当前过滤器执行完毕后,将请求放行,如果接下来还有与路径匹配的过滤器,则执行下一个匹配的过滤器,如果没有路径匹配的过滤器了,则执行目标servlet.
当从浏览器上访问myServlet1.do的时候,先去web.xml中,从上到下去寻找和其相匹配的url-pattern,如果匹配,则进入到过滤器,然后执行到chain.doFilter(req, resp);放行语句,放行到哪里呢? 放行到web.xml中,去web.xml中寻找是否还有匹配的servlet,如果有再次进入到过滤器执行,执行chain.doFilter(req, resp);如果在web.xml中没有发现匹配的路径,则执行相匹配路径的servlet

Listener 监听器

什么是监听器

监听器就是一个java类,用来起到监听作用,当java中的其他组件或功能在发生变化时,所作出的提醒或操作。

监听器都能监听什么

监听域对象的创建与销毁
监听域对象属性值创建更换与销毁

监听器的创建步骤

与servlet和filter所不同的是,监听器监听什么,就实现什么接口
监听三个域对象的创建和销毁(以下都是接口)
ServletContextListener
ServletRequestListener
HttpSessionListener

package com.jpg.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/*
 * 创建监听器的步骤:
 * 1.创建一个普通的java类,实现监听器接口
 * 		我们监听什么,就实现相应的接口
 * 		比如我们现在要监听上下文对象的创建与销毁,那么我们就要实现ServletContextListener这个接口
 * 2.重写监听方法
 * 		我们在这里重写的是监听session对象创建与销毁的方法.
 * 		如果是监听上下文对象,应该重写的方法是
 * public void contextInitialized(ServletContextEvent event) {}
 * public void contextDestroyed(ServletContextEvent event) {}
 *		如果是监听的request对象,应该重写的方法是
 *	public void requestInitialized(ServletRequestEvent event) {}
 *	public void requestDestroyed(ServletRequestEvent event) {}
 * 3.修改方法中的变量名(不是必须的)
 * 		event对象的作用是能够取得监听的对象
 * 4.完成监听方法
 * 5.在web.xml中配置监听器
 * 	<listener>
  		<listener-class>com.jpg.listener.Listener</listener-class>
  	</listener>
 */
public class Listener implements HttpSessionListener {
	
	//监听session对象的创建,如果session对象创建了,则马上执行该方法,对我们进行通知
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		System.out.println("session对象创建了");
	}
	
	//监听session对象的销毁,如果session对象销毁了,则马上执行该方法,对我们进行通知
	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		System.out.println("session对象销毁了");
	}
	
}

如果直接访问一个jsp资源,去监听session对象是否创建,在控制台上会显示他是创键了的,为什么是创建了的?
因为在jsp的page指令中,有一个session属性,设置jsp页面是否可以使用session内置对象,session的默认值为true,表示的是,在默认的情况下,jsp执行的时候,已经做好了reqest.getSession(),可以直接拿过来用,如果设为false,则需要自己去reqest.getSession(),这里的getSession同样是如果已经有session那么直接取,如果没有则创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值