- ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view。它支持如下面描述的三种方式:
- 1)使用扩展名
http://localhost:8080/employees/nego/Jack.xml 返回结果为XML
http://localhost:8080/employees/nego/Jack.json 返回结果为JSON
http://localhost:8080/employees/nego/Jack 使用默认view呈现,比如JSP
2) HTTP Request Header中的Accept,Accept 分别是 text/jsp, text/pdf, text/xml, text/json, 无Accept 请求头
3) 使用参数
http://localhost:8080/employees/nego/Jack?format=xml 返回结果为XML
http://localhost:8080/employees/nego/Jack?format=json 返回结果为JSON
- 1)使用扩展名
- ContentNegotiatingViewResolver 可以一个@RequestMapping,返回多个view。
- 配置
-
<property name="favorPathExtension" value="true"></property> 是否启用扩展名支持,默认是true
<property name="favorParameter" value="false"></property> 是否启用参数支持,默认是true
<property name="ignoreAcceptHeader" value="true"></property> 是否忽略掉accept header,默认就是false
-
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="favorParameter" value="true"/> <property name="favorPathExtension" value="true"/> <property name="mediaTypes"> <map> <entry key="xml" value="application/xml"/> // <entry key="json" value="application/json"/> // 这里, 对于 json ,必须是application/json <!--<entry key="json" value="text/plain"/>--> <entry key="xls" value="application/vnd.ms-excel"/> </map> </property> <property name="viewResolvers"> <list> <ref bean="jaxb2MarshallingXmlViewResolver"></ref> <ref bean="jsonViewResolver"></ref> <ref bean="excelViewResolver"></ref> </list> </property> </bean>
- 上面的 viewResolvers 属性是可以不用配置的, 默认spring 会查找所有 ViewResolver类型的对象。这样, 就同时支持了 parameter参数方式和 后缀拓展名方式。
- 这里直接使用了ContentNegotiatingViewResolver, 实际spring 给我们提供了 ContentNegotiationManagerFactoryBean,这是推荐的方式。 配置上类似。
-
<bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="ignoreAcceptHeader" value="true"/> <property name="favorPathExtension" value="true"/> <property name="defaultContentType" value="text/html"/> <property name="favorParameter" value="true"/> <property name="mediaTypes"> <map> <entry key="xml" value="application/xml"/> <entry key="json" value="text/plain"/> <entry key="xls" value="application/vnd.ms-excel"/> </map> </property> </bean>
-
<bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="contentNegotiationManager" ref="cnManager"/> <property name="viewResolvers"><!-- 针对freemarker的视图配置 --> <list> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="viewNames" value=".ftl"/> <property name="contentType" value="text/html; charset=utf-8"/> <property name="cache" value="true" /> <property name="prefix" value="" /> <property name="suffix" value="" /> <property name="order" value="2"/> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/jsp/"></property><!-- 配置页面路径 --> <property name="suffix" value=".jsp"></property><!-- 文件以value值结尾 --> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> <!-- <property name="extractValueFromSingleKeyModel" value="true"/> --> <property name="prettyPrint" value="true"/> <property name="contentType" value="text/plain"/> </bean> <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> <constructor-arg ref="jaxb2Marshaller"> </constructor-arg> </bean> <bean class="com.wonders.stpt.bid.controller.JXLExcelView"/> </list> </property> </bean>
-
- 默认是支持path 后缀拓展方式, 也支持accept 请求头,但不支持 format 参数的
-
Spring 梳理 - ContentNegotiatingViewResolver
猜你喜欢
转载自www.cnblogs.com/jiangtao1218/p/10205166.html
今日推荐
周排行