过滤器 & 监听器 & AJAX
Fileter
- Fileter 表示过滤器,是 JavaWeb 三大组件( Servlet、Filter、Listener)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
- 过滤器一般完成一些通用的操作,eg:权限控制、统一编码处理、敏感字符处理等等。。。
Filter 快速入门
-
定义类,实现Filter 接口,并重写所有方法
-
配置 Filter 拦截资源的路径:在类上定义 @WebFilter 注解
-
在 doFilter 方法中输出一句话,并放行
- 创建出来应该是这个样子
@WebFilter("/*") public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter...."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { }
- 其中 @WebFilter(“/*”) 代表都拦截,可以自己设置要拦截哪些资源
Filter 执行流程
-
问题思考
-
-
放行后访问对于资源,资源访问完成后,还会回到 Filter 中吗?
会
-
如果会,那么是重新开始执行还是只执行放行后的逻辑呢?
执行放行后的逻辑
-
-
-
流程
- 执行放行前逻辑 ==》 放行 ==》访问资源 ==》 执行放行后逻辑
- 放行前对 request 进行处理,放行后对 response 进行处理
Filter 使用细节
-
**Filter 拦截路径配置 ** (有两种方式):
-
在 web.xml 文件中配置:
在 web.xml 文件中,可以使用 标签为 Filter 配置拦截路径。示例如下所示:
xmlCopy Code解释<filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/path/*</url-pattern> </filter-mapping>
上述示例中, 标签用于指定 Filter 拦截的路径,可以使用通配符 “*” 进行模糊匹配。
-
使用注解配置:
在 Servlet 3.0 及以上版本的 Java Web 应用程序中,可以使用注解来配置 Filter 的拦截路径。示例如下所示:
javaCopy Code解释@WebFilter("/path/*") public class MyFilter implements Filter { // Filter 的实现代码 }
使用 @WebFilter 注解可以直接在 Filter 类上指定拦截路径,更加简洁和方便。
-
-
过滤器链
- 一个 Web 应用,可以配置多个过滤器,这多个过滤器称为过滤器链
- 过滤器自然排序
Listener
-
在 Java Web 应用程序中,Listener(监听器)是一种特殊的组件,用于监听 Web 应用程序中的事件,并在特定事件发生时执行相应的逻辑。Java Web 应用程序的 Listener 主要分为以下几种类型:
- ServletContext 监听器:用于监听 ServletContext 对象的创建和销毁事件。常见的 ServletContext 监听器接口包括 ServletContextListener 和 ServletContextAttributeListener。
- HttpSession 监听器:用于监听 HttpSession 对象的创建和销毁事件,以及 HttpSession 属性的变化事件。常见的 HttpSession 监听器接口包括 HttpSessionListener 和 HttpSessionAttributeListener。
- ServletRequest 监听器:用于监听 ServletRequest 对象的创建和销毁事件,以及 ServletRequest 属性的变化事件。常见的 ServletRequest 监听器接口包括 ServletRequestListener 和 ServletRequestAttributeListener。
通过实现这些监听器接口,可以在 Web 应用程序中监听到相应的事件,并编写处理逻辑。通常在监听器的回调方法中可以执行一些初始化、资源清理、日志记录等操作。
另外,Java Web 应用程序还可以使用监听器来响应 ServletContextAttribute 和 HttpSessionAttribute 的变化,这样就可以实现对 Web 应用程序全局范围内的属性变化进行监听和处理。
在实际开发中,Listener 可以用于很多方面,比如在 ServletContextListener 中进行应用程序的初始化工作,或者在 HttpSessionListener 中进行用户在线状态的管理,以及在 ServletRequestListener 中记录请求日志等。
AJAX
AJAX 作用
- 概念:AJAX :异步的 JavaScript 和 XML
-
- 与服务器进行数据交换:通过AJAX 可以给服务器发送请求,并获取服务器响应的数据
- 使用了AJAX 和服务器进行通信,就可以使用 HTML+AJAX 来替换JSP 页面了
- 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术 eg:搜索
- 与服务器进行数据交换:通过AJAX 可以给服务器发送请求,并获取服务器响应的数据
-
同步异步
在 Java Web 应用程序中,同步和异步是用来描述请求处理方式的两种模式。下面简要介绍一下它们的区别:
- 同步:
- 同步处理是指请求在服务器端被一个线程依次处理,直到该请求处理完成并响应给客户端后,线程才会释放。
- 在传统的 Java Web 应用程序中,默认情况下是同步处理方式。当客户端发送请求后,服务器接收到请求并为其分配一个线程进行处理,直至请求处理完成返回响应。
- 同步处理的优点是简单直观,适用于大多数场景,但可能会导致性能瓶颈,特别是在需要等待外部资源或处理时间较长的情况下。
- 异步:
- 异步处理是指请求在服务器端可以在不同的线程中处理,允许一个请求分配给一个线程后,该线程可以立即释放,而不必等待请求处理完成。
- 在 Java Web 应用程序中,可以利用 Servlet 3.0 引入的异步特性实现异步处理。通过将请求标记为异步,可以在处理请求时释放线程,而不必阻塞等待结果。
- 异步处理适用于需要处理大量并发请求、请求涉及到耗时操作或需要等待外部资源的情况。通过异步处理可以提高系统的吞吐量和性能。
AJAX快速入门
- 原生代码开发
- 可以在教学文档 AJAX 简介 (w3school.com.cn)
Axios 异步框架
- Axios 对原生的AJAX 进行封装,简化书写
- Axios (axios-http.com) 官方文档
-
- 引入 axios 的 js 文件
- 使用 axios 发送请求,并获取响应结果
-
JSON
- JavaScript 对象表示法
- 语法简单,层次结构分明,多用于作为数据载体,在网络中进行数据传输
JSON 基础语法
-
数据类型:
- JSON 支持以下数据类型:
- 字符串(String):使用双引号括起来的文本。
- 数字(Number):整数或浮点数。
- 布尔值(Boolean):true 或 false。
- 对象(Object):使用花括号 {} 包裹的键值对集合。键和值之间使用冒号 : 分隔,多个键值对之间使用逗号 , 分隔。
- 数组(Array):使用方括号 [] 包裹的值的有序集合。多个值之间使用逗号 , 分隔。
- JSON 支持以下数据类型:
-
示例: 下面是一个 JSON 示例,展示了不同数据类型的使用:
jsonCopy Code解释{ "name": "John", "age": 30, "isStudent": false, "address": { "street": "123 Main St", "city": "New York" }, "hobbies": ["reading", "sports", "traveling"] }
上述示例中,name 是一个字符串,age 是一个数字,isStudent 是一个布尔值,address 是一个对象,hobbies 是一个数组。
-
访问数据:
- 在使用 JSON 数据时,可以通过键来访问对应的值。例如,要访问上述示例中的 name,可以使用
data.name
的方式进行访问。 - 如果对应的值是对象或数组,可以使用点号 . 或方括号 [] 进行多级访问。例如,要访问示例中的 address 的 city,可以使用
data.address.city
的方式进行访问。
- 在使用 JSON 数据时,可以通过键来访问对应的值。例如,要访问上述示例中的 name,可以使用
-
JSON 解析和生成:
-
在 Java 中,可以使用第三方库(如 Jackson、Gson)来解析和生成 JSON 数据。
-
解析 JSON:将 JSON 字符串转换为 Java 对象,可以通过库提供的 API 来实现。
-
//将JSON 字符串转为JS对象 var jsObject = JSON.parse(jsonStr); alert(jsObject.name)
-
-
生成 JSON:将 Java 对象转换为 JSON 字符串,同样可以通过库提供的 API 来实现。
-
//将 JS 对象转成 JSON 字符串 var s = JSON.stringify(jsObject); alert(s)
-
JSON 的基础语法就是这样,它简洁明了,易于理解和使用,因此广泛应用于各种应用程序和数据交换场景。
-
JSON 数据和 Java 对象转换
-
JSON 库 =》 Fastjson
-
//1.将Java 对象转换成 JSON字符串 user user = new user(); user.setName("wdc"); user.setPassword("123"); String jsonString = JSON.toJSONString(user); System.out.println(jsonString); //{"name":"wdc","password":"123"} //2.将JSON 对象转换为Java 对象 com.wdc.json.user user1 = JSON.parseObject("{\"name\":\"wdc\",\"password\":\"123\"}", com.wdc.json.user.class); System.out.println(user1);
-