運行時動態新增 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()。
WEB-INF/lib/ 所有 JAR 類別交給 onStartup(Set<Class<?>>, ServletContext)。@HandlesTypes 篩選需處理的類別 (如掃描特定註解的類)。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+)。