在实际项目中,很多通用的校验或者模块,可以放在过滤器中进行实现,不用都写在 servlet 中。
1. 新建一个javaweb项目
开发环境:
- IDEA
- jdk 8
- maven 3.6.3
- tomcat 9
使用 maven 的模板创建一个 webapp 项目
手动创建 java 以及 resources 目录,创建后的目录结构如下所示
在 pom.xml 文件中,引入需要用到的依赖,如下为本次用到的所有依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>javaweb</artifactId>
<groupId>com.yuhuofei.servlet</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>03-filter</artifactId>
<packaging>war</packaging>
<name>03-filter Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--添加Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--添加JSP依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!--添加JSTL表达式的依赖-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--添加standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>03-filter</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
为项目配置好 tomcat 服务器
到此,项目基本的创建就算完成了,接下来就是写处理逻辑
2. 过滤器filter的使用示例
这里以使用过滤器统一处理乱码问题为例,演示过滤器的使用
1、新建一个 Servlet 类——TestServlet.java
package com.yuhuofei.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description 一个简单的servlet示例
* @ClassName TestServlet
* @Author yuhuofei
* @Date 2022/6/5 16:34
* @Version 1.0
*/
public class TestServlet 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 {
super.doGet(req, resp);
}
}
2、新建一个过滤器类——MyFilter.java
package com.yuhuofei.javaweb.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* @Description 自定义一个Filter类,演示过滤效果
* @ClassName MyFilter
* @Author yuhuofei
* @Date 2022/6/5 16:27
* @Version 1.0
*/
public class MyFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("=====MyFilter开始初始化=====");
}
/**
* 1、过滤中的所有代码,在过滤特定请求的时候都会执行
* 2、必须要让过滤器继续往后执行,即要加上chain.doFilter(request,response);
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("MyFilter开始执行");
//这行的作用是让请求继续往后走,如果不写,程序到此会被拦截停止!
chain.doFilter(request,response);
System.out.println("MyFilter执行完成");
}
//销毁
@Override
public void destroy() {
System.out.println("=====MyFilter销毁=====");
}
}
3、修改 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置servlet -->
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.yuhuofei.javaweb.servlet.TestServlet</servlet-class>
</servlet>
<!--对同一个servlet,配置两个请求路径-->
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/filter/test</url-pattern>
</servlet-mapping>
<!--配置Filter-->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.yuhuofei.javaweb.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--凡是请求 /filter/ 路径下的资源,都会经过MyFilter这个过滤器进行处理-->
<url-pattern>/filter/*</url-pattern>
</filter-mapping>
</web-app>
4、启动 tomcat 服务器,测试
(1)启动 tomcat 服务器后,访问 http://localhost:8080/test,会展示乱码,因为这个路径下没有做乱码处理
(2)返回 http://localhost:8080/filter/test ,会展示中文内容,如下所示,原因是在过滤器中对 /filter/ 路径下的请求,做了乱码处理
5、过滤器的初始化和销毁
过滤器会随着服务器的启动和关闭,进行初始化和销毁,如下所示