Програми можуть оголошувати інфраструктурні біни, необхідні для обробки запитів. 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
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ