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。一个名为AbstractDispatcherServletInitializerWebApplicationInitializer 的抽象基类实现使得注册 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

springmvc 3.0啥时间发部

Spring MVC 从 2.5 到 3.0

使用 Spring MVC 3.0 和 @EJB 注释而没有映射名称?

Spring 3.0 MVC 绑定枚举大小写敏感

Spring 3.0 MVC:重定向而不将参数添加到我的网址