ti-enxame.com

Spring MVC e Servlets 3.0 - Você ainda precisa do web.xml?

Em um aplicativo Web típico do Spring MVC, você declararia o DispatcherServlet em web.xml igual a

<!-- 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>

Juntamente com ouvintes, filtros, etc.

Com o servlet-api 3.0, você pode declarar seus servlets com a anotação @WebServlet em vez de adicioná-los ao seu web.xml. A Primavera 3.2 já tem @Configuration e @EnableXYZ para sua configuração de contexto. Tem algo semelhante para o DispatcherServlet, ie. existe uma maneira de configurar seu aplicativo Spring completo sem xml?

30
Sotirios Delimanolis

Com o JEE6, se o contêiner do aplicativo estiver pronto para o Servlet 3.0, você precisará fazer:

  1. Crie uma classe personalizada que implemente ServletContainerInitializer (ou seja, com.foo.FooServletContainer)
  2. Crie um arquivo no seu META-INF/services pasta chamada javax.servlet.ServletContainerInitializer que conterá o nome da sua implementação acima (com.foo.FooServletContainer)

O Spring 3 é fornecido com uma classe chamada SpringServletContainerInitializer que implementa o material acima (portanto, você não precisa criar o arquivo em META-INF/services. Esta classe chama apenas uma implementação de WebApplicationInitializer . Portanto, você só precisa fornecer uma classe para implementá-la em seu caminho de classe (o código a seguir é retirado do documento acima).

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("/");
    }
 }

É isso para o web.xml coisa, mas você precisa configurar o webapp usando @Configuration, @EnableWebMvc etc ..

41
Alex

Sim, você não precisa de web.xml Para iniciar o seu webapp Servlet 3.0+. Como Alex já mencionou, você pode implementar a classe WebApplicationInitializer e substituir o método onStartup(). WebApplicationInitializer é uma interface fornecida pelo Spring MVC que garante que sua implementação seja detectada e usada automaticamente para inicializar qualquer contêiner do Servlet 3.

Existe uma maneira de configurar seu aplicativo Spring completo sem nenhum xml?

Adicionando esta resposta apenas para adicionar outra maneira. Você não precisa implementar WebApplicationInitializer. Uma implementação de classe base abstrata de WebApplicationInitializer denominada AbstractDispatcherServletInitializer facilita ainda mais o registro do DispatcherServlet, substituindo métodos para especificar o mapeamento do servlet e o local da configuração do 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[] { "/" };
    }

}
1
Aniket Thakur