JavaWeb三大组件【Servlet、Filter、Listener】

目录

引言

Filter

Listener

引言

JavaWeb三大组件指的是:Servlet、Filter、Listener,这三个组件在JavaWeb开发中分别提供不同的功能。Servlet 是 JavaWeb 的三大组件之一,它属于动态资源,前面文章有写到(请参考):web阶段~Servlet学习_乔巴菌儿的博客-CSDN博客  今天,我们将进行Filter(过滤器)与Listener(监听器)的学习。

Filter

【概念】

web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。filter与servlet在很多的方面极其相似,但是也有不同,例如filter和servlet一样都又三个生命周期方法,同时他们在web.xml中的配置文件也是差不多的、 但是servlet主要负责处理请求,而filter主要负责拦截请求,和放行。

快速入门:

        1. 定义一个类,实现接口Filter

        2. 复写方法

        3. 配置拦截路径(web.xml、  注解)

//    @WebFilter("/*") //访问所有资源之前都会执行该过滤器
public class FilterDemo1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了......");

        //执行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

过滤器细节:

        web.xml配置

<filter>
    <filter-name>demo1</filter-name>
    <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>

<filter-mapping>
    <filter-name>demo1</filter-name>
    <!– 拦截路径 –>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【执行流程】

1. 执行过滤器

2. 执行放行后的资源
3. 回来执行过滤器放行代码下边的代码

【生命周期】

1. init:在服务器启动后,会创建Filter对象,然后调用init方法。用于加载资源,只执行一次

2. doFilter:每一次请求被拦截资源时,会执行。执行多次

3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。用于释放资源,只执行一次

@WebFilter("/*")
public class FilterDemo3 implements Filter {

    //每一次请求被拦截资源时,会执行(执行多次)
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("dofilter...");
        chain.doFilter(req, resp);
    }

    //在服务器启动后创建Filter对象,然后调用init方法(执行一次)
    //【加载资源】
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init...");
    }

    //在服务器关闭后,Filter对象被销毁,如果服务器正常关闭,则会调用destroy方法(执行一次)
    //【释放资源】
    public void destroy() {
        System.out.println("destroy...");
    }
}

【配置详解】

1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /user/*   访问/user下的所有资源时,过滤器都会被执行
3. 后缀名拦截: *.jsp   访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/*   访问所有资源时,过滤器都会被执行

//@WebFilter("/index.jsp")
//1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行

//@WebFilter("/user/*")
//2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行

//@WebFilter("*.jsp")
public class FilterDemo4 implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo4...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {

    }

}

【注解配置&web.xml配置】

设置dispatcherTypes属性:

        1. REQUEST:默认值。浏览器直接请求资源
        2. FORWARD:转发访问资源
        3. INCLUDE:包含访问资源
        4. ERROR:错误跳转资源
        5. ASYNC:异步访问资源

web.xml配置:

        设置<dispatcher></dispatcher>标签即可

//浏览器直接请求index.jsp资源时,该过滤器会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)

//只有转发访问index.jsp时,该过滤器才会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)

//浏览器直接请求index.jsp或者转发访问index.jsp,该过滤器都会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FilterDemo5 implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo5...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {

    }

}

【过滤器链】

配置多个过滤器:(如果有两个过滤器:过滤器1和过滤器2)

1. 过滤器1
2. 过滤器2
3. 资源执行
4. 过滤器2
5. 过滤器1 
过滤器先后顺序问题:

注解配置:按照类名的字符串比较规则比较,值小的先执行
        如: AFilter 和 BFilter,AFilter就先执行了。
2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

Listener

这里参考此篇博客:JavaWeb三大组件(Servlet、Filter、Listener)_xiaojie119120的博客-CSDN博客_servlet三大组件

Listener就是监听器,我们在JavaSE开发或者Android开发时,经常会给按钮加监听器,当点击这个按钮就会触发监听事件,调用onClick方法,本质是方法回调。在JavaWeb的Listener也是这么个原理,但是它监听的内容不同,它可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。 
应用域监听: 
Ø ServletContext(监听Application)

生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

void contextInitialized(ServletContextEvent sce):创建Servletcontext时

void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时

属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

void attributeAdded(ServletContextAttributeEvent event):添加属性时;

void attributeReplaced(ServletContextAttributeEvent event):替换属性时;

void attributeRemoved(ServletContextAttributeEvent event):移除属性时;

Ø HttpSession(监听Session)

生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

voidsessionCreated(HttpSessionEvent se):创建session时

void sessionDestroyed(HttpSessionEvent se):销毁session时

属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

void attributeAdded(HttpSessionBindingEvent event):添加属性时;

void attributeReplaced(HttpSessionBindingEvent event):替换属性时

void attributeRemoved(HttpSessionBindingEvent event):移除属性时

Ø ServletRequest(监听Request)

生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

voidrequestInitialized(ServletRequestEvent sre):创建request时

void requestDestroyed(ServletRequestEvent sre):销毁request时

属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

voidattributeAdded(ServletRequestAttributeEvent srae):添加属性时

void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时

void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

感知Session监听: 
1:HttpSessionBindingListener监听 
⑴在需要监听的实体类实现HttpSessionBindingListener接口 
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法 
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法 
2:HttpSessionActivationListener监听 
⑴在需要监听的实体类实现HttpSessionActivationListener接口 
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法 
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法

    原文作者:乔巴菌儿
    原文地址: https://blog.csdn.net/EVILDOERyyds/article/details/124349956
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞