JavaWeb之Filter和Listener技术(五)

  1. 导包
  • javax.servlet.jsp-api

  • servlet-api

  • jstl-api

  • standard

javax.servlet

servlet-api

2.5

javax.servlet.jsp

javax.servlet.jsp-api

2.3.3

javax.servlet.jsp.jstl

jstl-api

1.2

taglibs

standard

1.1.2

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

  2. 复写方法

  3. 在web.xml中配置拦截路径

1.3、字符编码过滤器


编写一个字符编码过滤器,我们想要通过过滤器来解决中文乱码问题

先编写一个没有配置编码的 Servlet

ShowServlet.java

public class ShowServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 这里没有配置编码,打印在网站上会乱码

resp.getWriter().write(“你好,世界!”);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req, resp);

}

}

  • 在web.xml中注册servlet映射

  • 一个Servlet可以指定多个映射路径

ShowServlet

com.kuang.servlet.ShowServlet

ShowServlet

/servlet/show

ShowServlet

/show

好了,Demo写好之后我们就可以编写字符编码过滤器了

  1. 定义一个类,实现接口Filter,复写方法

CharacterEncodingFilter.java

// 字符编码过滤器

public class CharacterEncodingFilter implements Filter {

// 初始:web服务器启动,就已经初始化了,随时等待过滤对象出现!

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println(“CharacterEncodingFilter初始化!”);

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

// Chain:链

// 1.过滤器中的所有代码,在过滤特定请求的时候都会执行

// 2.必须要让所有过滤器继续同行 filterChain.doFilter(servletRequest,servletResponse)

servletRequest.setCharacterEncoding(“utf-8”);

servletResponse.setCharacterEncoding(“utf-8”);

servletResponse.setContentType(“text/html;charset=UTF-8”);

System.out.println(“CharacterEncodingFilter执行前”);

filterChain.doFilter(servletRequest,servletResponse); // 让我们的请求继续走,如果不写,程序到这里就被拦截了

System.out.println(“CharacterEncodingFilter执行后”);

}

// 销毁

@Override

public void destroy() {

System.out.println(“CharacterEncodingFilter销毁”);

}

}

  1. 在web.xml中配置拦截路径
  • 只要是/servlet下面的任何请求,都会经过这个过滤器

CharacterEncodingFilter

com.kuang.filter.CharacterEncodingFilter

CharacterEncodingFilter

/servlet/*

在这里插入图片描述

在这里插入图片描述

1.4、过滤器生命周期方法


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

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

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

1.5、过滤器配置详解


拦截路径配置

  • 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行

  • 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行

  • 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行

  • 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

1.6、多个过滤器的执行顺序


在这里插入图片描述

在过滤器的配置中,有过滤器的声明和过滤器的映射两部分,到底是声明决定顺序,还是映射决定顺序呢?

  • <filter-mapping>的配置前后顺序决定过滤器的调用顺序,也就是由映射配置顺序决定。

1.7、过滤器的五种拦截行为


我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:

FilterDemo1

com.itheima.web.filter.FilterDemo1

true

FilterDemo1

/ServletDemo1

REQUEST

ERROR

FORWARD

INCLUDE

ASYNC

1.8、过滤器与Servlet的区别


| 方法/类型 | Servlet | Filter | 备注 |

| — | — | — | — |

| 初始化 方法 | void init(ServletConfig); | void init(FilterConfig); | 几乎一样,都是在web.xml中配置参数,用该对象的方法可以获取到。 |

| 提供服务方法 | void service(request,response); | void dofilter(request,response,FilterChain); | Filter比Servlet多了一个FilterChain,它不仅能完成Servlet的功能,而且还可以决定程序是否能继续执行。所以过滤器比Servlet更为强大。 在Struts2中,核心控制器就是一个过滤器。 |

| 销毁方法 | void destroy(); | void destroy(); | |

2、监听器Listener

===============================================================================

2.1、ServletContextListener


ServletContextListener:监听 ServletContext 对象的创建和销毁

2.2、步骤


  1. 定义一个类,实现 ServletContextListener 接口,复写方法

public class ContextLoaderListener implements ServletContextListener {

/**

  • 监听 ServletContext 对象创建。ServletContext 对象服务器启动后自动创建

  • 在服务器启动后自动调用

  • @param servletContextEvent

*/

@Override

public void contextInitialized(ServletContextEvent servletContextEvent) {

System.out.println(“ServletContext 对象被创建了…”);

}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-SfAmWXeg-1715713965635)]

[外链图片转存中…(img-j00d6Kv9-1715713965635)]

[外链图片转存中…(img-EGpljLrN-1715713965636)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值