在Servlet 3.0以上的環(huán)境下,你可以通過編程的方式來配置Servlet容器了。你可以完全放棄web.xml
,也可以兩種配置方式同時使用。以下是一個注冊DispatcherServlet
的例子:
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("/");
}
}
Spring MVC提供了一個WebApplicationInitializer
接口,實現(xiàn)這個接口能保證你的配置能自動被檢測到并應用于Servlet 3容器的初始化中。WebApplicationInitializer
有一個實現(xiàn),是一個抽象的基類,名字叫AbstractDispatcherServletInitializer
。有了它,要配置DispatcherServlet
將變得更簡單,你只需要覆寫相應的方法,在其中提供servlet映射、DispatcherServlet
所需配置的位置即可:
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[] { "/" };
}
}
以上的例子適用于使用基于Java配置的Spring應用。如果你使用的是基于XML的Spring配置方式,那么請直接繼承AbstractDispatcherServletInitializer
這個類:
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[] { "/" };
}
}
AbstractDispatcherServletInitializer
同樣也提供了便捷的方式來添加過濾器Filter
實例并使他們自動被映射到DispatcherServlet
下:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
每個過濾器被添加時,默認的名稱都基于其類類型決定,并且它們會被自動地映射到DispatcherServlet
下。
關于異步支持,AbstractDispatcherServletInitializer
的保護方法isAsyncSupported
提供了一個集中的地方來開關DispatcherServlet
上的這個配置,它會對所有映射到這個分發(fā)器上的過濾器生效。默認情況下,這個標志被設為true
。
最后,如果你需要對DispatcherServlet
做進一步的定制,你可以覆寫createDispatcherServlet
這個方法。
更多建議: