Web开发基础_Servlet学习_0030_Filter

本文介绍Servlet过滤器Filter的工作原理及其实现方法,并通过具体案例展示了如何在web.xml中配置过滤器及其执行顺序。此外,还介绍了如何使用监听器进行会话管理和应用初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet过滤器Filter

 

案例演示:

工程案例目录结构

pom.xml

<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.study</groupId>
  <artifactId>Jsp06</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
    
   <dependencies>
  	<dependency>
  		<groupId>javaee</groupId>
  		<artifactId>javaee-api</artifactId>
  		<version>5</version>
  	</dependency>
  </dependencies>
</project>

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" version="2.5">
  <display-name>Jsp06</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>hi</servlet-name>
  	<servlet-class>web.HiServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>hi</servlet-name>
  	<url-pattern>/hi</url-pattern>
  </servlet-mapping>
  
  <filter>
  	<filter-name>first</filter-name>
  	<filter-class>web.FirstFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>first</filter-name>
  	<url-pattern>/hi</url-pattern>
  </filter-mapping>
  
  <filter>
  	<filter-name>second</filter-name>
  	<filter-class>web.SecondFilter</filter-class>
  	<!-- 预置一个参数 -->
  	<init-param>
  		<param-name>city</param-name>
  		<param-value>北京</param-value>
  	</init-param>
  </filter>
  <!-- 多个Filter之间的顺序以mapping顺序为准 -->
  <filter-mapping>
  	<filter-name>second</filter-name>
  	<url-pattern>/hi</url-pattern>
  </filter-mapping>
  

</web-app>

FirstFilter.java

package web;

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 FirstFilter implements Filter{

	public void destroy() {
		System.out.println("销毁FirstServlet");
		
	}

	/**
	 * 实现过滤(拦截)的方法
	 * @param req Filter所过滤的请求的request对象
	 * @param res Filter所过滤的响应的response对象
	 * @param chain 过滤链对象,用来实现过滤
	 */
	public void doFilter(ServletRequest req,
			ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
			
			System.out.println("First过滤前");
			chain.doFilter(req, res);
			System.out.println("First过滤后");
		
	}

	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("初始化FirstFilter");
	}

}

SecondFilter.java

package web;

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 SecondFilter implements Filter{

	public void destroy() {
		System.out.println("销毁SecondFilter");
		
	}

	public void doFilter(ServletRequest req,
			ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
			System.out.println("Second过滤前");
			chain.doFilter(req,res);
			System.out.println("Second过滤后");
		
	}

	/**
	 * 1.服务器在调用init前会自动创建FilterConfig 
	 * 2.服务器会自动读取web.xml中的参数存入FilterConfig
	 * 3.服务器在调用init时会自动传入FilterConfg
	 */
	public void init(FilterConfig cfg) throws ServletException {
		System.out.println("初始化SecondFilter");
		System.out.println(cfg.getInitParameter("city"));
	}

}

HiServlet.java

package web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class HiServlet  extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req,
			HttpServletResponse res) throws ServletException, IOException {
		
			System.out.println("调用HiServlet。。。。");
			HttpSession session	= req.getSession();
			session.setAttribute("x", 2);
	}
	
	

}

 

Jsp06工程部署到Tomcat上,运行Tomcat启动案例工程,

在启动Tomcat过程中控制台显示,过滤器init方式会自动执行

浏览器录入http://localhost:8080/Jsp06/hi 即可:如果没有错误,最终控制台显示效果应如下图:

A

B

可以看到过滤器执行顺序以web.xml中mapping定义顺序为准

拓展:监听器

A. web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,

     比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。  

B.    监听器常用的用途

  通常使用Web监听器做以下的内容:

  统计在线人数,利用HttpSessionLisener

  加载初始化信息:利用ServletContextListener

  统计网站访问量

  实现访问监控

基于上面的案例来演示

编写监听器

 MyListener.java

package web;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyListener implements HttpSessionListener,HttpSessionAttributeListener{

	
	public void attributeAdded(HttpSessionBindingEvent e) {
		System.out.println("向session中添加数据");
		System.out.println(e.getSession());
		
	}

	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
	}

	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	//session创建事件,创建session时自动触发
	public void sessionCreated(HttpSessionEvent e) {
		System.out.println("创建session");
		System.out.println(e.getSession());
		
	}

	//session销毁事件,销毁session时自动触发
	public void sessionDestroyed(HttpSessionEvent e) {
		System.out.println("销毁session");
		
	}

}

在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" version="2.5">
  <display-name>Jsp06</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>hi</servlet-name>
  	<servlet-class>web.HiServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>hi</servlet-name>
  	<url-pattern>/hi</url-pattern>
  </servlet-mapping>
  
  <filter>
  	<filter-name>first</filter-name>
  	<filter-class>web.FirstFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>first</filter-name>
  	<url-pattern>/hi</url-pattern>
  </filter-mapping>
  
  <filter>
  	<filter-name>second</filter-name>
  	<filter-class>web.SecondFilter</filter-class>
  	<!-- 预置一个参数 -->
  	<init-param>
  		<param-name>city</param-name>
  		<param-value>北京</param-value>
  	</init-param>
  </filter>
  <!-- 多个Filter之间的顺序以mapping顺序为准 -->
  <filter-mapping>
  	<filter-name>second</filter-name>
  	<url-pattern>/hi</url-pattern>
  </filter-mapping>
  
  <listener>
  	<listener-class>web.MyListener</listener-class>
  </listener>
</web-app>

再次将Jsp06工程部署到Tomcat上,运行Tomcat启动案例工程,

浏览器首次录入http://localhost:8080/Jsp06/hi 即可:如果没有错误,最终控制台显示效果应如下图:

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值