29

在一个典型的 Spring MVC web 应用程序中,你会DispatcherServletweb.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,@WebServlet而不是将它们添加到您的web.xml. Spring 3.2 已经有了它@Configuration@EnableXYZ上下文配置。它是否有类似的东西DispatcherServlet,即。有没有办法在没有任何 xml 的情况下配置完整的 Spring 应用程序?

4

2 回答 2

40

使用 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,但你需要使用等配置@Configurationwebapp @EnableWebMvc

于 2013-02-21T17:26:54.960 回答
1

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

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

添加此答案只是为了添加另一种方式。您不需要实施WebApplicationInitializer. WebApplicationInitializernamed的抽象基类实现AbstractDispatcherServletInitializer使得注册 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[] { "/" };
    }

}
于 2016-01-26T06:20:49.423 回答