在典型的Spring MVC网络应用中,您会在DispatcherServlet
中声明web.xml
,就像这样
<!-- MVC Servlet -->
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
与听众,过滤器等一起
使用servlet-api 3.0,您可以使用注释@WebServlet
声明servlet,而不是将其添加到web.xml
。 Spring 3.2的上下文配置已经有@Configuration
和@EnableXYZ
。是否有DispatcherServlet
类似的东西,即。有没有办法在没有任何xml的情况下配置完整的Spring应用程序?
答案 0 :(得分:41)
使用JEE6,如果您的应用程序容器已准备好Servlet 3.0,您需要做的是:
com.foo.FooServletContainer
)META-INF/services
的{{1}}文件夹中创建一个文件,其中包含上述实施的名称(javax.servlet.ServletContainerInitializer
) Spring 3捆绑了一个名为com.foo.FooServletContainer
的类,它实现了上面的内容(所以你不需要在SpringServletContainerInitializer
中创建自己的文件。这个类只调用{{3}的实现所以你只需要在类路径中提供一个实现它的类(以下代码来自上面的doc)。
META-INF/services
这是针对public class FooInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
WebApplicationContext appContext = ...;
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(appContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
的内容,但您需要使用web.xml
,@Configuration
等来配置网络应用。
答案 1 :(得分:1)
是的,您不需要web.xml
来启动您的webapp Servlet 3.0+。正如Alex已经提到的,您可以实现WebApplicationInitializer
类并覆盖onStartup()
方法。 WebApplicationInitializer
是Spring MVC提供的接口,可确保检测到您的实现并自动用于初始化任何Servlet 3容器。
有没有办法在没有任何xml的情况下配置完整的Spring应用程序?
添加此答案只是为了添加另一种方式。您无需实施WebApplicationInitializer
。名为WebApplicationInitializer
的{{1}}的抽象基类实现通过简单地重写方法来指定servlet映射和DispatcherServlet配置的位置,从而更容易注册DispatcherServlet -
AbstractDispatcherServletInitializer