【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、Servlet 3.0:JavaWeb 的“新纪元”

Servlet 3.0 在 2009 年发布,是 JavaWeb 开发的“新纪元”。它引入了两大新特性:异步处理 和 注解配置。异步处理让 Servlet 能“一心多用”,注解配置让 Servlet 能“轻装上阵”。

1. 异步处理:Servlet 的“一心多用”

异步处理是 Servlet 3.0 的“杀手锏”,它让 Servlet 能“一心多用”,处理多个请求。异步处理的核心是 AsyncContext,它能让 Servlet 把请求“挂起”,等处理完了再“唤醒”。

Java Code

@WebServlet(urlPatterns = "/async", asyncSupported = true)

public class AsyncServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        AsyncContext asyncContext = request.startAsync();

        asyncContext.start(() -> {

            try {

                Thread.sleep(5000); // 模拟耗时操作

                asyncContext.getResponse().getWriter().write("异步处理完成!");

            } catch (Exception e) {

                e.printStackTrace();

            } finally {

                asyncContext.complete();

            }

        });

    }

}

2. 注解配置:Servlet 的“轻装上阵”

注解配置是 Servlet 3.0 的“轻装上阵”,它让开发者能用注解配置 Servlet,不用再写 web.xml 了。注解配置的核心是 @WebServlet,它能定义 Servlet 的 URL 模式、初始化参数啥的。

Java Code

@WebServlet(name = "MyServlet", urlPatterns = "/myServlet", initParams = {

    @WebInitParam(name = "param1", value = "value1"),

    @WebInitParam(name = "param2", value = "value2")

})

public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        String param1 = getInitParameter("param1");

        String param2 = getInitParameter("param2");

        response.getWriter().write("param1: " + param1 + ", param2: " + param2);

    }

}

二、异步处理的“实战演练”

异步处理虽然“高大上”,但用起来得“小心”。异步处理的核心是 AsyncContext,它能让 Servlet 把请求“挂起”,等处理完了再“唤醒”。

1. 启动异步处理

异步处理得用 request.startAsync() 启动,启动后 Servlet 就能“一心多用”了。

Java Code

AsyncContext asyncContext = request.startAsync();

2. 处理异步请求

异步处理得用 asyncContext.start() 处理,处理完后得用 asyncContext.complete() 结束。

Java Code

asyncContext.start(() -> {

    try {

        // 模拟耗时操作

        Thread.sleep(5000);

        asyncContext.getResponse().getWriter().write("异步处理完成!");

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        asyncContext.complete();

    }

});

3. 设置超时时间

异步处理得设置超时时间,防止请求“卡死”。超时时间得用 asyncContext.setTimeout() 设置。

Java Code

asyncContext.setTimeout(10000); // 10秒

三、注解配置的“实战演练”

注解配置虽然“轻装上阵”,但用起来得“灵活”。注解配置的核心是 @WebServlet,它能定义 Servlet 的 URL 模式、初始化参数啥的。

1. 定义 Servlet

Servlet 得用 @WebServlet 定义,定义后 Servlet 就能“轻装上阵”了。

Java Code

@WebServlet(name = "MyServlet", urlPatterns = "/myServlet")

public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        response.getWriter().write("Hello, World!");

    }

}

2. 定义初始化参数

Servlet 的初始化参数得用 @WebInitParam 定义,定义后 Servlet 就能“灵活配置”了。

Java Code

@WebServlet(name = "MyServlet", urlPatterns = "/myServlet", initParams = {

    @WebInitParam(name = "param1", value = "value1"),

    @WebInitParam(name = "param2", value = "value2")

})

public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        String param1 = getInitParameter("param1");

        String param2 = getInitParameter("param2");

        response.getWriter().write("param1: " + param1 + ", param2: " + param2);

    }

}

3. 定义过滤器

过滤器得用 @WebFilter 定义,定义后过滤器就能“轻装上阵”了。

Java Code

@WebFilter(urlPatterns = "/*")

public class MyFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        throws IOException, ServletException {

        // 过滤逻辑

        chain.doFilter(request, response);

    }

}

四、Servlet 3.0 的“历史”:从 Servlet 2.5 到 Servlet 4.0

Servlet 3.0 从 Servlet 2.5 开始就有了,虽然现在 Servlet 4.0 已经“普及”了,但 Servlet 3.0 的“核心功能”依然没变。

1. Servlet 2.5:初代“老黄牛”

Servlet 2.5 在 2005 年发布,是 Servlet 的“初代老黄牛”。虽然功能简单,但已经能满足大部分开发需求了。

2. Servlet 3.0:引入异步处理与注解配置

Servlet 3.0 在 2009 年发布,引入了异步处理与注解配置,让 Servlet 的“玩法”更加丰富。

3. Servlet 4.0:支持 HTTP/2

Servlet 4.0 在 2017 年发布,支持 HTTP/2[1],让 Servlet 的性能更上一层楼。HTTP/2 的引入,让 Servlet 的“玩法”更加高效。

五、Servlet 3.0 的“骚操作”

1. 异步处理的“超时处理”

异步处理得设置超时时间,防止请求“卡死”。超时时间得用 asyncContext.setTimeout() 设置,超时后得用 asyncContext.complete() 结束。

Java Code

asyncContext.setTimeout(10000); // 10秒

asyncContext.addListener(new AsyncListener() {

    public void onTimeout(AsyncEvent event) throws IOException {

        event.getAsyncContext().getResponse().getWriter().write("请求超时!");

        event.getAsyncContext().complete();

    }

});

2. 注解配置的“多 URL 模式”

Servlet 的 URL 模式能定义多个,用 urlPatterns 数组定义。

Java Code

@WebServlet(urlPatterns = {"/myServlet", "/myServlet2"})

public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

        response.getWriter().write("Hello, World!");

    }

}

3. 注解配置的“过滤器链”

过滤器能定义多个,用 @WebFilter 定义,过滤器链的顺序得根据类名的字母顺序决定。

Java Code

@WebFilter(urlPatterns = "/*")

public class MyFilter1 implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        throws IOException, ServletException {

        // 过滤逻辑

        chain.doFilter(request, response);

    }

}

@WebFilter(urlPatterns = "/*")

public class MyFilter2 implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

        throws IOException, ServletException {

        // 过滤逻辑

        chain.doFilter(request, response);

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子电气架构 --- 汽车电子硬件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

使用 Homebrew 安装 OpenJDK 并配置环境变量

在 macOS 上使用 Homebrew 安装 OpenJDK 是一种简单而高效的方式。本文将使用 Homebrew 安装 OpenJDK&#xff0c;并设置环境变量以便 Java 能够正确运行。 1. 安装 Homebrew 首先&#xff0c;确保你的 macOS 系统已经安装了 Homebrew。如果没有安装&#xff0c;可以通过以下…

Java集合简单理解

Java 的集合框架&#xff08;Java Collections Framework, JCF&#xff09;是 Java 中用于存储和操作数据结构的核心库&#xff0c;提供了丰富的接口和实现类&#xff0c;用于处理不同类型的集合数据。以下是详细的介绍&#xff1a; 一、集合框架的体系结构 Java 集合主要分为…

群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)

摘要 旗鱼优化算法&#xff08;Sailfish Optimizer, SFO&#xff09;是一种模拟旗鱼&#xff08;Sailfish&#xff09;和沙丁鱼&#xff08;Sardine&#xff09;之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为&#xff0c;以及沙丁鱼群的逃逸与…

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

蓝桥与力扣刷题(蓝桥 星期计算)

题目&#xff1a;已知今天是星期六&#xff0c;请问 20^22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日。 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&#xff1…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

小程序网络大文件缓存方案

分享一个小程序网络大图加载慢的解决方案 用到的相关api getSavedFileList 获取已保存的文件列表&#xff1b;getStorageSync 获取本地缓存&#xff1b;downloadFile 下载网络图片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 将数据储存到小程序本地缓存&…

软考系统架构师 — 3 操作系统

目录 3.1 考点分析 3.1 操作系统概述 3.1.1 操作系统的功能 3.1.2 操作系统的分类 3.1.3 嵌入式操作系统主要特点 3.2 进程 3.2.1 进程的组成和状态 3.2.2 前趋图与进程资源图&#xff08;重点&#xff09; 3.2.3 进程同步与互斥 3.2.4 进程调度 3.2.5 死锁 3.3 线…

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…

MySQL 在 CentOS 7 上安装的步骤指南

目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动 MySQL 服务 5. 获取临时 Root 密码 6. 登录 MySQL 7. 更改 Root 密码 8. 设置 MySQL 开机自启动 9. 配置 MySQL 编码 10. 重启 MySQL 配置生效 11. 常见问题解决 1. 卸载不需要的环境 如果…

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…

【NLP】 5. Word Analogy Task(词类比任务)与 Intrinsic Metric(内在度量)

Word Analogy Task&#xff08;词类比任务&#xff09; 定义&#xff1a;Word Analogy Task 是用于评估词向量质量的内在指标&#xff08;Intrinsic Metric&#xff09;。该任务基于这样的假设&#xff1a;如果词向量能够捕捉单词之间的语义关系&#xff0c;那么这些关系应该能…

矩阵幂(矩阵k次幂)

矩阵幂 #include<stdio.h> //矩阵乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…

信火一体作战模式运用特点分析及对一体化防空反导能力建设的启示

文章目录 内容摘要1. 引言2. 信火一体作战模式在现代战争中的新内涵和特征2.1 充当火力和信息要素的作战单元种类更加丰富2.2 信息利用更加凸显异构平台间的数据共享和情报融合2.3 作战环节上更加强调指挥决策的敏捷性和智能化3. 增强防空反导能力的举措建议3.1 强化各类作战单…