HTTP/2支持
Servlet 4.0的核心特性之一是原生支持HTTP/2协议。HTTP/2通过二进制分帧、多路复用、头部压缩等机制显著提升性能。服务器推送(Server Push)允许服务端主动向客户端推送资源,减少延迟。
实现HTTP/2需满足以下条件:
- 使用TLS 1.2或更高版本
- 部署支持ALPN(应用层协议协商)的Web服务器(如Tomcat 9+)
- 客户端浏览器需兼容HTTP/2
示例配置(Tomcat的server.xml):
XML
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="150" SSLEnabled="true">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
<SSLHostConfig protocols="TLSv1.2">
<Certificate certificateKeystoreFile="conf/keystore.jks"
type="RSA"/>
</SSLHostConfig>
</Connector>
异步处理增强
Servlet 4.0优化了异步处理模型,通过AsyncContext实现非阻塞IO操作。新增的HttpServletRequest#startAsync(ServletRequest, ServletResponse)方法允许复用请求/响应对象。
典型异步处理流程:
- 通过
request.startAsync()启动异步上下文 - 提交任务到线程池或CompletableFuture
- 在回调中调用
asyncContext.complete()或转发请求
示例代码片段:www.xuanshangmao.org
java
@WebServlet(urlPatterns="/async", asyncSupported=true)
public class AsyncServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext asyncCtx = req.startAsync();
CompletableFuture.runAsync(() -> {
// 长时间运行任务
asyncCtx.getResponse().getWriter().write("Async result");
asyncCtx.complete();
});
}
}
服务器推送API
通过PushBuilder接口实现服务器推送资源:
java
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
PushBuilder pushBuilder = req.newPushBuilder();
if (pushBuilder != null) {
pushBuilder.path("styles.css").push();
pushBuilder.path("app.js").push();
}
// 正常响应处理
}
其他改进
- 响应状态码常量:新增HTTP状态码常量如
HttpServletResponse.SC_EARLY_HINTS - Trailer字段支持:通过
HttpServletResponse#setTrailerFields设置响应尾部的元数据 - 更清晰的错误处理:改进的HTTP/2错误代码映射机制