一 不再需要web.xml
Servlet 3.0提供了既能在容器中动态注册servlet的方法,也提供了通过实现
ServletContainerInitializer
接口的方法实现在容器启动阶段为容器动态注册Servlet、Filter和listeners。容器会在应用的启动阶段,调用所有实现ServletContainerInitializer
接口类中的onStartup()
方法。而Spring 3.2中,则进一步简化了这点,只需要实现WebApplicationInitializer
接口就可以了,其中提供了一个相关的实现类--AbstractContextLoaderInitializer
,它可以动态注册DispatcherServlet
。这意味着,只要spring-webmvc.jar
放置在web应用的web-inf/lib
中,就可以调用Dispatcher servlet了。可以参考如下的例子:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
}
}
二 支持Java编程式配置
在Spring mvc 3.2中,提供了AbstractContextLoaderInitialize
的一个子类AbstractAnnotationConfigDispatcherServletInitializer
去实现零XML配置的效果,只需要创建的类继承AbstractAnnotationConfigDispatcherServletInitializer
就可以了,如下代码所示:
public class SugarSpringWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { JavaConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
三功能更强大的Spring Test 框架
public class SayHelloControllerIT extends AbstractTestNGSpringContextTests {
private MockMvc mockMvc;
@BeforeMethod
public void setUp() {
mockMvc = webAppContextSetup((WebApplicationContext) applicationContext).build();
}
@Test(dataProvider = "pathParameterAndExpectedModelValue")
public void accessingSayhelloWithSubpathShouldForwardToSayHelloJspWithModelFilled(String path, String value) throws Exception {
mockMvc.perform(get("/sayHello/Jo")).andExpect(view().name("sayHello")).andExpect(model().attribute("name", "Jo"));
}
}