Spring MVC 和 Servlets 3.0 - 你还需要 web.xml 吗?
Posted
技术标签:
【中文标题】Spring MVC 和 Servlets 3.0 - 你还需要 web.xml 吗?【英文标题】:Spring MVC and Servlets 3.0 - Do you still need web.xml? 【发布时间】:2013-02-07 02:57:30 【问题描述】:在典型的 Spring MVC Web 应用程序中,您可以像这样在 web.xml
中声明 DispatcherServlet
<!-- 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 应用程序?
【问题讨论】:
【参考方案1】:使用 JEE6,如果您的应用程序容器已准备好 Servlet 3.0,您需要做的是:
-
创建一个实现ServletContainerInitializer(即
com.foo.FooServletContainer
)的自定义类
在您的 META-INF/services
文件夹中创建一个名为 javax.servlet.ServletContainerInitializer
的文件,该文件将包含上述实现的名称 (com.foo.FooServletContainer
)
Spring 3 捆绑了一个名为 SpringServletContainerInitializer
的类,该类实现了上述内容(因此您无需在 META-INF/services
中创建自己的文件。此类仅调用 WebApplicationInitializer
的实现。所以您只需需要在你的类路径中提供一个实现它的类(以下代码取自上面的文档)。
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
、@EnableWebMvc
等配置 webapp。
【讨论】:
你仍然需要在 META-INF 中放一些东西的事实有点烦人,但我会试试这个。 如果您使用Spring
,则不需要这样做,因为Spring 已经提供了引用SpringServletContainerInitializer
的文件,它将调用您的FooInitializer
类。我解释了META-INF/
,以便您了解它在幕后是如何工作的。 (我编辑了上面的答案,因为它可能不清楚)
github.com/spring-projects/spring-framework/blob/master/…【参考方案2】:
是的,您不需要 web.xml
来启动您的 webapp Servlet 3.0+。正如 Alex 已经提到的,您可以实现 WebApplicationInitializer
类并覆盖 onStartup()
方法。 WebApplicationInitializer
是 Spring MVC 提供的一个接口,可确保检测到您的实现并自动用于初始化任何 Servlet 3 容器。
有没有办法在没有任何 xml 的情况下配置完整的 Spring 应用程序?
添加此答案只是为了添加另一种方式。你不需要实现WebApplicationInitializer
。一个名为AbstractDispatcherServletInitializer
的WebApplicationInitializer
的抽象基类实现使得注册 DispatcherServlet 变得更加容易,只需覆盖方法来指定 servlet 映射和 DispatcherServlet 配置的位置 -
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[] "/" ;
【讨论】:
以上是关于Spring MVC 和 Servlets 3.0 - 你还需要 web.xml 吗?的主要内容,如果未能解决你的问题,请参考以下文章
Java EE - Servlet 3.0 和 Spring MVC