HttpServlet详解

server/2025/2/23 0:52:30/
http://www.w3.org/2000/svg" style="display: none;">

HttpServlet_0">HttpServlet详解

HttpServlet_1">一,什么是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_13">二,关于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只会在首次请求时被初始化)
<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方法
import javax.servlet.*;
import java.io.IOException;
public class LoggingFilter implements Filter{@Overridepublic 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配置
<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>
  • 使用注解
@WebFilter("/*")
Public class LoggingFilter implements Filter{...}
3.2 事件监听器

Servlet事件监听器 允许你在特定的事件发生时执行代码。这些事件包括 SevletContext, HttpSessionServletRequest的创建,销毁,和属性的变化等。通过实现响应的监听器接口,就可以监听并且响应这些事件

3.2.1 如何使用监听器
  1. 创建监听器类
    创建一个实现了响应监听器接口的类,如,如果你想监听会话的创建,可以实现HttpSessionListener接口:
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配置
<listener><listener-class>com.example.SessionCounterListener</listener-class>
<listener>
  • 注解
@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即可;

http://www.ppmy.cn/server/169988.html

相关文章

AR技术在电商行业的应用有哪些?

AR&#xff08;增强现实&#xff09;技术在电商行业的应用日益广泛&#xff0c;尤其在商品试用场景中&#xff0c;通过虚实结合的方式显著提升了用户体验与购买决策效率。 数据驱动的效果评估 转化率提升&#xff1a;使用AR试用的电商平台平均转化率提升25%-40%&#xff0c;用…

Selenium实战案例1:论文pdf自动下载

在上一篇文章中&#xff0c;我们介绍了Selenium的基础用法和一些常见技巧。今天&#xff0c;我们将通过中国科学&#xff1a;信息科学网站内当前目录论文下载这一实战案例来进一步展示Selenium的web自动化流程。 目录 中国科学&#xff1a;信息科学当期目录论文下载 1.网页内…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

嵌入式0xDEADBEEF

在嵌入式系统中&#xff0c;0xDEADBEEF 是一个常见的“魔数”&#xff08;magic number&#xff09;&#xff0c;通常用于调试和内存管理。它的含义和用途如下&#xff1a; 1. 调试用途 未初始化内存的标记&#xff1a;在调试时&#xff0c;0xDEADBEEF 常用于标记未初始化或已…

腾讯云DeepSeek大模型应用搭建指南

&#x1f4cd;2月8日&#xff0c;腾讯云宣布上线DeepSeek-R1及V3原版模型API接口&#xff0c;通过强大的公有云服务&#xff0c;腾讯云可以为用户提供稳定优质的服务。同时&#xff0c;腾讯云旗下大模型知识应用开发平台知识引擎也接入了DeepSeek-R1及V3这两款模型&#xff0c;…

docker 和 Quay.io的关系

Docker 和 Quay.io 存在紧密的关联,它们在容器技术生态系统中扮演着不同但相互协作的角色,下面从多个方面为你详细介绍它们的关系: 概念层面 Docker:是一个用于开发、部署和运行应用程序的开源平台,基于容器化技术。它允许开发者将应用及其依赖项打包到一个独立的容器中,…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例&#xff1a;调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ&#xff1f;如何在 Node 项目中集成 RabbitMQ&#xff1f; 一、 不用 await 发送邮件 在实际开发之前&#xff0c;不妨先思考下&#xff0c;我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…