傳統 web.xml 需手動註冊第三方框架(如 Spring MVC、Wicket),導致檔案龐大難維護。Web 片段 將 web.xml 邏輯分段,每個框架自行定義所需 Servlet、監聽器等:
<web-fragment>
<servlet><servlet-name>myFrameworkServlet</servlet-name>...</servlet>
<listener><listener-class>myFramework.myFrameworkListener</listener-class></listener>
</web-fragment>
web-fragment.xml 置於框架 JAR 的 META-INF。web.xml 的 <metadata-complete> 控制容器是否掃描片段與註解。
Servlet 3.0 支援絕對排序 (<absolute-ordering> 在 web.xml) 與相對排序 (<ordering> 在 web-fragment.xml),決定 Servlet/監聽器/過濾器調用順序。
新介面 ServletContainerInitializer 允許框架在容器啟動時程式化註冊元件:
@HandlesTypes(AnnotationA.class)
public class AServletContainerInitializer implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> c, ServletContext ctx) {
ServletRegistration reg = ctx.addServlet("AServlet", "com.foo.AServlet");
reg.addMapping("/foo");
}
}
容器透過 JAR 服務 API 發現實作,@HandlesTypes 指定處理的註解類型,WEB-INF/lib 下符合條件的類別將傳入初始化器。