开发环境
名称 | 版本 |
---|---|
操作系统 | 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 {
@Override
public void destroy() {
System.out.println("destroy()");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter()");
//放行
chain.doFilter(request, response);
}
@Override
public 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 {
@Override
public void destroy() {
System.out.println("Filter1-destroy()");
}
@Override
public 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() 放行后");
}
@Override
public 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 {
@Override
public 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 {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ApplicationListener 销毁辣");
}
@Override
public 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 stub
response.getWriter().write("success");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(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