Java 基础学习33-Filter,Listener,PrintWriter

2020年08月23日 17:56 · 阅读(539) ·

开发环境

名称 版本
操作系统 Windows 10 X64
JDK JDK1.8(jdk-8u151-windows-x64)
eclipse 2019-09 R (4.13.0)

相关内容

4.Spring Boot 过滤器 Filter 使用

Filter

Filter 简介

程序的过滤器,过滤客户端与服务器之间的请求和响应。

例如:
1.过滤字符集

Filter 是 web 三大核心组件之一。

web 三大核心组件:
1.Servlet:处理用户的请求
2.Filter:过滤用户的请求&响应
3.Listener:监听器

web 三大核心组件的共同点:
1.实现了某个接口
2.注册

简单的 Fileter 例子

HelloWorldFilter.java

新建 HelloWorldFilter.java

  1. package com.guigu.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. public class HelloWorldFilter implements Filter {
  10. @Override
  11. public void destroy() {
  12. System.out.println("destroy()");
  13. }
  14. @Override
  15. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  16. throws IOException, ServletException {
  17. System.out.println("doFilter()");
  18. //放行
  19. chain.doFilter(request, response);
  20. }
  21. @Override
  22. public void init(FilterConfig arg0) throws ServletException {
  23. System.out.println("init()");
  24. }
  25. }

Test.java

  1. package com.guigu.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. @WebServlet("/Test")
  9. public class Test extends HttpServlet {
  10. private static final long serialVersionUID = 1L;
  11. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. System.out.println("处理用户请求,做出响应");
  13. }
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. doGet(request, response);
  16. }
  17. }

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <filter>
  4. <filter-name>HelloWorldFilter</filter-name>
  5. <filter-class>com.guigu.filter.HelloWorldFilter</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>HelloWorldFilter</filter-name>
  9. <url-pattern>/Test</url-pattern>
  10. </filter-mapping>
  11. </web-app>

Filter.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <a href="Test">HelloFilter</a>
  11. </body>
  12. </html>

测试

右键 Filter.jsp-运行方式-Run on Server

点击 HelloFilter,控制台输出

  1. doFilter()
  2. 处理用户请求,做出响应

Filter 生命周期

方法名称 执行次数 执行时机
构造器 执行一次 启动服务器时执行
init 执行一次 启动服务器时执行
doFilter 执行多次 每次过滤请求时执行
destroy 执行一次 关闭服务器时执行

案例:

1.启动服务器时,控制台输出

  1. 构造器:HelloWorldFilter()
  2. init()

2.访问 Test.jsp 页面,点击 HelloFilter,控制台输出

  1. doFilter()
  2. 处理用户请求,做出响应

3.关闭服务器时,控制台输出

  1. destroy()

Fiter 工作原理

1.请求
2.执行过滤器中的 doFilter(),放行前的代码
3.放行请求,执行处理请求的 Servlet 代码并作出响应
4.执行过滤器中 doFilter(),放行后的代码。
5.响应

配置 Filter 快捷方式

多个 Filter 执行流程

Fileter1

  1. package com.guigu.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. public class Filter1 implements Filter {
  10. @Override
  11. public void destroy() {
  12. System.out.println("Filter1-destroy()");
  13. }
  14. @Override
  15. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  16. throws IOException, ServletException {
  17. System.out.println("Filter1-doFilter() 放行前");
  18. chain.doFilter(request, response);//放行
  19. System.out.println("Filter1-doFilter() 放行后");
  20. }
  21. @Override
  22. public void init(FilterConfig arg0) throws ServletException {
  23. System.out.println("Filter1-init()");
  24. }
  25. public Filter1() {
  26. System.out.println("Filter1-构造器:Filter1()");
  27. }
  28. }

Filter2

  1. package com.guigu.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. public class Filter2 implements Filter {
  11. public Filter2() {
  12. System.out.println("Filter2-构造器:Filter1()");
  13. }
  14. public void destroy() {
  15. System.out.println("Filter2-destroy()");
  16. }
  17. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  18. System.out.println("Filter2-doFilter() 放行前");
  19. chain.doFilter(request, response);//放行
  20. System.out.println("Filter2-doFilter() 放行后");
  21. }
  22. public void init(FilterConfig fConfig) throws ServletException {
  23. System.out.println("Filter2-init()");
  24. }
  25. }

Test

  1. package com.guigu.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. @WebServlet("/Test")
  9. public class Test extends HttpServlet {
  10. private static final long serialVersionUID = 1L;
  11. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. System.out.println("处理用户请求,做出响应");
  13. }
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. doGet(request, response);
  16. }
  17. }

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <filter>
  4. <filter-name>Filter1</filter-name>
  5. <filter-class>com.guigu.filter.Filter1</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>Filter1</filter-name>
  9. <url-pattern>/Test</url-pattern>
  10. </filter-mapping>
  11. <filter>
  12. <filter-name>Filter2</filter-name>
  13. <filter-class>com.guigu.filter.Filter2</filter-class>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>Filter2</filter-name>
  17. <url-pattern>/Test</url-pattern>
  18. </filter-mapping>
  19. </web-app>

Test.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Filter</title>
  8. </head>
  9. <body>
  10. <a href="Test">TestFilter</a>
  11. </body>
  12. </html>

测试

右键 Test.jsp-‘运行方式’-Run on Server,控制台显示

  1. Filter1-doFilter() 放行前
  2. Filter2-doFilter() 放行前
  3. 处理用户请求,做出响应
  4. Filter2-doFilter() 放行后
  5. Filter1-doFilter() 放行后

结论

filter 的先后顺序,由 web.xml 中 url 的顺序决定。

url 配置规则

1.精准配置

  1. <url-pattern>/Test</url-pattern>
  2. <servlet-name>Test</servlet-name>

2.模糊配置(包括 * 的配置)

(1)前置模糊

  1. <filter>
  2. <filter-name>Filter1</filter-name>
  3. <filter-class>com.guigu.filter.Filter1</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>Filter1</filter-name>
  7. <url-pattern>*.jsp</url-pattern>
  8. </filter-mapping>

右键 Test.jsp-‘运行方式’-Run on Server,控制台显示

  1. Filter1-doFilter() 放行前
  2. Filter1-doFilter() 放行后
  3. Filter2-doFilter() 放行前
  4. 处理用户请求,做出响应
  5. Filter2-doFilter() 放行后

(2)后置模糊

  1. <filter>
  2. <filter-name>Filter1</filter-name>
  3. <filter-class>com.guigu.filter.Filter1</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>Filter1</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

右键 Test.jsp-‘运行方式’-Run on Server,控制台显示

  1. Filter1-doFilter() 放行前
  2. Filter2-doFilter() 放行前
  3. 处理用户请求,做出响应
  4. Filter2-doFilter() 放行后
  5. Filter1-doFilter() 放行后

使用 Filter 设置字符集

HttpFilter

  1. package com.guigu.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public abstract class HttpFilter implements Filter {
  13. private FilterConfig fConfig;
  14. public HttpFilter() {
  15. }
  16. public void destroy() {
  17. }
  18. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  19. HttpServletRequest req=(HttpServletRequest)request;
  20. HttpServletResponse res = (HttpServletResponse)response;
  21. doFilter(req,res,chain);
  22. }
  23. public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;
  24. public void init(FilterConfig fConfig) throws ServletException {
  25. this.fConfig = fConfig;
  26. }
  27. public FilterConfig getFilterConfig(){
  28. return this.fConfig;
  29. }
  30. }

CharSetFilter

  1. package com.guigu.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class CharSetFilter extends HttpFilter {
  13. @Override
  14. public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
  15. String code = this.getFilterConfig().getInitParameter("code");
  16. request.setCharacterEncoding(code);
  17. response.setContentType("text/html;charset=UTF-8");
  18. System.out.println(code);
  19. //放行
  20. chain.doFilter(request, response);
  21. }
  22. }

web.xml

  1. <filter>
  2. <filter-name>CharSetFilter</filter-name>
  3. <filter-class>com.guigu.filter.CharSetFilter</filter-class>
  4. <init-param>
  5. <param-name>code</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>CharSetFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

Filter.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Filter</title>
  8. </head>
  9. <body>
  10. <a href="Test">Test</a>
  11. </body>
  12. </html>

测试

右键 Filter.jsp-‘运行方式’-Run on Server,控制台输出

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Filter</title>
  8. </head>
  9. <body>
  10. <a href="Test">Test</a>
  11. </body>
  12. </html>

Listener

一.监听对象的创建与销毁
二.监听对象的属性变化
三.监听 Session 内的对象

例子:

ApplicationListener

  1. package com.guigu.listener;
  2. import javax.servlet.ServletContextEvent;
  3. import javax.servlet.ServletContextListener;
  4. public class ApplicationListener implements ServletContextListener {
  5. @Override
  6. public void contextDestroyed(ServletContextEvent arg0) {
  7. System.out.println("ApplicationListener 销毁辣");
  8. }
  9. @Override
  10. public void contextInitialized(ServletContextEvent arg0) {
  11. System.out.println("ApplicationListener 创建辣");
  12. }
  13. }

web.xml 注册

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <listener>
  4. <listener-class>com.guigu.listener.ApplicationListener</listener-class>
  5. </listener>
  6. </web-app>

测试

运行任意一个 jsp 页面,请求 Servlet,控制台输出

  1. ApplicationListener 创建辣
  2. Filter2-构造器:Filter1()

PrintWriter

GetTest.java

  1. package com.guigu.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. @WebServlet("/GetTest")
  9. public class GetTest extends HttpServlet {
  10. private static final long serialVersionUID = 1L;
  11. public GetTest() {
  12. super();
  13. // TODO Auto-generated constructor stub
  14. }
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. // TODO Auto-generated method stub
  17. response.getWriter().write("success");
  18. }
  19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. // TODO Auto-generated method stub
  21. doGet(request, response);
  22. }
  23. }

GetTest.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <a href="GetTest">GetTest</a>
  11. </body>
  12. </html>

测试

右键 GetTest.jsp-‘运行方式’-Run on Server,点击 GetTest,页面返回 success