Servlet详解

简介: Servlet 是运行在服务端的小程序,用于处理客户端请求并返回响应,是构建动态Web应用的基础。其生命周期包括加载初始化(`init()`)、请求处理(`service()`)和销毁(`destroy()`)。Servlet默认懒加载且单例,需注意线程安全。此外,Servlet生态还包括过滤器(Filter)、监听器(Listener)、异步处理及文件上传下载等功能,支持更复杂的应用场景。过滤器可预处理请求和响应,监听器监控对象生命周期事件,异步处理提升性能,文件上传下载提供便捷的API支持。

概念

  • Servlet是运行在服务端的小程序(Server Applet),可以处理客户端的请求并返回响应,主要用于构建动态的Web应用,是SpringMVC的基础。

生命周期

加载和初始化

  • 懒加载(默认在客户端第一次请求加载到容器中),通过反射实例化,并调用init(),且init()只能被调用一次,因此每个Servlet是单例的,需注意线程安全。

请求处理

  • Servlet 容器收到url请求后,路由到对应的Servlet,调用service()方法处理客户端请求,并返回响应。
  • 每次服务器收到一个请求时,Servlet 容器都会分配一个线程并调用service()方法,根据请求类型,执行对应的方法,也会存在线程安全问题,避免使用全局变量、非同步数据结构等。

销毁

  • destroy()只会被调用一次,当容器被正常关闭时,释放一些使用了的资源。
  • 异常终止情况,不会调用destroy()。

流程图

其他应用

1. 过滤器(Filter)

1.1 作用

  • 对请求和响应进行预处理和后处理。
  • 典型应用场景:
    • 权限验证。
    • 请求参数编码处理。
    • 日志记录。
    • 防止 XSS 和 SQL 注入。

1.2 工作流程

  • 过滤器在 Servlet 执行之前运行,可以拦截并修改请求。
  • 过滤器在 Servlet 执行之后运行,可以修改响应。

1.3 关键接口

javax.servlet.Filter 接口,核心方法:

  1. init(FilterConfig filterConfig):在容器启动时初始化过滤器。
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    • 进行请求/响应的过滤处理。
    • 调用 chain.doFilter() 将请求传递到下一个过滤器或目标 Servlet。
  1. destroy():在容器关闭时释放资源。

1.4 示例

过滤器实现

@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("请求到达过滤器");
        chain.doFilter(request, response); // 将请求传递到下一个过滤器或 Servlet
        System.out.println("响应从过滤器返回");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

2. 监听器(Listener)

2.1 作用

  • 监听 Web 应用中对象(如请求、会话、上下文)生命周期事件或属性变化。
  • 典型应用场景:
    • 统计在线人数。
    • 初始化全局资源。
    • 监控会话销毁以释放资源。

2.2 关键接口

Servlet 提供了多种监听器接口:

  1. 应用上下文监听器
    • ServletContextListener:监听应用启动和销毁事件。
  1. 会话监听器
    • HttpSessionListener:监听会话创建和销毁事件。
    • HttpSessionAttributeListener:监听会话属性变化。
  1. 请求监听器
    • ServletRequestListener:监听请求创建和销毁事件。
    • ServletRequestAttributeListener:监听请求属性变化。

2.3 示例

在线人数统计

@WebListener
public class OnlineUserListener implements HttpSessionListener {
    private static int onlineUsers = 0;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineUsers++;
        System.out.println("用户上线,当前在线人数:" + onlineUsers);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        onlineUsers--;
        System.out.println("用户下线,当前在线人数:" + onlineUsers);
    }
}

3. 异步处理

3.1 作用

  • Servlet 3.0 引入异步处理,用于提高性能和响应速度。
  • 异步处理允许在 Servlet 请求线程结束后继续处理任务,释放容器线程资源。

3.2 核心方法

  1. 在 Servlet 中启动异步支持:
@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
}
  1. 异步请求处理逻辑:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    AsyncContext asyncContext = req.startAsync();
    asyncContext.start(() -> {
        try {
            Thread.sleep(2000); // 模拟耗时操作
            asyncContext.getResponse().getWriter().write("异步请求完成");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            asyncContext.complete(); // 完成异步处理
        }
    });
}

4. 文件上传与下载

4.1 文件上传

配置文件上传支持

Servlet 3.0 引入了对文件上传的直接支持,通过 @MultipartConfig 注解。

示例

@WebServlet("/upload")
@MultipartConfig(location = "/tmp", fileSizeThreshold = 1024 * 1024, maxFileSize = 5 * 1024 * 1024)
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part filePart = req.getPart("file"); // 获取上传文件的部分
        String fileName = filePart.getSubmittedFileName();
        filePart.write("/uploads/" + fileName); // 保存文件
        resp.getWriter().write("文件上传成功:" + fileName);
    }
}

4.2 文件下载

示例

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String fileName = "example.txt";
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        try (InputStream in = new FileInputStream("/uploads/" + fileName);
             OutputStream out = resp.getOutputStream()) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
        }
    }
}

目录
相关文章
|
8月前
|
物联网 异构计算 Python
麦橘超然上线魔搭社区,免费生图和训练,文末返图有奖
麦橘超然是麦橘制作的基于Flux.1的模型,可以生成高度摄影写实和富有光影感的图片,尤其擅长表现人物的脸部和肌肤细节。麦橘之前的作品麦橘写实是各大文生图开源站点最受欢迎的模型之一。
588 11
|
11月前
|
DataWorks 数据挖掘 关系型数据库
基于hologres搭建轻量OLAP分析平台解决方案评测
一文带你详细了解基于hologres搭建轻量OLAP分析平台解决方案的优与劣
878 10
|
8月前
|
负载均衡 Kubernetes 网络协议
注册中心如何选型?Eureka、Zookeeper、Nacos怎么选
这是小卷对分布式系统架构学习的第9篇文章,继续探讨注册中心的原理及选型。文章详细介绍了Eureka、Nacos的工作机制与特点,并对比了Eureka、Nacos、Consul和Zookeeper在一致性协议、健康检查、负载均衡等方面的差异。最后根据不同的应用场景给出了注册中心的选型建议,帮助读者理解如何选择最适合的注册中心。
655 100
|
8月前
|
Java 应用服务中间件 Apache
Tomcat详解
Tomcat是Apache开源的轻量级Java Servlet容器,支持多Service管理。每个Service包含多个Connector和一个Engine,负责处理网络请求与内部流程。核心组件包括连接器(Connector)和容器(Container),前者处理Socket连接及协议解析,后者加载和管理Servlet。架构中,Server为顶层容器,管理实例生命周期;Service连接外部请求与内部处理;Connector处理不同协议请求;Container下有Engine、Host、Context和Wrapper,分别负责请求分发、虚拟主机配置、Web应用处理和Servlet调用。
276 3
|
9月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1483 160
|
9月前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
3798 101
|
5月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
8月前
|
XML JSON Java
SpringMVC详解(全网最全)
### SpringMVC 简介 SpringMVC 是 Spring 框架中的一个模块,用于构建 Web 应用的 MVC 架构。它提供了简洁、优雅的方式来处理 HTTP 请求和响应,支持前后端分离,优化用户体验。 #### 起源与发展 1. **三层架构**:早期的 Servlet 只能处理单一请求,耦合度高,复用性差,整页刷新影响用户体验。 2. **MVC 模式**:部分解耦业务逻辑与视图层,但后端仍负责 View 层,难以应对高并发。 3. **前后端分离**:通过异步调用实现解耦,增强复用性和交互体验。
1454 5
|
存储 安全 前端开发
阿里云服务器计算型实例规格特点、适用场景、收费标准和活动价格参考
阿里云服务器计算型实例规格有哪些?收费标准有多大区别?阿里云服务器计算型实例规格有X86计算和ARM计算两种架构,每种架构都包含了不同类型的计算型实例,所以相同cpu和内存配置的计算型实例云服务器,收费价格标准也大不相同,下面小编为大家汇总一下哪些实例属于计算型实例规格,它们的最新收费价格标准又是怎样的,以供参考选择。
阿里云服务器计算型实例规格特点、适用场景、收费标准和活动价格参考
|
8月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
99 20