HttpServlet详解
一,什么是HttpServlet?
1.1 概念
HttpServlet
是Java Servlet API
的一部分,它是一个抽象类,旨在简化基于HTTP协议的web
应用程序开发,通过扩展HttpServlet
类,开发者可以创建处理HTTP请求(如Get
,Post
等)的Servlet
;
1.2 来源
HttpServlet 是Java EE标准的一部分,由Sun Microsystem (现为Oracle Corparation)发起,并由Java社区过程维护。它是Java平台用于构建动态网站和web应用程序的核心技术之一;
1.3 作用
1.3.1 处理http请求 : HttpServlet子类可以通过覆盖doGet(),doPost(),doPut(),doDelete()
等方法来处理不同的Http请求;
1.3.2: 生成Http响应: 在这些方法中,开发者可以使用HttpServletRequest
和HttpServletResponse
对象来访问请求数据并且构造响应内容
1.3.3 生命周期管理: Servlet生命周期包括初始化(init),服务方法,以及销毁方法,这允许开发者执行必要的初始化和清理工作;
1.3.4 会话跟踪: 虽然不是直接功能,但是HttpServlet
可以和HttpSession
结合使用来实现用户会话管理,从而支持用户状态保持
***1.3.5 过滤器和监听器:***结合使用Servlet的过滤器和事件监听器,可以增强应用的功能,比如日志记录,权限检查等。
二,关于HttpServlet得生命周期
2.1 Sevlet的生命周期:
- 加载和实例化: web容器负责加载Servlet类并创建其实例
- 初始化(
init
方法): 一旦Sevlet实例被创建,容器就会调用init方法来执行任何必要的初始化工作 - 服务(
service
方法) : 这是处理客户端请求的核心部分。每当有请求到达时,容器就会调用service方法,并根据请求数据类型(GET
,POST
等)分发给相应的doGet
,doPost
等方法 - 销毁(
destory
方法) :当Servlet
不在需要时,容器将调用destory
方法来释放资源
2.2 Init方法何时被调用
init方法在HttpServlet
生命周期中是一个重要得组成部分,它用于初始化Servlet
。
启动时机:
- 首次请求时: 如果你的
Servlet
没有设置在Web
应用程序启动时立即加载,那么init方法将会在Servlet首次被请求时由Web
容器(比如Tomcat
)自动调用。这意味着,在第一个用户请求到达之前,Servelet
不会进行任何初始化工作;(这种模式被称为"懒加载",它延迟了Servlet
的初始化时间,减少了应用启动时的负载) - Web容器启动时: 如果你希望Servlet在应用程序启动就完成初始化,而不是等待第一个请求,可以在web.xml文件中通过
<load-on-startup>
元素指定这一点(这里的load-on-startup
标签值可以是任何正整数,数字越小表示优先级越高。如果设置为0或者不设置,则默认情况Servlet
只会在首次请求时被初始化)
xml
<servlet>
<servlet-name>sampleInitialServlet</servley-name>
<servlet-class>com.example.SampleInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
- 重启或者重新部署:每当
web
应用程序重启或者重新部署时,Servlet
也会经历同样的生命周期过程,包括调用init
方法进行初始化; (当你重新启动应用服务器或者重新部署应用的时候,所有已经存在的Servlet
实例都会被销毁,然后根据需求重新加载)
三, Servlet的过滤器和事件监听器
3.1 Servlet过滤器
Servlet过滤器是一个对象,可以拦截请求和响应,并对他们进行预处理或后处理。通过实现javax.servlet.Filter 接口,可以定义自己的过滤逻辑。过滤器非常适合用于跨切关注点(cross-cutting concerns
),如 日志记录,性能监控,认证和授权等
3.1.1 如何使用过滤器
- 创建过滤器,首先,需要创建一个实现了Filter接口的类,并且重写doFilter方法
java
import javax.servlet.*;
import java.io.IOException;
public class LoggingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig)throws ServletException{
// 初始化过滤器时调用
}
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
HttpServletRequest req=(HttpServletRequest)request;
//在处理请求之前执行操作
chain.doFilter(request,response); // 将请求传递给下一个过滤器或目标Sevlet
// 在处理完成请求之后操作
System.out.println("longging Respons");
}
@Override
public void destory(){// 摧毁过滤器时调用}
}
- 配置过滤器 过滤器需要在web.xml 中配置,或者如果使用的是注解,则可以直接在过滤器类上添加注解
- 使用web.xml配置
xml
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 使用注解
java
@WebFilter("/*")
Public class LoggingFilter implements Filter{...}
3.2 事件监听器
Servlet事件监听器 允许你在特定的事件发生时执行代码。这些事件包括 SevletContext
, HttpSession
和 ServletRequest
的创建,销毁,和属性的变化等。通过实现响应的监听器接口,就可以监听并且响应这些事件
3.2.1 如何使用监听器
- 创建监听器类
创建一个实现了响应监听器接口的类,如,如果你想监听会话的创建,可以实现HttpSessionListener
接口:
java
import javax.servlet.http.HttpSessionEvent;
import javax.sevlet.http.HttpSessionListener;
public class SessionCounterLister implements HttpSessionListener{
private static int totalActiveSession;
public static int getTotalActiveSessions(){
return totalActiveSessions;
}
@Override
public void sessionCreated(HttpSessionEvent se){
totalActiveSessions++;
System.out.println("Session Created: total active sessions:"+ totalActiveSessions );
}
@Override
public void sessionDestroyed(HttpSessionEvent se){
totalActiveSession--;
System.out.println("Session Destoryed: total active session:"+ totalActiveSessions);
}
}
- 配置监听器 同样需要在web.xml中配置或者使用注解
- 使用web.xml配置
xml
<listener>
<listener-class>com.example.SessionCounterListener</listener-class>
<listener>
- 注解
java
@WebListener
public class SessionCounterListener implements HttpSessionListener{...}
四, 过滤器和拦截器区别
虽然过滤器和拦截器都可以处理请求前后的逻辑,如权限校验,日志记录等,但是他们在实现机制,配置方式和应用场景上存在一些差异
4.1 实现机制
- 过滤器(
Filter
)- 是sevlet规范的一部分,基于javaEE 标准
- 需要实现
javax.servlet.Filter
接口,并且通常通过web.xml
文件或注解进行配置 - 可以在请求到达Servlet之前或者响应返回给客户端之前执行代码。
- 主要作用于请求的预处理和后处理,能直接访问
HttpServletRequest
和HttpServletResponse
对象
- 拦截器(
Interceptor
)- 主要存在于Spring框架中,是Spring MVC的一部分
- 需要实现
org.springframework.web.sevlet.HandlerInterceptor
接口 - 拦截器围绕这控制器(Controller)方法调用,可以由选择的在请求处理的不同阶段(如
preHandle
,postHandle
,afterCompletion
等)进行拦截 - 更适合处理业务逻辑层面上的操作,不如权限控制,事务管理等
4.2 应用场景
- 过滤器 更适合用于需要对所有进入应用的Http请求进行统一的处理场景。入 字符编码设置,日志记录,安全检查等。由于其工作在更底层的位置,所以它可以影响到整个web应用程序的所有请求。
- 拦截器则更适用于针对特定的Controller或者Handler方法进行处理的情况,特别是在Spring MVC环境中,它允许你根据不同的URL模式或者具体的handle方法来决定是否执行某些逻辑,从而提高更高的灵活性
4.3 使用便捷性
- 过滤器需要更多的配置工作,特别是当涉及到多个过滤器时,可能还需要考虑过滤器链的顺序问题
- 拦截器在Spring框架内使用起来相对更加直观,尤其是当你已经使用spring boot 这样的快速开发框架时,只需要简单的第一一个类并注册为Bean即可;