Програми можуть оголошувати інфраструктурні біни, необхідні для обробки запитів. DispatcherServlet перевіряє WebApplicationContext для кожного спеціалізованого біна. Якщо відповідних типів бінів немає, то використовуються типи за замовчуванням, зазначені у файлі DispatcherServlet.properties.
У більшості випадків MVC Config є найкращою відправною точкою. Він оголошує необхідні біни на Java або XML і надає API зворотного виклику конфігурації вищого рівня для їхнього налаштування.
1.1.4. Конфігурація сервлетів
В оточенні Servlet 3.0+ є можливість конфігурувати контейнер сервлетів програмно як альтернативу або в поєднанні з файлом web.xml. У цьому прикладі реєструється DispatcherServlet:
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = New XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", новий DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
import org.springframework.web.WebApplicationInitializer
class MyWebApplicationInitializer : WebApplicationInitializer {
override fun onStartup(container: ServletContext) {
val appContext = XmlWebApplicationContext()
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
val registration = container.addServlet("dispatcher", DispatcherServlet(appContext))
registration.setLoadOnStartup(1)
registration.addMapping("/")
}
}
WebApplicationInitializer — це інтерфейс Spring MVC, який дозволяє гарантувати виявлення твоєї реалізації та її автоматичне використання для ініціалізації будь-якого контейнера Servlet 3. Абстрактна реалізація базового класу WebApplicationInitializer під назвою AbstractDispatcherServletInitializer ще більше спрощує реєстрацію DispatcherServlet, перевизначаючи методи для встановлення подання сервлетів та розташування конфігурації DispatcherServlet.
Це рекомендовано для програм, які використовують конфігурацію Spring на базі Java, як показано в наступному прикладі:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array<Class<*>>? {
return null
}
override fun getServletConfigClasses(): Array<Class<*>>? {
return arrayOf(MyWebConfig::class.java)
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
}
Якщо використовується конфігурація Spring на основі XML, слід розширюватися безпосередньо з AbstractDispatcherServletInitializer, як показано в наступному прикладі:
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[] { "/" };
}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
override fun createRootApplicationContext(): WebApplicationContext? {
return null
}
override fun createServletApplicationContext(): WebApplicationContext {
return XmlWebApplicationContext().apply {
setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
}
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
}
AbstractDispatcherServletInitializer також надає зручний спосіб додавання екземплярів Filter та їх автоматичного відображення на DispatcherServlet, як показано в наступному прикладі:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
новий HiddenHttpMethodFilter(), новий CharacterEncodingFilter() };
}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
// ...
override fun getServletFilters(): Array<Filter> {
return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
}
}
Кожний фільтр додається за замовчуванням, заснованим на його конкретному типі, і автоматично відображається на DispatcherServlet.
Захищений метод isAsyncSupported у AbstractDispatcherServletInitializer надає єдине місце для активації підтримки асинхронності в DispatcherServlet та всіх фільтрах, що відображаються на нього. За замовчуванням цей прапор встановлений у true.
Нарешті, якщо потрібно додатково налаштувати сам DispatcherServlet, то можна перевизначити метод createDispatcherServlet.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ