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?
Ответы
Ответ 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[] { "/" };
}
}