Spring4.x官方参考文档中文版——第21章 Web MVC框架(34)

21.16.8 View Resolvers(视图解析器)

        MVC config简化了视图解析器的注册过程。

        下方是一个Java config的例子,这个例子为JSON渲染使用了FreeMarker HTML模板和Jackson作为默认的View对象,来配置内容协商的视图解析:

@Configuration
@EnableWebMvc
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public voidconfigureViewResolvers(ViewResolverRegistry registry) {
       registry.enableContentNegotiation(new MappingJackson2JsonView());
       registry.jsp();
   }
 
}

        在XML中配置如下:

<mvc:view-resolvers>
    <mvc:content-negotiation>
       <mvc:default-views>
           <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
       </mvc:default-views>
    </mvc:content-negotiation>
    <mvc:jsp/>
</mvc:view-resolvers>

        请注意,FreeMarker,Velocity,Tiles,Groovy Markup和脚本的模板也需要分别在自己的视图技术下进行配置。

        MVC namespace也提供可消耗的元素,下方是使用FreeMarker的例子:

<mvc:view-resolvers>
    <mvc:content-negotiation>
       <mvc:default-views>
           <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
       </mvc:default-views>
    </mvc:content-negotiation>
    <mvc:freemarker cache="false"/>
</mvc:view-resolvers>
 
<mvc:freemarker-configurer>
    <mvc:template-loader-path location="/freemarker"/>
</mvc:freemarker-configurer>

        在Java config中,只需添加对应的”Configurer” bean:

 

@Configuration
@EnableWebMvc
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public void configureViewResolvers(ViewResolverRegistryregistry) {
       registry.enableContentNegotiation(newMappingJackson2JsonView());
       registry.freeMarker().cache(false);
   }
 
    @Bean
    publicFreeMarkerConfigurer freeMarkerConfigurer() {
       FreeMarkerConfigurer configurer = newFreeMarkerConfigurer();
       configurer.setTemplateLoaderPath("/WEB-INF/");
       return configurer;
   }
 
}

21.16.9 资源的提供

        当你在请求对应的URL后加上静态资源的地址,可以请求ResourceHttpRequestHandler根据Resource对象的地址列表来提供对应资源。这提供了一种比较方便的方式来从某个地址直接提供静态资源,而不是从web应用的根目录,或者类路径下的地址下提供。Cache-period属性可以用来设置报头的缓存期限(诸如Page Speed和YSlow等优化工具推荐设为1年),这样这些资源就会被客户端充分利用了。Handler处理器也可能会检查Last-Modified报头(如果存在的话),当某些不必要且过期的资源已经被客户端缓存的时候,会返回304的状态代码。比如:当你用一个URL”/resources/**”来从web应用的根目录下的public-resources路径下请求资源时,你可以这样:

 

@Configuration
@EnableWebMvc
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public voidaddResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/");
   }
 
}

        或者在XML中这样配置:

 

<mvc:resources mapping="/resources/**" location="/public-resources/"/>

        为了充分利用浏览器的缓存并降低浏览器产生的HTTP请求时,可以设置一年的缓存期限:

 

@Configuration
@EnableWebMvc
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public voidaddResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/").setCachePeriod(31556926);
   }
 
}

       或者在XML中这样配置:

<mvc:resources mapping="/resources/**" location="/public-resources/" cache-period="31556926"/>

        如需更多详解,参考”21.14.2 为静态资源提供HTTP缓存支持”这一章节。

        Mapping属性是Ant路径,可以被SimpleUrlHandlerMapping所使用。同时,location属性必须定义一个或多个有效的资源路径地址。多个资源地址使用逗号分隔。当某个请求对应到了某个特定的资源地址时,所定义的地址就会检查对应的命令。例如,为了从web应用的根目录和”/META-INF/public-web-resources/”地址下的任何类路径下的jar中获取资源,可以参考下例:

 

@EnableWebMvc
@Configuration
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public voidaddResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**")
                .addResourceLocations("/", "classpath:/META-INF/public-web-resources/");
   }
 
}

        或者在XML中这样配置:

<mvc:resources mapping="/resources/**" location="/,classpath:/META-INF/public-web-resources/"/>

        当需要应用提供最新版本的资源时,建议在映射的路径上加上版本号来请求资源,这样就可以强制客户端来请求最新的资源。在框架中已经支持了带版本的URL了,可以通过在resource handler(资源处理器)配置一个资源链来启用此功能。这个链包含了带有多个ResourceTransformer实例的多个ResourceResolver实例,有了它们,就可以提供各种各样的资源解析和转换。

        框架内建的VersionResourceResolver可以使用不同的策略来配置。例如,一个FixedVersionStrategy就可以使用某个属性,日期,或其他东西来作为版本号,一个ContentVersionStrategy可以使用从资源内容计算出来的MD5哈希值来作为资源版本号(被称为”fingerprinting” URL(指纹URL))。请注意,当VersionResourceResolver提供资源时,会自动使用这些值解析后的版本号作为HTTP ETag 报头值 。

        ContentVersionStrategy是比较好的默认选项,除了某些其不能使用的情况下(比如使用JavaScript模块的loaders时)。在下方所展示的,时你可以在不同的路径中使用不同的版本策略。请记住,计算基于资源内容的版本号开销是比较大的,因此需要在产品中启用资源链缓存。

        下面是Java config的例子:

 

@Configuration
@EnableWebMvc
public class WebConfig extendsWebMvcConfigurerAdapter {
 
    @Override
    public voidaddResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public-resources/")
               .resourceChain(true).addResolver(
                    newVersionResourceResolver().addContentVersionStrategy("/**"));
   }
 
}

        这个是XML的例子:

 

<mvc:resources mapping="/resources/**" location="/public-resources/">
        <mvc:resource-chain>
               <mvc:resource-cache/>
               <mvc:resolvers>
                       <mvc:version-resolver>
                               <mvc:content-version-strategy patterns="/**"/>
                       </mvc:version-resolver>
               </mvc:resolvers>
        </mvc:resource-chain>
</mvc:resources>

        为了使上方的配置生效,在应用中也需要在URL中加上版本号。最简单的方法是配置ResourceUrlEncodingFilter,它可以包装响应,并覆写它的encodeURL方法。他可以在JSP,FreeMarker,Velocity,和其他调用了响应的encodeURL方法的视图技术上运行。除此之外,应用也可以直接注入并使用ResourceUrlProvider bean,它已经自动地使用MVC Java config 或MVCnamespace声明了。

        Webjars也通过WebJarResourceResolver进行了支持,当类路径下有”org.webjars:webjars-locator”的库时,他也会被自动注册。这个解析器允许资源链去解析从HTTP GET请求中获取到的未知的库,比如链接是”GET /jquery/jquery.min.js”,会返回资源”/jquery/1.2.0/jquery.min.js”。它也可以通过在模板中重写资源URL来运行,如: <scriptsrc="/jquery/jquery.min.js"/>会变为<script src="/jquery/1.2.0/jquery.min.js"/>。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值