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

Servlet 3.0 新特性深度解析 (四):ServletContext 動態註冊與檔案上傳支援

     編輯:J2EE

ServletContext 動態註冊 API

運行時動態新增 Servlet、Filter、Listener 及 URL 映射,無需重啟。主要方法:

  • addServlet(String name, Class<? extends Servlet> clazz)
  • addServlet(String name, Servlet servlet)
  • addServlet(String name, String className)
  • createServlet(Class<T> clazz):實例化後可自定義配置再註冊。
  • getServletRegistration(name) / getServletRegistrations():取得註冊物件動態增減映射。

調用時機:ServletContextListener.contextInitialized() 或 ServletContainerInitializer.onStartup()。

ServletContainerInitializer 機制

  • 容器啟動時透過 JAR Service API (META-INF/services/javax.servlet.ServletContainerInitializer) 發現實作類。
  • 將 WEB-INF/lib/ 所有 JAR 類別交給 onStartup(Set<Class<?>>, ServletContext)。
  • 配合 @HandlesTypes 篩選需處理的類別 (如掃描特定註解的類)。

HttpServletRequest 檔案上傳支援 (告別 Commons FileUpload)

核心 API

  • Part getPart(String name):取得指定名稱上傳檔案。
  • Collection<Part> getParts():取得所有上傳檔案。

Part 介面提供 write(String path)、delete()、getSize()、getContentType() 等便利方法。

使用範例

@WebServlet("/upload")
@MultipartConfig(
    location="/tmp/uploads",      // 暫存目錄
    maxFileSize=1024*1024*10,     // 10MB
    maxRequestSize=1024*1024*50,  // 50MB
    fileSizeThreshold=1024*1024   // 1MB 以上寫入磁碟
)
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        Part photo = req.getPart("photo");
        photo.write("photo.jpg"); // 儲存至 @MultipartConfig location 或絕對路徑
        // 或一行:req.getPart("photo").write("/var/www/uploads/photo.jpg");
        resp.getWriter().println("上傳成功");
    }
}

注意

請求 `Content-Type` 必須為 `multipart/form-data`,否則拋出例外。

總結

Servlet 3.0 透過動態註冊 API、標準化檔案上傳、非同步處理與可插性,大幅簡化 Web 開發,並將深遠影響下一代 MVC 框架 (如 Spring MVC 3.1+、Struts 2.3+)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved