Предыдущие статьи предназначены для анализа исходного кода конкретных компонентов SpringMVC; эта статья в основном используется для дополнения и записи изучения девяти компонентов SpringMVC. Это потребует добавления предыдущих статейHandlerMapping
другие основные компоненты.
Он был кратко представлен передDispatcherServlet
Архитектура этого класса здесь повторяться не будет. существуетDispatcherServlet
Класс, который будет завершен инициализация девяти компонентов MVC, инициализируется при подсвечении, особенно компонентам, которые будут медленно возвращаться девять. Сначала посмотритеDispatcherServlet
Какие методы используются для завершения работы по инициализации, сначала вставьте кусок кода:
protected void onRefresh(ApplicationContext context) {
this.initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
this.initMultipartResolver(context);
this.initLocaleResolver(context);
this.initThemeResolver(context);
this.initHandlerMappings(context);
this.initHandlerAdapters(context);
this.initHandlerExceptionResolvers(context);
this.initRequestToViewNameTranslator(context);
this.initViewResolvers(context);
this.initFlashMapManager(context);
}
в коде вышеonRefresh
Путь этоDispatcherServlet
способ входа. существуетonRefresh
позвонивinitStrategies
метод интеграции логики инициализации каждого компонента.Личное понимание на самом деле представляет собой набор стратегий, и одна из них заключается в том, что обязанности также ясны.
существуетinitStrategies
Методы и конкретная инициализация выполняются путем вызова соответствующего метода инициализации компонента. На самом деле, с этого места в девятке SpringMVC можно ясно увидеть имя компонента. Вот гладить мазком девять составляющих этой основной обязанности.
HandlerMapping
В следующих статьях я сделал некоторые базовые сведения о сопоставлении обработчиков, но они не очень полны.Подклассы сопоставления обработчиков еще не были проанализированы, и это будет обновлено позже.
- Серия исходников SpringMVC: HandlerMapping
- Серия исходных кодов SpringMVC: AbstractHandlerMapping
- Исходный ряд SpringMVC: AbstractUrlHandlerMapping
заHandlerMapping
, его действие основано наrequest
Найдите подходящий процессорHandler
иIntecepter
перехватчик. Подробная информация о параметрах находится в первой статье выше.
HandlerAdapter
если мы предположимHandlerMapping
это ручка, тоHandlerAdapter
Тот, кто использует перо. то естьHandlerAdapter
Это люди, которые используют процессор для выполнения работы. Зачем? Взгляните на код:
public interface HandlerAdapter {
boolean supports(Object var1);
ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
long getLastModified(HttpServletRequest var1, Object var2);
}
Очевидно ли, что вHandlerAdapter
предоставляется в интерфейсеhandle
В таком методе третий параметр обработчика объекта в параметрах на самом деле является обработчиком, тогда мы будем знать,handle
Способ заключается в использованииhandler
для обработки логики. После обработки вернутьModelAndView
.
HandlerExceptionResolver
этоSpringMVC
Компонент обработки исключений в ,HandlerExceptionResolver
Роль этого компонента заключается в установке в соответствии с исключениемModelAndView
, а затем отправить результат обработки наrender
метод рендеринга. Конечноrender
отвечает только заModelAndView
визуализировать страницу,ModelAndView
Конкретный источник его не волнует.
Здесь нужно пояснить, что делать, если в процессе рендеринга возникает исключение? Из приведенного выше анализа мы можем ясно знать, что,HandlerExceptionResolver
Результатом обработки исключения этим компонентом являетсяModelAndView
, а затем поrender
метод рендеринга, то естьHandlerExceptionResolver
работает до рендеринга, поэтому во время рендеринга возникает исключение,HandlerExceptionResolver
не будет обработано.
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4);
}
существуетHandlerExceptionResolver
Есть только один метод вModelAndView
.
ViewResolver
ViewResolver
Эффект заключается вString
Логическое представление типа разрешается в локальноеView
Посмотреть. НижеViewResolver
Определение интерфейса исходного кода:
public interface ViewResolver {
View resolveViewName(String viewName, Locale local) throws Exception;
}
Как видно из кода, вViewResolver
Существует также только один метод, изresolveViewName
Параметры метода и возвращаемый результат хорошо объясняют его роль.
- viewName Строковое имя представления
- локальная область, которая может быть использована для интернационализации.
View
Фактически он используется для рендеринга страницы, то есть результат, возвращаемый программой, записывается в определенный шаблон, и генерируется конкретный файл представления, например: jsp, ftl, html и т. д.
Но здесь также будут затронуты две проблемы:
- Какой шаблон использовать?
- Как заполнить параметры?
Разумеется, эти два вопроса также обсуждаются в этом разделе.ViewResolver
вопросы, которые требуют решения. Обычно делятся на два типа:
Парсер для одного типа представления
- InternalResourceViewResolver
- FreeMarkerViewResolver
Вышеуказанные два являются двумя наиболее часто используемыми,InternalResourceViewResolver
используется для разбора jsp иFreeMarkerViewResolver
Это для FreeMarker.
Парсер для одновременного анализа нескольких типов представлений.
-
BeanNameViewResolver
Вам нужно использовать как имя представления, так и соответствующий локальный адрес для разрешения представления. Необходимо настроить каждое имя представления и соответствующий тип представления в соответствующем файле свойств. (Лизи будет дан, когда мы поговорим о деталях реализации компонентов позже)
-
XmlViewResolver
XmlViewResolver немного похож на BeanNameViewResolver.BeanNameViewResolver использует файлы конфигурации в формате xml.
-
ResourceBundleViewResolver
На самом деле это поиск bean-компонента из контейнера Spring в соответствии с viewName, а затем поиск соответствующего представления в соответствии с этим bean-компонентом.
LocalResolver
вышеViewResolver
Как упоминалось в представлении синтаксического анализа, требуются два параметра: один — имя логического представления типа String, а другой — локальный.LocalResolver
Функция состоит в том, чтобы разобрать локальный из запроса.
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request, HttpServletResponse response, Locale local);
}
Первый метод — разобрать локалку из запроса, а второй — установить локалку в запрос.
В большинстве случаев local используется для интернационализации.
ThemeResolver
разбор предмета. Помимо функций, предоставляемых SpringMVC, я редко расширяю и использую это сам, даже если меняю тему. Но раз оно существует, то должна быть и причина. Для нашего обычного веб-интерфейса или интерфейса мобильного телефона набор тем — это не что иное, как изменение набора картинок, файлов стилей css и так далее. мы проходимThemeResolver
Это может достичь такой функции. Конкретное использование на самом деле состоит в настройке набора файлов свойств для чтения и переключения системой в разное время; конечно, интернационализация также может быть достигнута с помощью этого.
public interface ThemeResolver {
String resolveThemeName(HttpServletRequest request);
void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName);
}
RequestToViewNameTranslator
Это на самом деле довольно интересно, то есть преобразовать запрос Request в имя представления.
public interface RequestToViewNameTranslator {
String getViewName(HttpServletRequest request) throws Exception;
}
RequestToViewNameTranslator
Существует только один класс реализации по умолчаниюDefaultRequestToViewNameTranslator
.
существуетDefaultRequestToViewNameTranslator
В частности, реализуйте метод getViewName (запрос HttpServletRequest):
public String getViewName(HttpServletRequest request) {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
return this.prefix + this.transformPath(lookupPath) + this.suffix;
}
В основном это делегируется вспомогательному классу urlPathHelper для получения имени суффикса запроса, такого как /login.do, полученного путем преобразования пути запроса, такого как /glmapper/login.do; как преобразовать его в представление, также даст конкретные примеры во введении к компоненту позже.
MultipartResolver
Соответствующие друзья не являются чем-то незнакомым, и создание веб-сайта более или менее связано с загрузкой файлов.MultipartResolver
Он используется для обработки запросов загрузки. Способ справиться с этим - обернуть запрос какMultipartHttpServletRequest
. Тогда мы можем использоватьMultipartHttpServletRequest
Это файл, полученный прямым вызовом getFile.
FlashMapManager
Это необходимо для передачи параметров при перенаправлении.
public interface FlashMapManager {
FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response);
void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response);
}
retrieveAndUpdate
Этот метод используется для восстановления параметров, при этом восстановленные параметры и параметры времени ожидания будут удалены.
saveOutputFlashMap
Этот метод используется для сохранения параметров.
FlashMapManager
Хранение параметров в механизме реализации по умолчанию размещается в сеансе. Я уже сталкивался с такой ситуацией в проекте, для некоторых параметров, которые мы не хотим выставлять в url, при пересылке запроса можно использовать @RedirectAttributes, чтобы сохранить параметры, а затем получить их в следующем процессоре.
резюме
Эта статья в основном предназначена для того, чтобы дать общее представление о девяти основных компонентах, а подробная реализация и примеры не рассматриваются; в последующих сериях исходного кода SpringMVC мы рассмотрим детали реализации каждого компонента.