Servlet 配置
在 Servlet 環境中,您可以選擇以程式設計方式配置 Servlet 容器,作為 web.xml 檔案的替代或組合。以下示例註冊了一個 DispatcherServlet
-
Java
-
Kotlin
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
import org.springframework.web.WebApplicationInitializer
class MyWebApplicationInitializer : WebApplicationInitializer {
override fun onStartup(container: ServletContext) {
val appContext = XmlWebApplicationContext()
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
val registration = container.addServlet("dispatcher", DispatcherServlet(appContext))
registration.setLoadOnStartup(1)
registration.addMapping("/")
}
}
WebApplicationInitializer 是 Spring MVC 提供的一個介面,它確保您的實現被檢測到並自動用於初始化任何 Servlet 3 容器。WebApplicationInitializer 的一個抽象基類實現名為 AbstractDispatcherServletInitializer,它透過覆蓋方法來指定 servlet 對映和 DispatcherServlet 配置的位置,從而使註冊 DispatcherServlet 變得更加容易。
對於使用基於 Java 的 Spring 配置的應用程式,建議使用此方法,如以下示例所示
-
Java
-
Kotlin
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array<Class<*>>? {
return null
}
override fun getServletConfigClasses(): Array<Class<*>>? {
return arrayOf(MyWebConfig::class.java)
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
}
如果您使用基於 XML 的 Spring 配置,則應直接擴充套件 AbstractDispatcherServletInitializer,如以下示例所示
-
Java
-
Kotlin
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
override fun createRootApplicationContext(): WebApplicationContext? {
return null
}
override fun createServletApplicationContext(): WebApplicationContext {
return XmlWebApplicationContext().apply {
setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
}
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
}
AbstractDispatcherServletInitializer 還提供了一種方便的方式來新增 Filter 例項,並讓它們自動對映到 DispatcherServlet,如以下示例所示
-
Java
-
Kotlin
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
// ...
override fun getServletFilters(): Array<Filter> {
return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
}
}
每個過濾器都使用基於其具體型別的預設名稱新增,並自動對映到 DispatcherServlet。
AbstractDispatcherServletInitializer 的受保護方法 isAsyncSupported 提供了一個單一的位置來在 DispatcherServlet 和所有對映到它的過濾器上啟用非同步支援。預設情況下,此標誌設定為 true。
最後,如果您需要進一步自定義 DispatcherServlet 本身,可以重寫 createDispatcherServlet 方法。