Spring MVC 和 Servlets 3.0 - 你还需要 web.xml吗?

2022-09-01 13:08:33

在典型的Spring MVC Web应用程序中,您会像这样声明inDispatcherServletweb.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,您可以使用注释声明您的 servlet,而不是将它们添加到您的 .Spring 3.2已经有了上下文配置。它是否具有与 类似的东西,即。有没有办法在没有任何xml的情况下配置完整的Spring应用程序?@WebServletweb.xml@Configuration@EnableXYZDispatcherServlet


答案 1

使用JEE6,如果您的应用程序容器是Servlet 3.0就绪的,您需要做的是:

  1. 创建一个实现 ServletContainerInitializer 的自定义类(即com.foo.FooServletContainer)
  2. 在名为的文件夹中创建一个文件,该文件将包含上述实现的名称 (META-INF/servicesjavax.servlet.ServletContainerInitializercom.foo.FooServletContainer)

Spring 3 与一个名为的类捆绑在一起,该类实现了上述内容(因此您无需在 中创建文件。此类仅调用 WebApplicationInitializer 的实现。因此,您只需要在类路径中提供一个实现它的类(以下代码取自上面的文档)。SpringServletContainerInitializerMETA-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应用程序。web.xml@Configuration@EnableWebMvc


答案 2

是的,您不需要启动 Webapp Servlet 3.0+。正如 Alex 已经提到的,你可以实现类和重写方法。 是由Spring MVC提供的接口,可确保检测到您的实现并自动用于初始化任何Servlet 3容器。web.xmlWebApplicationInitializeronStartup()WebApplicationInitializer

有没有办法在没有任何xml的情况下配置完整的Spring应用程序?

添加此答案只是为了添加另一种方式。您不需要实现 .named 的抽象基类实现使得注册 DispatcherServlet 变得更加容易,只需重写方法来指定 servlet 映射和 DispatcherServlet 配置的位置 -WebApplicationInitializerWebApplicationInitializerAbstractDispatcherServletInitializer

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[] { "/" };
    }

}

推荐