JSR-340 是 Java 社区进程(Java Community Process, JCP)中的一项规范请求,全称为:
Java™ Servlet 3.1 Specification
(Java Servlet 3.1 规范)
它于 2013 年作为 Java EE 7 的一部分正式发布,是 Servlet 技术的重要演进版本,旨在提升 Web 应用的性能、可扩展性和异步处理能力。
一、核心目标
JSR-340 在 Servlet 3.0(JSR-315)基础上,主要聚焦于:
- 支持非阻塞 I/O(Non-blocking I/O)
- 增强安全性
- 与 Java EE 7 整体架构对齐(如与 WebSocket、JSON-P 等协同)
- 改进协议和 API 的清晰度
二、主要新特性
1. 非阻塞 I/O(Non-blocking I/O)支持
这是 JSR-340 最重要的新增功能,适用于高并发场景(如长连接、实时通信)。
-
新增接口:
ReadListener:用于异步读取请求数据WriteListener:用于异步写入响应数据
-
关键方法:
javaServletInputStream.setReadListener(ReadListener listener); ServletOutputStream.setWriteListener(WriteListener listener); -
允许在不阻塞线程的情况下处理大量并发连接(配合 NIO 实现)。
✅ 适用场景:聊天服务器、实时推送、大文件上传/下载等。
2. 协议升级机制(Protocol Upgrade)
支持将 HTTP 连接升级为其他协议(如 WebSocket),为后续协议扩展提供标准入口。
- 新增
HttpUpgradeHandler接口 - 通过
HttpServletRequest.upgrade(Class<? extends HttpUpgradeHandler>)触发升级
⚠️ 注意:虽然 JSR-340 提供了升级机制,但 WebSocket 的完整实现由 JSR-356 定义。
3. 安全增强
- 明确要求容器支持 HTTPS 安全约束
- 改进了会话固定攻击(Session Fixation)的防御建议
4. API 澄清与小改进
- 修正 Servlet 3.0 中模糊或不一致的行为
- 明确
ServletContext.getVirtualServerName()等方法语义 - 支持更严格的 MIME 类型处理
三、与 Java EE 7 的关系
| 技术 | JSR 编号 | 是否包含在 Java EE 7 Web Profile |
|---|---|---|
| Servlet 3.1 | JSR-340 | ✅ 是 |
| JSP 2.3 | JSR-245 | ✅ |
| JSF 2.2 | JSR-344 | ✅ |
| JAX-RS 2.0 | JSR-339 | ✅ |
| WebSocket 1.1 | JSR-356 | ✅ |
所有主流 Java EE 7 应用服务器(如 WildFly、WebLogic 12c、WebSphere Liberty、Tomcat 8+)都实现了 JSR-340。
四、典型使用示例:非阻塞读取
java
@WebServlet(urlPatterns = "/async-io", asyncSupported = true)
public class AsyncIOServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
ServletInputStream input = req.getInputStream();
input.setReadListener(new ReadListener() {
@Override
public void onDataAvailable() throws IOException {
// 数据可读时回调(非阻塞)
byte[] buffer = new byte[1024];
int len;
while (input.isReady() && (len = input.read(buffer)) != -1) {
// 处理数据
}
}
@Override
public void onAllDataRead() {
// 所有数据读完
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
});
}
}
五、常见误区澄清
-
❌ "JSR-340 引入了 WebSocket"
→ 错!WebSocket 由 JSR-356 定义。JSR-340 只提供了底层的 协议升级机制。
-
❌ "非阻塞 I/O 自动提升性能"
→ 需要开发者主动使用
ReadListener/WriteListener,且依赖容器底层 NIO 实现(如 Tomcat 的 NIO connector)。 -
✅ "Servlet 3.1 向下兼容"
→ 所有 Servlet 3.0 或更早的应用无需修改即可运行。
六、总结
| 项目 | 内容 |
|---|---|
| JSR 编号 | 340 |
| 规范名称 | Java Servlet 3.1 Specification |
| 发布时间 | 2013 年(随 Java EE 7) |
| 核心贡献 | 非阻塞 I/O、协议升级、安全增强 |
| 实际影响 | 为高并发 Web 应用(如实时系统)提供标准异步 I/O 支持 |
💡 如果你在开发需要处理数万并发连接的 Java Web 应用(如 IM、IoT 网关),Servlet 3.1 的非阻塞 I/O 是关键基础设施之一。
官方文档:https://jakarta.ee/specifications/servlet/(注:Java EE 已移交 Eclipse 基金会,更名为 Jakarta EE,Servlet 3.1 对应 Jakarta Servlet 3.1)