Filter
1. StudentWEBSystem
增删改查
![在这里插入图片描述](https://img-blog.csdnimg.cn/fd5020e80c8441ce9aba0204d8485fd0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Lmd56a74qCC,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. BaseServlet封装
2.1 目前Servlet程序问题
目前情况下,代码中为了完成功能实现了太多的Servlet程序,而且每一个Servlet程序对应的是一个功能。这样会导致代码中的Servlet冗余!!!
期望:
相同模块的Servlet程序,按照方法封装的形式,处理成不同的方法,在同一个Servlet执行。
一个Servlet程序可以调用多个方法,从而减少Servlet程序冗余问题。
student.action ==> 通过参数形式告知当前Servlet程序,执行哪一个方法来完成功能。
【祝昊狗天天404】
2.2 如何封装
2.2.1 URL问题
URL问题
http://localhost:8080/Day40/资源名?参数
参数 ==> method=需要执行的方法名字
通过method参数对应方法名,在当前Servlet中,执行对应方法。所有方法的数据类型都是HttpServletRequest HttpServletResponse
在URL中
1. 资源名是对应的Servlet程序资源名字 url-pattern
2. 第一个URL参数 method=目标执行方法
2.2.2 Servlet程序和方法整合
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea2f9e83c5c44211a82890a58f4861d6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Lmd56a74qCC,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.2.3 BaseServlet代码实现
package util;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String methodName = req.getParameter("method");
try {
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, req, resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
3. 过滤器
3.1 JavaWEB三大组件之一过滤器
Filter
1. 用于控制资源访问问题
2. 编码集问题
3. 敏感词汇过滤【难点 真·难点 动态代理】
3.2 Filter第一个代码
package com.qfedu.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Init Method Called...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("过滤器放行...");
chain.doFilter(request, response);
System.out.println("过滤器回来...");
}
@Override
public void destroy() {
System.out.println("Destroy Method Called...");
}
}
3.3 过滤和资源不得不说的故事
![在这里插入图片描述](https://img-blog.csdnimg.cn/891ef174d4ec4708abcc1e67c96f4b86.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Lmd56a74qCC,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
3.4 过滤器链
疫情期间我们去商城
1. 口罩
2. 健康吗
3. 体温
这里就形成了一个过滤器链
在使用@WebFilter注解方式配置过滤器情况下,会根据当前Filter过滤类名按照字典顺序进行过滤操作。
AFilter
BFilter
CFilter
CFilter
BFilter
AFilter
利用过滤器链特征我们可以将一些比较重要的过滤器,前置操作。
例如:
1. 通过过滤器约束用户的请求编码集和对应响应编码集
2. 关键内容的登陆要求,未登录无法操作。
3. 在完成登陆之后,用户发送消息,对于用户发送的信息进行敏感词汇过滤
<?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_3_1.xsd"
version="3.1">
<filter>
<filter-name>BFilter</filter-name>
<filter-class>com.qfedu.filter.BFilterDemo1</filter-class>
</filter>
<filter>
<filter-name>CFilter</filter-name>
<filter-class>com.qfedu.filter.CFilterDemo1</filter-class>
</filter>
<filter>
<filter-name>AFilter</filter-name>
<filter-class>com.qfedu.filter.AFilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>BFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>