- 导包
-
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
-
定义一个类,实现接口
Filter
-
复写方法
-
在web.xml中配置拦截路径
编写一个字符编码过滤器,我们想要通过过滤器来解决中文乱码问题
先编写一个没有配置编码的 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写好之后我们就可以编写字符编码过滤器了
- 定义一个类,实现接口
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销毁”);
}
}
- 在web.xml中配置拦截路径
- 只要是/servlet下面的任何请求,都会经过这个过滤器
CharacterEncodingFilter
com.kuang.filter.CharacterEncodingFilter
CharacterEncodingFilter
/servlet/*
-
init
:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源 -
doFilter
:每一次请求被拦截资源时,会执行。执行多次 -
destroy
:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
拦截路径配置:
-
具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
-
拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
-
后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
-
拦截所有资源:/* 访问所有资源时,过滤器都会被执行
在过滤器的配置中,有过滤器的声明和过滤器的映射两部分,到底是声明决定顺序,还是映射决定顺序呢?
<filter-mapping>
的配置前后顺序决定过滤器的调用顺序,也就是由映射配置顺序决定。
我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:
FilterDemo1
com.itheima.web.filter.FilterDemo1
true
FilterDemo1
/ServletDemo1
REQUEST
ERROR
FORWARD
INCLUDE
ASYNC
| 方法/类型 | 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();
| |
===============================================================================
ServletContextListener:监听 ServletContext 对象的创建和销毁
- 定义一个类,实现 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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!