Как spring узнает, какой преобразователь представления использовать?

#java #spring #spring-mvc

#java #spring #spring-mvc

Вопрос:

В настоящее время я читаю Spring в действии и пытаюсь настроить преобразователь представления в spring, однако в книге не сказано, «Как spring выбирает, какой преобразователь представления использовать», его описатель для настройки InternalResourceViewResolver и как добавить префикс и суффикс. Но я не смог найти, как spring выбирает, какой преобразователь использовать. Что подсказывает spring, какой преобразователь использовать?

Отредактировано: цитата из книги :

«» Чего здесь не хватает, так это того, как Spring узнает об определениях плиток. Сам по себе Tiles- ViewResolver ничего не знает ни о каких определениях Tiles, но вместо этого полагается на TilesConfigurer для отслеживания этой информации. Итак, нам нужно добавить компонент Tiles-Configurer в spitter-servlet.xml : /WEB-INF/viewsviews.xml «»

Книга так и не ответила на заданный в ней вопрос: «откуда Spring знает об определениях плиток»

Комментарии:

1. Ничего. DispatcherServlet Просматривает все ViewResolver файлы в контексте приложения, пока один из них не вернет представление.

2. Порядок указан или зависит от order атрибута, если он определен. Однако, если у вас есть UrlBasedViewResolver первый в вашей цепочке преобразователей представления, с остальными обращаться не будут. UrlBasedViewResolver просто создает URL-адрес и перенаправляет на этот URL. Он не проверяет, действительно ли этот URL приводит к отображению представления.

Ответ №1:

Посмотрите на свойство «порядок». Но помните: «В КОНТЕКСТЕ МОЖЕТ СУЩЕСТВОВАТЬ ТОЛЬКО ОДИН InternalResourceViewResolver, НЕ БОЛЕЕ»

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="1" />
        <property name="prefix" value="${view.prefix}" />
        <property name="suffix" value="${view.suffix}" />
        <property name="cache" value="true" />
</bean>
  

Комментарии:

1. Итак, порядок является ключевым?

2. Вы можете указать для каждого свойства порядка преобразования представления. Он определяет, какой преобразователь будет вызван первым, какой будет вторым и т.д…

Ответ №2:

Преобразователи представлений реализуют org.springframework.core.Упорядоченный интерфейс, spring упорядочит преобразователи в соответствии с этим интерфейсом.

PS: TilesViewResolver пакеты из tiles2 или tiles3 являются расширенными UrlBasedViewResolver .

Комментарии:

1. @Adio, правильно, если вы используете разные преобразователи представления, вам нужно обращать внимание на порядки.

Ответ №3:

TilesViewResolver Это специфичный ViewResolver для Apache Tiles файл, которому требуется дополнительная настройка для выполнения своей операции.

Дополнительная информация, которая ему нужна, это TilesConfigurer . Этот компонент содержит информацию об определениях плиток и может быть настроен, например, следующим образом:

 <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/viewsviews.xml</value>
        </list>
    </property>
</bean>
  

Как упомянуто в разделе 16.5.2 документации:

Spring поддерживает несколько преобразователей представления. Таким образом, вы можете объединять преобразователи в цепочку и, например, переопределять определенные представления при определенных обстоятельствах. Вы объединяете преобразователи представления в цепочку, добавляя более одного преобразователя в контекст вашего приложения и, при необходимости, устанавливая свойство order для указания порядка. Помните, чем выше свойство order, тем позже преобразователь представления будет размещен в цепочке.

Ответ №4:

Это правильный способ определения преобразователя ViewResolver

 <bean id="viewResolver"  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>
  

Если вы не объявляете какую-либо реализацию ViewResolver в контексте вашего приложения, Springs регистрирует ее для вас по умолчанию.
По умолчанию используется автоматически зарегистрированный InternalResourceViewResolver.

Если вы объявите свой собственный преобразователь представления, то InternalResourceViewResolver по умолчанию использоваться не будет. Если существует несколько преобразователей представления, то к ним будут обращаться по порядку, пока один из них не вернет объект view.

Ответ №5:

Класс InternalResourceViewResolver наследуется от UrlBasedViewResolver, где вы можете найти это. После определения компонента для преобразователя представления ваш преобразователь представления отображает ваш URL-адрес, откуда будет обрабатываться дальнейший запрос на просмотр

    public void setAttributesMap(Map<String, ?> attributes) {
        if (attributes != null) {
            this.staticAttributes.putAll(attributes);
        }
    }
public Map<String, Object> getAttributesMap() {
        return this.staticAttributes;
}