2013-02-21 5 views
30

В типичном вебе-приложении Spring MVC, вы бы объявить DispatcherServlet в web.xml как такSpring MVC и Servlets 3.0 - Вам все еще нужен web.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> 

Наряду со слушателями, фильтрами и т.д.

С сервлет-API 3.0, вы можете объявлять сервлеты аннотацию @WebServlet вместо добавления их в ваш web.xml. Весна 3.2 уже имеет @Configuration и @EnableXYZ для ее конфигурации контекста. Имеет ли он что-то подобное для DispatcherServlet, т.е. есть ли способ настроить ваше приложение Spring без каких-либо xml?

ответ

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 вещи, но вам нужно настроить веб-приложение с использованием @Configuration, @EnableWebMvc и т.д ..

+0

Тот факт, что вам все еще нужно положить что-то в META-INF довольно раздражает, но я попробую это. –

+8

Вам не нужно, если вы используете 'Spring', потому что Spring предоставляет уже файл, который ссылается на' SpringServletContainerInitializer', который вызывается классом 'FooInitializer'. Я объяснил «META-INF /», чтобы вы поняли, как это работает под обложкой. (Я отредактировал ответ выше, потому что он, возможно, не ясен) – Alex

+0

Ваше объяснение было отличным. –

1

Да вам не нужно web.xml для запуска вашего веб-приложения Servlet 3.0+. Как уже сказал Алекс, вы можете реализовать класс WebApplicationInitializer и переопределить метод onStartup(). WebApplicationInitializer - это интерфейс, предоставляемый Spring MVC, который гарантирует, что ваша реализация обнаружена и автоматически используется для инициализации любого контейнера Servlet 3.

Есть ли способ настроить полное приложение Spring без каких-либо xml?

Добавить ответ, чтобы добавить другой способ. Вам не нужно вводить WebApplicationInitializer. Абстрактный реализация базового класса WebApplicationInitializer имени AbstractDispatcherServletInitializer делает его еще проще зарегистрировать DispatcherServlet просто переопределение методов, чтобы определить отображение сервлета и расположение конфигурации 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[] { "/" }; 
    } 

} 
Смежные вопросы