【问题标题】:How does spring know which view resolver to use?spring 如何知道使用哪个视图解析器?
【发布时间】:2014-08-27 16:00:37
【问题描述】:

我目前正在阅读 Spring in Action 并且我正在尝试在 spring 中配置一个视图解析器,但是这本书没有说“spring 如何选择要使用的视图解析器”它的描述器来配置 InternalResourceViewResolver 以及如何添加前缀和后缀。但是,我找不到 spring 如何选择使用哪个解析器。什么告诉 spring 使用哪个解析器?

编辑: 书中引用:

"" 这里缺少的是 Spring 是如何知道 Tiles 定义的。就其本身而言,Tiles- ViewResolver 对任何 Tiles 定义一无所知,而是依赖于 一个 TilesConfigurer 来跟踪该信息。所以我们需要添加一个 Tiles- 配置器 bean 到 spitter-servlet.xml: /WEB-INF/viewsviews.xml “”

这本书从未回答它提出的问题:“Spring 如何知道 Tiles 定义”

【问题讨论】:

  • 没什么。 DispatcherServlet 咨询应用程序上下文中的所有 ViewResolvers,直到其中一个返回视图。
  • 指定的顺序或取决于order 属性(如果已定义)。但是,如果您在视图解析器链中将UrlBasedViewResolver 作为第一个,则不会咨询其他人。 UrlBasedViewResolver 只是创建一个 URL 并转发到该 URL。它不检查该 URL 是否实际导致要呈现的视图。

标签: java spring spring-mvc


【解决方案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>

【讨论】:

  • 那么顺序是关键?
  • 您可以为每个视图解析器订单属性指定。它定义了首先调用哪个解析器,哪个是第二个等等......
【解决方案2】:

视图解析器实现了org.springframework.core.Ordered接口,spring会根据这个接口对解析器进行排序。

PS:tile2 或 tiles3 包中的TilesViewResolver 扩展了UrlBasedViewResolver

【讨论】:

  • @Adio,正确,如果您使用不同的视图解析器,则需要注意命令。
【解决方案3】:

TilesViewResolver 是一个特定的ViewResolver 用于 Apache Tiles,碰巧需要额外配置才能执行其操作。

它需要的额外信息是TilesConfigurer。该 bean 包含有关 Tiles 定义的信息,可以进行如下配置:

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

正如documentation 的第 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。如果有多个视图解析器,则将依次查询它们,直到其中一个返回视图对象。

    【讨论】:

      【解决方案5】:

      InternalResourceViewResolver 类继承自 UrlBasedViewResolver,您可以在其中找到它。在为视图解析器定义 bean 后,您的视图解析器会映射您的 url,从那里处理更远的视图请求

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        相关资源
        最近更新 更多