首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Servlet 3.0 新特性深度解析 (一):非同步處理與註解支援

     編輯:J2EE

三大核心特性

  1. 非同步處理支援:Servlet 執行緒無需阻塞等待業務完成,可委派耗時操作給非同步執行緒,主執行緒立即歸還容器,大幅提升併發吞吐。
  2. 註解支援:@WebServlet、@WebFilter、@WebListener、@WebInitParam、@MultipartConfig 等,使 web.xml 成為可選。
  3. 可插性支援:透過 web-fragment.xml (放在 JAR 的 META-INF/) 實現模組化擴充,無需修改主應用,類似 Struts2 外掛機制。

非同步處理詳解

傳統模式痛點

Servlet 執行緒完整持有請求:預處理 → **阻塞等待業務 (DB/RPC)** → 產生回應 → 結束。高併發下執行緒耗盡。

Servlet 3.0 非同步模式

@WebServlet(urlPatterns="/async", asyncSupported=true)
public class AsyncDemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("進入 Servlet:" + new Date()); out.flush();

        // 1. 啟動非同步上下文
        AsyncContext ctx = req.startAsync();
        // 2. 委派給獨立執行緒處理業務
        new Thread(new AsyncExecutor(ctx)).start();

        out.println("Servlet 主執行緒結束:" + new Date()); out.flush();
    }
}

class AsyncExecutor implements Runnable {
    private final AsyncContext ctx;
    AsyncExecutor(AsyncContext ctx) { this.ctx = ctx; }
    @Override public void run() {
        try {
            Thread.sleep(10000); // 模擬耗時業務
            PrintWriter out = ctx.getResponse().getWriter();
            out.println("業務完成:" + new Date()); out.flush();
            ctx.complete(); // 結束非同步處理
        } catch (Exception e) { e.printStackTrace(); }
    }
}

關鍵 API

  • req.startAsync():建立 AsyncContext,持有 Request/Response 參考。
  • asyncSupported=true:在 @WebServlet 或 web.xml <async-supported>true</async-supported> 啟用。
  • AsyncListener:監聽四大事件 onStartAsync/onError/onTimeout/onComplete,用於資源清理或日誌。

註解支援詳解

web.xml 根元素 <web-app metadata-complete="true"> 可關閉掃描 (預設 false,即啟用註解掃描)。

@WebServlet 常用屬性

屬性對應 web.xml說明
name<servlet-name>預設為完整類別名
urlPatterns / value<url-pattern>URL 映射,二選一
loadOnStartup<load-on-startup>啟動順序
initParams<init-param>初始化參數陣列
asyncSupported<async-supported>啟用非同步

範例

@WebServlet(
    urlPatterns={"/simple"},
    asyncSupported=true,
    loadOnStartup=-1,
    name="SimpleServlet",
    displayName="ss",
    initParams={@WebInitParam(name="username", value="tom")}
)
public class SimpleServlet extends HttpServlet { ... }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved