Подтвердить что ты не робот

Spring MVC и Servlets 3.0 - Вам все еще нужен web.xml?

В типичном веб-приложении Spring MVC вы должны объявить DispatcherServlet в 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>

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

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

4b9b3361

Ответ 1

С JEE6, если ваш контейнер приложения - Servlet 3.0, то вам нужно сделать следующее:

  • Создайте собственный класс, который реализует ServletContainerInitializer (т.е. com.foo.FooServletContainer)
  • Создайте файл в папке 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, но вам нужно настроить webapp с помощью @Configuration, @EnableWebMvc и т.д.

Ответ 2

Да, вам не нужно web.xml для запуска вашего сервлета webapp 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[] { "/" };
    }

}