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那么直接取,如果没有则创建