开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | Windows 10 X64 |
| JDK | JDK1.8(jdk-8u151-windows-x64) |
| eclipse | 2019-09 R (4.13.0) |
相关内容
Filter
Filter 简介
程序的过滤器,过滤客户端与服务器之间的请求和响应。
例如:
1.过滤字符集
Filter 是 web 三大核心组件之一。
web 三大核心组件:
1.Servlet:处理用户的请求
2.Filter:过滤用户的请求&响应
3.Listener:监听器
web 三大核心组件的共同点:
1.实现了某个接口
2.注册
简单的 Fileter 例子
HelloWorldFilter.java
新建 HelloWorldFilter.java
package com.guigu.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloWorldFilter implements Filter {@Overridepublic void destroy() {System.out.println("destroy()");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("doFilter()");//放行chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {System.out.println("init()");}}
Test.java
package com.guigu.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/Test")public class Test extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("处理用户请求,做出响应");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><filter><filter-name>HelloWorldFilter</filter-name><filter-class>com.guigu.filter.HelloWorldFilter</filter-class></filter><filter-mapping><filter-name>HelloWorldFilter</filter-name><url-pattern>/Test</url-pattern></filter-mapping></web-app>
Filter.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><a href="Test">HelloFilter</a></body></html>
测试
右键 Filter.jsp-运行方式-Run on Server
点击 HelloFilter,控制台输出
doFilter()处理用户请求,做出响应
Filter 生命周期
| 方法名称 | 执行次数 | 执行时机 |
|---|---|---|
| 构造器 | 执行一次 | 启动服务器时执行 |
| init | 执行一次 | 启动服务器时执行 |
| doFilter | 执行多次 | 每次过滤请求时执行 |
| destroy | 执行一次 | 关闭服务器时执行 |
案例:
1.启动服务器时,控制台输出
构造器:HelloWorldFilter()init()
2.访问 Test.jsp 页面,点击 HelloFilter,控制台输出
doFilter()处理用户请求,做出响应
3.关闭服务器时,控制台输出
destroy()
Fiter 工作原理
1.请求
2.执行过滤器中的 doFilter(),放行前的代码
3.放行请求,执行处理请求的 Servlet 代码并作出响应
4.执行过滤器中 doFilter(),放行后的代码。
5.响应
配置 Filter 快捷方式
多个 Filter 执行流程
Fileter1
package com.guigu.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class Filter1 implements Filter {@Overridepublic void destroy() {System.out.println("Filter1-destroy()");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("Filter1-doFilter() 放行前");chain.doFilter(request, response);//放行System.out.println("Filter1-doFilter() 放行后");}@Overridepublic void init(FilterConfig arg0) throws ServletException {System.out.println("Filter1-init()");}public Filter1() {System.out.println("Filter1-构造器:Filter1()");}}
Filter2
package com.guigu.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;public class Filter2 implements Filter {public Filter2() {System.out.println("Filter2-构造器:Filter1()");}public void destroy() {System.out.println("Filter2-destroy()");}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter2-doFilter() 放行前");chain.doFilter(request, response);//放行System.out.println("Filter2-doFilter() 放行后");}public void init(FilterConfig fConfig) throws ServletException {System.out.println("Filter2-init()");}}
Test
package com.guigu.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/Test")public class Test extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("处理用户请求,做出响应");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><filter><filter-name>Filter1</filter-name><filter-class>com.guigu.filter.Filter1</filter-class></filter><filter-mapping><filter-name>Filter1</filter-name><url-pattern>/Test</url-pattern></filter-mapping><filter><filter-name>Filter2</filter-name><filter-class>com.guigu.filter.Filter2</filter-class></filter><filter-mapping><filter-name>Filter2</filter-name><url-pattern>/Test</url-pattern></filter-mapping></web-app>
Test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Filter</title></head><body><a href="Test">TestFilter</a></body></html>
测试
右键 Test.jsp-‘运行方式’-Run on Server,控制台显示
Filter1-doFilter() 放行前Filter2-doFilter() 放行前处理用户请求,做出响应Filter2-doFilter() 放行后Filter1-doFilter() 放行后
结论
filter 的先后顺序,由 web.xml 中 url 的顺序决定。
url 配置规则
1.精准配置
<url-pattern>/Test</url-pattern><servlet-name>Test</servlet-name>
2.模糊配置(包括 * 的配置)
(1)前置模糊
<filter><filter-name>Filter1</filter-name><filter-class>com.guigu.filter.Filter1</filter-class></filter><filter-mapping><filter-name>Filter1</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>
右键 Test.jsp-‘运行方式’-Run on Server,控制台显示
Filter1-doFilter() 放行前Filter1-doFilter() 放行后Filter2-doFilter() 放行前处理用户请求,做出响应Filter2-doFilter() 放行后
(2)后置模糊
<filter><filter-name>Filter1</filter-name><filter-class>com.guigu.filter.Filter1</filter-class></filter><filter-mapping><filter-name>Filter1</filter-name><url-pattern>/*</url-pattern></filter-mapping>
右键 Test.jsp-‘运行方式’-Run on Server,控制台显示
Filter1-doFilter() 放行前Filter2-doFilter() 放行前处理用户请求,做出响应Filter2-doFilter() 放行后Filter1-doFilter() 放行后
使用 Filter 设置字符集
HttpFilter
package com.guigu.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public abstract class HttpFilter implements Filter {private FilterConfig fConfig;public HttpFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;doFilter(req,res,chain);}public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;public void init(FilterConfig fConfig) throws ServletException {this.fConfig = fConfig;}public FilterConfig getFilterConfig(){return this.fConfig;}}
CharSetFilter
package com.guigu.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CharSetFilter extends HttpFilter {@Overridepublic void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {String code = this.getFilterConfig().getInitParameter("code");request.setCharacterEncoding(code);response.setContentType("text/html;charset=UTF-8");System.out.println(code);//放行chain.doFilter(request, response);}}
web.xml
<filter><filter-name>CharSetFilter</filter-name><filter-class>com.guigu.filter.CharSetFilter</filter-class><init-param><param-name>code</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>CharSetFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Filter.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Filter</title></head><body><a href="Test">Test</a></body></html>
测试
右键 Filter.jsp-‘运行方式’-Run on Server,控制台输出
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Filter</title></head><body><a href="Test">Test</a></body></html>
Listener
一.监听对象的创建与销毁
二.监听对象的属性变化
三.监听 Session 内的对象
例子:
ApplicationListener
package com.guigu.listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class ApplicationListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("ApplicationListener 销毁辣");}@Overridepublic void contextInitialized(ServletContextEvent arg0) {System.out.println("ApplicationListener 创建辣");}}
web.xml 注册
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><listener><listener-class>com.guigu.listener.ApplicationListener</listener-class></listener></web-app>
测试
运行任意一个 jsp 页面,请求 Servlet,控制台输出
ApplicationListener 创建辣Filter2-构造器:Filter1()
PrintWriter
GetTest.java
package com.guigu.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/GetTest")public class GetTest extends HttpServlet {private static final long serialVersionUID = 1L;public GetTest() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.getWriter().write("success");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
GetTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><a href="GetTest">GetTest</a></body></html>
测试
右键 GetTest.jsp-‘运行方式’-Run on Server,点击 GetTest,页面返回 success