【问题标题】:Spring MVC and Servlets 3.0 - Do you still need web.xml?Spring MVC 和 Servlets 3.0 - 你还需要 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 应用程序?

【问题讨论】:

    标签: java spring-mvc servlets annotations


    【解决方案1】:

    使用 JEE6,如果您的应用程序容器已准备好 Servlet 3.0,您需要做的是:

    1. 创建一个实现ServletContainerInitializer(即com.foo.FooServletContainer)的自定义类
    2. 在您的 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/,以便您了解它在幕后是如何工作的。 (我编辑了上面的答案,因为它可能不清楚)
    【解决方案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[] { "/" };
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-04
      • 2018-11-13
      • 2018-11-03
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多