Filter 是什么?
在Java Web开发中,Filter(过滤器)是一种用于在请求到达目标资源(如Servlet、JSP)之前或响应返回客户端之前
进行预处理和后处理的组件。Filter可以拦截请求和响应,执行特定的操作,如日志记录、字符编码设置、身份验证、权限检查、数据压缩
等。Filter 可以将完成这些通用的操作,避免在多个 Servlet 中编写重复代码
。
Filter 中,什么是链式处理?
链式处理
:多个Filter可以串联,形成一个处理链,每个Filter依次处理请求和响应。
Filter 常见的应用场景有哪些?
常见应用场景:日志记录、字符编码设置、权限检查、身份验证
等。
Filter 的工作原理是什么?
客户端请求到达 → Filter 拦截并预处理 → 请求到达 Servlet ,Servlet 生成响应 → Filter 后处理 → 返回响应。
Filter 的生命周期分为哪些阶段?
init()
→ doFilter()
→ destroy()
Filter 的生命周期离不开以上三个方法,它们分别代表 Filter 的初始化 → 执行过滤操作 → 销毁
三个生命阶段。
如何实现一个 Filter?
实现javax.servlet.Filter
接口,并重写init()
、doFilter()
、destroy()
方法:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") // 拦截所有请求
public class ExampleFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 请求预处理
System.out.println("Before processing request");
// 传递给下一个Filter或目标资源
chain.doFilter(request, response);
// 响应后处理
System.out.println("After processing response");
}
@Override
public void destroy() {
// 销毁操作
}
}
如何配置 Filter ?
可以通过注解(如@WebFilter
)或在web.xml
中配置Filter:
<filter>
<filter-name>ExampleFilter</filter-name>
<filter-class>com.example.ExampleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExampleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@WebFilter("/api/*")
会拦截哪些资源?
api/
路径下的所有资源都会被拦截。
@WebFilter("*.do")
会拦截哪些资源?
以.do
结尾的所有资源都会被拦截。
Listener 是什么?
在Java Web开发中,Listener(监听器)是一种用于监听Web应用中特定事件(如ServletContext、HttpSession、ServletRequest的创建、销毁或属性修改)的组件。Listener可以在这些事件发生时执行自定义逻辑,常用于初始化资源、统计在线用户、清理资源等场景。
Listener 的作用有哪些?
- 事件监听:监听Web应用中的各种事件,如应用启动、会话创建、请求到达等。
- 资源管理:在应用启动时初始化资源,在应用关闭时释放资源(如数据库连接等)。
- 日志记录:记录应用的关键事件,用于监控和调试。
- 初始化全局资源:在应用启动时初始化数据库连接池、缓存等。
- 统计在线用户数:跟踪用户会话状态,通过监听会话的创建和销毁,统计在线用户数。
Listener 常见的类型有哪些?
Java Web提供了多种Listener接口,用于监听不同的事件:
- ServletContextListener
- 监听
ServletContext
的创建和销毁。 - 常用方法:
contextInitialized()
、contextDestroyed()
。 - 应用场景:在应用启动时初始化全局资源(如数据库连接池),在应用关闭时释放资源。
- 监听
- HttpSessionListener
- 监听
HttpSession
的创建和销毁。 - 常用方法:
sessionCreated()
、sessionDestroyed()
。 - 应用场景:统计在线用户数、跟踪用户会话状态。
- 监听
- ServletRequestListener
- 监听
ServletRequest
的创建和销毁。 - 常用方法:
requestInitialized()
、requestDestroyed()
。 - 应用场景:记录请求日志、统计请求处理时间。
- 监听
- ServletContextAttributeListener
- 监听
ServletContext
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪全局属性的变化。
- 监听
- HttpSessionAttributeListener
- 监听
HttpSession
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪用户会话中属性的变化。
- 监听
- ServletRequestAttributeListener
- 监听
ServletRequest
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪请求中属性的变化。
- 监听
Session 相关的监听器有哪些?
和Session相关的监听器有两种:
HttpSessionListener
- 监听
HttpSession
的创建和销毁。 - 常用方法:
sessionCreated()
、sessionDestroyed()
。 - 应用场景:统计在线用户数、跟踪用户会话状态。
HttpSessionAttributeListener
- 监听
HttpSession
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪用户会话中属性的变化。
Request 相关的监听器有哪些?
Request相关的监听器有两种:
ServletRequestListener
- 监听
ServletRequest
的创建和销毁。 - 常用方法:
requestInitialized()
、requestDestroyed()
。 - 应用场景:记录请求日志、统计请求处理时间。
ServletRequestAttributeListener
- 监听
ServletRequest
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪请求中属性的变化。
ServletContext 相关的监听器有哪些?
ServletContext相关的监听器有两种:
ServletContextListener
- 监听
ServletContext
的创建和销毁。 - 常用方法:
contextInitialized()
、contextDestroyed()
。 - 应用场景:在应用启动时初始化全局资源(如数据库连接池),在应用关闭时释放资源。
ServletContextAttributeListener
- 监听
ServletContext
中属性的添加、修改和删除。 - 常用方法:
attributeAdded()
、attributeRemoved()
、attributeReplaced()
。 - 应用场景:跟踪全局属性的变化。
Listener 如何实现?
要实现一个Listener,需要实现相应的接口,并重写其方法。例如,实现ServletContextListener
:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ExampleContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 应用启动时执行
System.out.println("Web应用初始化");
// 初始化全局资源,如数据库连接池
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 应用关闭时执行
System.out.println("Web应用销毁");
// 释放全局资源
}
}
如何配置 Listener?
可以通过注解(如@WebListener
)或在web.xml
中配置Listener:
<listener>
<listener-class>com.example.ExampleContextListener</listener-class>
</listener>
Servlet 是什么?
Java Servlet | ||
---|---|---|
运行位置 | Web 服务器或应用服务器,如 Tomcat 等。 | |
主要功能 | 处理请求 | 处理客户端(一般是浏览器)发送的 HTTP 请求。 |
生成响应 | 生成动态Web内容,如 HTML、JSON 等。 | |
业务逻辑 | 在服务器端执行业务逻辑,如访问数据库、调用其他服务等。 | |
会话管理 | 管理客户端与服务器之间的会话,如使用Session、Cookie。 | |
本质 | Java程序 |
Servlet 的作用有哪些
作用 | |
---|---|
生成动态 HTML 页面 | 生成动态的 HTML 页面。 |
提供 Web 服务 | 提供 RESTful API 或 SOAP 服务。 |
文件上传和下载 | 处理文件上传和下载请求。 |
表单处理 | 处理用户提交的表单数据。 |
Servlet 的工作流程是什么?
流程 | 备注 |
---|---|
Servlet 容器(例如Tomcat)产生一个 Servlet 实例。 | 在一个应用程序中,每种Servlet类型只能有一个实例。同时产生一个 ServletContext 对象、一个 ServletConfig 对象。 |
用户发送 HTTP 请求。 | |
Servlet容器调用 Servlet 实例的service 方法。 |
service 方法的参数 ServletRequest 对象和 ServletResponse 对象都是由 Servlet 容器封装好的,程序员可以直接使用这两个对象。 |
通过ServletRequest 获取 HTTP 请求。 |
ServletRequest 中封装了当前的 HTTP 请求。 |
通过ServletResponse 返回响应内容。 |
ServletResponse 表示当前用户的 HTTP 响应。 |
Servlet 的生命周期有哪些阶段
阶段 | 生命周期 | 备注 |
---|---|---|
阶段一 | 加载和实例化 | Web 容器加载 Servlet 类并创建其实例。 |
通常是在第一次收到请求时加载,但也可以通过配置在启动时加载。 | ||
阶段二 | 初始化 | 调用 init() 方法,完成 Servlet 的初始化工作。 |
开发者可以重写此方法,执行自定义的初始化逻辑(如加载配置文件、初始化数据库连接等)。 | ||
阶段三 | 处理请求 | 调用 service() 方法,处理客户端请求。 |
对于 HTTP 请求,通常会使用 HttpServlet 的子类,并重写 doGet() 、doPost() 等方法。 |
||
阶段四 | 销毁 | 调用 destroy() 方法,释放资源(如关闭数据库连接、清理缓存等)。 |
通常是在 Web 应用关闭或 Servlet 被移除时调用。 | ||
补充 | Servlet 的生命周期由 Web 容器(如 Tomcat)管理。 |
Servlet 的核心接口和类有哪些
13个核心接口和类 | 类型 | 所在 java 包 | 简介 |
---|---|---|---|
Servlet |
接口 | javax.servlet |
定义了 Servlet 的生命周期方法 |
void init(ServletConfig config) :初始化 Servlet。 |
|||
void service(ServletRequest req, ServletResponse res) :处理请求。 |
|||
void destroy() :销毁 Servlet。 |
|||
ServletConfig getServletConfig() :获取 Servlet 配置信息。 |
|||
String getServletInfo() :获取 Servlet 的描述信息。 |
|||
GenericServlet |
抽象类 | javax.servlet |
提供了 Servlet 接口的基本实现,简化了 Servlet 的开发。 |
开发者可以继承此类,并重写 service() 方法。 |
|||
HttpServlet |
类 | javax.servlet.http |
继承自 GenericServlet ,专门用于处理 HTTP 请求。 |
提供了对 HTTP 方法的支持(如 doGet() 、doPost() 、doPut() 、doDelete() 等)。 |
|||
开发者通常继承此类,并重写相应的方法。 | |||
ServletRequest |
接口 | javax.servlet |
|
HttpServletRequest |
接口 | javax.servlet.http |
|
ServletResponse |
接口 | javax.servlet |
|
HttpServletResponse |
接口 | javax.servlet.http |
|
ServletConfig |
接口 | 封装 Servlet 配置。 | |
Ser |