Что означает configureDefaultServletHandling?

Я пытаюсь понять, как работает Spring MVC, и я не понимаю эту часть кода в моих конфигурациях Spring:

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

Когда это находится в моем классе WebContextApplication, все работает отлично, а когда оно не отображается, все работает отлично. Итак, какова цель этого метода? Должен ли мой класс WebContextApplication использовать этот метод? и почему?

Ответ 1

Поскольку JB Nizet уже пытался объяснить, оба используются для обслуживания статических ресурсов.

Итак, ваш вопрос в том, что ваша конфигурация Spring на основе Java имеет

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) {     
    registry.addResourceHandler("/assets/**").addResourceLocations("/resources/bootstrap/"); 
}

то зачем вам нужно

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

или почему <mvc:default-servlet-handler/>, если у вас

<mvc:resources mapping="/assets/**" location="/resources/bootstrap/" />

в терминах конфигурации xml.


Чтобы ответить на ваш вопрос на основе требований, которые вы поставили, вам не нужно переопределять configureDefaultServletHandling(), поскольку вы уже переопределили и предоставили ваши сопоставления статических ресурсов.

Переопределяя метод addResourceHandlers(), вы, по существу, просите ResourceHttpRequestHandler обслуживать ресурсы, указанные в разделе ресурсов.

Однако, если вы переопределите configureDefaultServletHandling() и включите его, вы, по сути, запросите сервлет по умолчанию (сопоставленный с "/" ) для обслуживания ресурсов. Если вы используете это, вам нужно позаботиться о нескольких вещах. Цитирование из docs -

Это позволяет сопоставлять DispatcherServlet с "/" (таким образом, переопределяя сопоставление сервлетов по умолчанию для контейнеров), но при этом разрешая обработку запросов статических ресурсов по умолчанию Servlets по умолчанию. Он настраивает DefaultServletHttpRequestHandler с отображением URL-адреса "/**" и самым низким приоритетом по сравнению с другими сопоставлениями URL.

Этот обработчик пересылает все запросы на сервлет по умолчанию. Поэтому важно, чтобы он оставался последним в порядке всех других URL-адресов HandlerMappings. Это будет иметь место, если вы используете или, альтернативно, если вы настраиваете свой собственный экземпляр HandlerMapping, обязательно установите его свойство порядка на значение, меньшее, чем значение DefaultServletHttpRequestHandler, которое является Integer.MAX_VALUE.