Серия исходных кодов SpringMVC: заметки о девяти компонентах

задняя часть Spring исходный код MVC CSS

Предыдущие статьи предназначены для анализа исходного кода конкретных компонентов 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

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

за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 мы рассмотрим детали реализации каждого компонента.