HttpServlet详解

HttpServlet详解

一,什么是HttpServlet?

1.1 概念

HttpServletJava Servlet API 的一部分,它是一个抽象类,旨在简化基于HTTP协议的web应用程序开发,通过扩展HttpServlet类,开发者可以创建处理HTTP请求(如GetPost等)的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响应: 在这些方法中,开发者可以使用HttpServletRequestHttpServletResponse对象来访问请求数据并且构造响应内容
1.3.3 生命周期管理: Servlet生命周期包括初始化(init),服务方法,以及销毁方法,这允许开发者执行必要的初始化和清理工作;
1.3.4 会话跟踪: 虽然不是直接功能,但是HttpServlet可以和HttpSession结合使用来实现用户会话管理,从而支持用户状态保持

***1.3.5 过滤器和监听器:***结合使用Servlet的过滤器和事件监听器,可以增强应用的功能,比如日志记录,权限检查等。

二,关于HttpServlet得生命周期

2.1 Sevlet的生命周期:
  1. 加载和实例化: web容器负责加载Servlet类并创建其实例
  2. 初始化(init方法): 一旦Sevlet实例被创建,容器就会调用init方法来执行任何必要的初始化工作
  3. 服务(service方法) : 这是处理客户端请求的核心部分。每当有请求到达时,容器就会调用service方法,并根据请求数据类型(GETPOST等)分发给相应的doGetdoPost等方法
  4. 销毁(destory方法) :当Servlet不在需要时,容器将调用destory方法来释放资源
2.2 Init方法何时被调用

init方法在HttpServlet生命周期中是一个重要得组成部分,它用于初始化Servlet
启动时机:

  1. 首次请求时: 如果你的Servlet没有设置在Web应用程序启动时立即加载,那么init方法将会在Servlet首次被请求时由Web容器(比如Tomcat)自动调用。这意味着,在第一个用户请求到达之前,Servelet不会进行任何初始化工作;(这种模式被称为"懒加载",它延迟了Servlet的初始化时间,减少了应用启动时的负载)
  2. 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>
  1. 重启或者重新部署:每当web应用程序重启或者重新部署时,Servlet也会经历同样的生命周期过程,包括调用init方法进行初始化; (当你重新启动应用服务器或者重新部署应用的时候,所有已经存在的Servlet实例都会被销毁,然后根据需求重新加载)

三, Servlet的过滤器和事件监听器

3.1 Servlet过滤器

Servlet过滤器是一个对象,可以拦截请求和响应,并对他们进行预处理或后处理。通过实现javax.servlet.Filter 接口,可以定义自己的过滤逻辑。过滤器非常适合用于跨切关注点(cross-cutting concerns),如 日志记录,性能监控,认证和授权等

3.1.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(){// 摧毁过滤器时调用}
}
  1. 配置过滤器 过滤器需要在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, HttpSessionServletRequest的创建,销毁,和属性的变化等。通过实现响应的监听器接口,就可以监听并且响应这些事件

3.2.1 如何使用监听器
  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);
}
} 
  1. 配置监听器 同样需要在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之前或者响应返回给客户端之前执行代码。
    • 主要作用于请求的预处理和后处理,能直接访问HttpServletRequestHttpServletResponse对象
  • 拦截器(Interceptor
    • 主要存在于Spring框架中,是Spring MVC的一部分
    • 需要实现 org.springframework.web.sevlet.HandlerInterceptor接口
    • 拦截器围绕这控制器(Controller)方法调用,可以由选择的在请求处理的不同阶段(如 preHandlepostHandleafterCompletion等)进行拦截
    • 更适合处理业务逻辑层面上的操作,不如权限控制,事务管理等
4.2 应用场景
  • 过滤器 更适合用于需要对所有进入应用的Http请求进行统一的处理场景。入 字符编码设置,日志记录,安全检查等。由于其工作在更底层的位置,所以它可以影响到整个web应用程序的所有请求。
  • 拦截器则更适用于针对特定的Controller或者Handler方法进行处理的情况,特别是在Spring MVC环境中,它允许你根据不同的URL模式或者具体的handle方法来决定是否执行某些逻辑,从而提高更高的灵活性
4.3 使用便捷性
  • 过滤器需要更多的配置工作,特别是当涉及到多个过滤器时,可能还需要考虑过滤器链的顺序问题
  • 拦截器在Spring框架内使用起来相对更加直观,尤其是当你已经使用spring boot 这样的快速开发框架时,只需要简单的第一一个类并注册为Bean即可;
相关推荐
iOS技术狂热者9 小时前
多图超详细安装flutter&Android Studio开发环境,并配置插件
websocket·网络协议·tcp/ip·http·网络安全·https·udp
今夜有雨.9 小时前
HTTP---基础知识
服务器·网络·后端·网络协议·学习·tcp/ip·http
无名之逆15 小时前
hyperlane:Rust HTTP 服务器开发的不二之选
服务器·开发语言·前端·后端·安全·http·rust
。puppy19 小时前
HCIA—— 31 HTTP的报文、请求响应报文、方法、URI和URL
网络·网络协议·http
无职转生真好看19 小时前
HTTP和HTTPS区别
网络协议·http·https
秋名RG21 小时前
HTTP 1.0和2.0 有什么区别?
网络·网络协议·http
罗念笙21 小时前
HTTP1.0和2.0有什么区别?
网络协议·http
YiHanXii1 天前
Axios 相关的面试题
前端·http·vue·react
金丝猴也是猿1 天前
手机硬件检测详解:从版本信息到相机功能的全面指南
websocket·网络协议·tcp/ip·http·网络安全·https·udp
iOS技术狂热者1 天前
wireshark开启对https密文抓包
websocket·网络协议·tcp/ip·http·网络安全·https·udp