Spring4.x官方参考文档中文版——第21章 Web MVC框架(34)
2017-03-06 21:57
483 查看
21.16.8 View Resolvers(视图解析器)
MVC config简化了视图解析器的注册过程。
下方是一个Java config的例子,这个例子为JSON渲染使用了FreeMarker HTML模板和Jackson作为默认的View对象,来配置内容协商的视图解析:
在XML中配置如下:
请注意,FreeMarker,Velocity,Tiles,Groovy Markup和脚本的模板也需要分别在自己的视图技术下进行配置。
MVC namespace也提供可消耗的元素,下方是使用FreeMarker的例子:
在Java config中,只需添加对应的”Configurer” bean:
21.16.9 资源的提供
当你在请求对应的URL后加上静态资源的地址,可以请求ResourceHttpRequestHandler根据Resource对象的地址列表来提供对应资源。这提供了一种比较方便的方式来从某个地址直接提供静态资源,而不是从web应用的根目录,或者类路径下的地址下提供。Cache-period属性可以用来设置报头的缓存期限(诸如Page Speed和YSlow等优化工具推荐设为1年),这样这些资源就会被客户端充分利用了。Handler处理器也可能会检查Last-Modified报头(如果存在的话),当某些不必要且过期的资源已经被客户端缓存的时候,会返回304的状态代码。比如:当你用一个URL”/resources/**”来从web应用的根目录下的public-resources路径下请求资源时,你可以这样:
或者在XML中这样配置:
为了充分利用浏览器的缓存并降低浏览器产生的HTTP请求时,可以设置一年的缓存期限:
或者在XML中这样配置:
如需更多详解,参考”21.14.2 为静态资源提供HTTP缓存支持”这一章节。
Mapping属性是Ant路径,可以被SimpleUrlHandlerMapping所使用。同时,location属性必须定义一个或多个有效的资源路径地址。多个资源地址使用逗号分隔。当某个请求对应到了某个特定的资源地址时,所定义的地址就会检查对应的命令。例如,为了从web应用的根目录和”/META-INF/public-web-resources/”地址下的任何类路径下的jar中获取资源,可以参考下例:
或者在XML中这样配置:
当需要应用提供最新版本的资源时,建议在映射的路径上加上版本号来请求资源,这样就可以强制客户端来请求最新的资源。在框架中已经支持了带版本的URL了,可以通过在resource handler(资源处理器)配置一个资源链来启用此功能。这个链包含了带有多个ResourceTransformer实例的多个ResourceResolver实例,有了它们,就可以提供各种各样的资源解析和转换。
框架内建的VersionResourceResolver可以使用不同的策略来配置。例如,一个FixedVersionStrategy就可以使用某个属性,日期,或其他东西来作为版本号,一个ContentVersionStrategy可以使用从资源内容计算出来的MD5哈希值来作为资源版本号(被称为”fingerprinting” URL(指纹URL))。请注意,当VersionResourceResolver提供资源时,会自动使用这些值解析后的版本号作为HTTP ETag
报头值 。
ContentVersionStrategy是比较好的默认选项,除了某些其不能使用的情况下(比如使用JavaScript模块的loaders时)。在下方所展示的,时你可以在不同的路径中使用不同的版本策略。请记住,计算基于资源内容的版本号开销是比较大的,因此需要在产品中启用资源链缓存。
下面是Java config的例子:
这个是XML的例子:
为了使上方的配置生效,在应用中也需要在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"/>。
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"/>。
相关文章推荐
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(27)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(17)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(29)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(20)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(28)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(19)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(35)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(21)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(22)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(25)
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(10)
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(5)
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(6)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(30)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(26)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(23)
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(1)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(31)
- Spring4.x官方参考文档中文版——第21章 Web MVC框架(18)
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(8)