当前位置: 首页 > news >正文

Servlet详解

概念

  • 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("请求到达过滤器");chain.doFilter(request, response); // 将请求传递到下一个过滤器或 ServletSystem.out.println("响应从过滤器返回");}@Overridepublic 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;@Overridepublic void sessionCreated(HttpSessionEvent se) {onlineUsers++;System.out.println("用户上线,当前在线人数:" + onlineUsers);}@Overridepublic 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 {@Overrideprotected 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 {@Overrideprotected 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);}}}
}


http://www.mrgr.cn/news/82895.html

相关文章:

  • HTML5 波动动画(Pulse Animation)详解
  • 阿里云 Pod介绍
  • (leetcode算法题)137. 只出现一次的数字 II
  • 【Linux】函数
  • vulkanscenegraph显示倾斜模型(2)-参数解析与环境变量
  • 【渗透测试术语总结】
  • 4.7 数据库:单行子查询和多行子查询
  • python学习笔记—14—函数
  • 【HarmonyOS-ArkTS语言】计算器的实现【合集】
  • 【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
  • MyBatis深入了解
  • 【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
  • 机器学习基础-线性回归和逻辑回归
  • 机器学习基础-卷积的计算
  • 计算机网络与服务器
  • unity学习8:unity的基础操作 和对应shortcut
  • Vue 按键生成多个表单
  • 【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
  • 现代密码学期末重点(备考ing)
  • 常见加密算法附JAVA代码案例
  • 【Javascript Day1】javascript基础
  • 《数据结构》期末考试测试题【中】
  • 最好用的图文识别OCR -- PaddleOCR(1) 快速集成
  • 信息科技伦理与道德2:研究方法
  • 安卓cpu调度优化
  • 【C语言程序设计——选择结构程序设计】求一元二次方程的根(头歌实践教学平台习题)【合集】