ContentNegotiationManagerFactoryBean 内容协商

一.什么是内容协商

简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。

这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。

1.Spring MVC REST是如何决定采用何种方式(视图)来展示内容呢?

一:根据Http请求的header中的Accept属性的值来判读,比如:

Accept: application/xml                将返回xml格式数据 

Accept: application/json               将返回json格式数据

优点:是这种方式是理想的标准方式

缺点:是由于浏览器的差异,导致发送的Accept Header头可能会不一样,从而导致服务器不知要返回什么格式的数据

二:根据扩展名来判断,比如:

/mvc/test.xml  将返回xml格式数据 

/mvc/test.json 将返回json格式数据 

/mvc/test.html 将返回html格式数据 

缺点:丧失了同一URL的多种展现方式。在实际环境中使用还是较多的,因为这种方式更符合程序员的习惯

三:根据参数来判断

/mvc/test?format=xml        将返回xml数据 

/mvc/test?format=json       将返回json数据 

缺点:需要额外的传递format参数,URL变得冗余繁琐,缺少了REST的简洁风范

2.使用内容协商的功能,如果不使用第三种方式的话,3.2的版本可以什么都不用配置,默认就能支持前面两种。下面还是看看怎么配置,示例如下:

需要在spring的配置文件中做配置,示例如下:

<!--1、检查扩展名(如my.pdf);2、检查Parameter(如my?format=pdf);3、检查Accept Header-->  <bean id= "contentNegotiationManager" class= "org.springframework.web.accept.ContentNegotiationManagerFactoryBean">  <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->  <property name= "favorPathExtension" value= "true" />  <!-- 用于开启 /userinfo/123?format=json 的支持 -->  <property name= "favorParameter" value= "true" />  <property name= "parameterName" value= "format"/>  <!-- 是否忽略Accept Header -->  <property name= "ignoreAcceptHeader" value= "false"/>  <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->  <property name= "mediaTypes">   <value>  json=application/json  xml=application/xml  html=text/html  </value>  </property>  <!--<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>-->   <!-- 默认的content type ,在没有扩展名和参数时即: "/user/1" 时的默认展现形式  -->  <property name= "defaultContentType" value= "text/html" />  </bean>  

 视图定义:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  <property name="order" value="0"/>  <property name="contentNegotiationManager" ref="contentNegotiationManager"/>  <property name="viewResolvers">  <list>  <!-- 这个类用于jsp视图解析 -->  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  <property name="prefix" value="/WEB-INF/page/"/>  <property name="suffix" value=".jsp"/>  </bean>  </list>  </property>  <property name="defaultViews">  <list>  <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">  </bean>  <!-- for application/xml -->  <bean class="org.springframework.web.servlet.view.xml.MarshallingView">  <property name="marshaller">  <bean class="org.springframework.oxm.castor.CastorMarshaller">  <property name="validating" value="false"></property>  </bean>  </property>  </bean>  </list>  </property>  </bean>  

 在mvc:annotation-driven里面配置使用内容协商 

<mvc:annotation-driven  conversion-service= "conversionService"  content-negotiation-manager= "contentNegotiationManager”/>  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解性能优化(web应用)

影响一个系统性能的方方面面 一个 web应用不是一个孤立的个体,它是一个系统的部分,系统中的每一部分都会影响整个系统的性能 一.常用的性能评价/测试指标 1.响应时间 提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。 常用操作的响应时间列表: 操作 响应…

深入理解Scrapy中XPath的`following-sibling`选择器

什么是XPath&#xff1f; 在深入following-sibling选择器之前&#xff0c;先简单了解一下XPath。XPath是一种在XML文档中查找信息的语言。它同样适用于HTML文档&#xff0c;因为HTML是XML的一种形式。XPath使用路径表达式在XML文档中进行导航。在网络爬虫框架Scrapy中&#xf…

探索 2024 年新副业:无人饮品机的新风向

随着科技的迅猛发展&#xff0c;无人饮品机作为一种全新的商业模式&#xff0c;正逐渐成为 2024 年副业的新风向。如果你还没有了解过这种全新的副业&#xff0c;那么现在是时候深入了解一下了。 D咖无人饮品机的优势在于其 24 小时不间断的营业模式&#xff0c;它可以在你睡觉…

Educational Codeforces Round 161 (Rated for Div. 2)补题

Tricky Template&#xff08;Problem - A - Codeforces&#xff09; 题目大意:现有三个模板字串a,b,c&#xff0c;都由小写字母组成&#xff0c;问能否找到一个字串s&#xff0c;使s与a,b匹配&#xff0c;与c不匹配&#xff0c;匹配的条件如下&#xff1a; 如果s的某位为小写…

边缘计算和联邦学习的联系

1. 什么是边缘计算&#xff1f; 边缘计算&#xff08;Edge Computing&#xff09;是一种计算模型&#xff0c;其主要思想是将计算、存储和数据处理能力推送到离数据源近的边缘设备&#xff0c;而不是依赖于远程的云服务器。这样做的目的是减少数据传输延迟、提高响应速度&…

web前端项目-中国象棋【附源码】

中国象棋 【中国象棋】是一款历史悠久、深受人们喜爱的策略类游戏。在Web前端技术中&#xff0c;我们可以使用HTML、CSS和JavaScript等语言来制作一款中国象棋游戏。玩家使用棋子&#xff08;帅/相/士/炮/马/车/炮/卒&#xff09;在棋盘上相互对弈&#xff0c;将对手的“帅”棋…

工作流管理框架airflow-安装部署教程

1 概述 Airflow是一个以编程方式编写&#xff0c;用于管理和调度工作流的平台。可以帮助你定义复杂的工作流程,然后在集群上执行和监控这些工作流。 Airflow计划程序在遵循指定的依赖项&#xff0c;同时在一组工作线程上执行任务。丰富的命令实用程序使在DAG上执行复杂的调度…

国产开源模型标杆,能力比肩ChatGPT!书生·浦语2.0发布,支持免费商用

1月17日&#xff0c;新一代大语言模型书⽣浦语2.0&#xff08;InternLM2&#xff09;正式发布并开源。 2种参数规格、3种模型版本&#xff0c;共计6个模型&#xff0c;全部免费可商用。 它支持200K超长上下文&#xff0c;可轻松读200页财报。200K文本全文范围关键信息召回准确…

Android13预装APP到data分区

修改步骤与Android11是差不多的&#xff0c;只是有部分代码所在位置不一样。 Android 11内置APP到data/app Android 8(O)预置APP到data/app 默认内置应用到data会出错 1970-01-01 08:03:54.499 1177-1177/system_process I/PackageManager: /data/app/xx changed; collecting…

Springboot日志框架logback与log4j2

目录 Springboot日志使用 Logback日志 日志格式 自定义日志格式 日志文件输出 Springboot启用log4j2日志框架 Springboot日志使用 Springboot底层是使用slf4jlogback的方式进行日志记录 Logback日志 trace&#xff1a;级别最低 debug&#xff1a;调试级别的&#xff0c…

Windows平台反调试技术学习

前言 前俩天的学习记录Windows上面的反调试学习&#xff0c;主要是参考《恶意代码实战分析》和《加密与解密》里面的&#xff0c;给每个小技术都写了程序示例&#xff0c;自己编译反调试了一遍。对于加解密一书是还有很多不理解的地方的&#xff0c;目前只能记录到这了&#x…

Nodejs 问题排查

前言 用于记录在使用 node 过程中遇到的问题&#xff0c;并尝试寻求解决方案。 问题 问题1 问题描述 访问前端页面时&#xff0c;页面返回 502/504。查看日志后发现&#xff0c;在一些出现问题的时间节点&#xff0c;会出现以下日志&#xff1a; epoll_wait() reported t…

自己动手写数据库系统:解释执行 update 和 delete 对应的 sql 语句

在上一节我们完成了 select 语句的解释执行&#xff0c;本节我们看看 Update 和 Delete 对应的语句如何解释执行&#xff0c;当然他们的实现原理跟我们前面实现的 select 语句执行大同小异。无论是 update还是 delete 都是对数据表的修改&#xff0c;因此他们的实现方法基本相同…

建筑类中级工程师职称证明业绩材料有哪些?

三、建筑类中级工程师职称造价类工程业绩材料 1.合同&#xff1a;证明项目合作关系的凭证。 2.预&#xff08;结&#xff09;算报告等(重点是体现封面有你的名字和执业印章等) 3.单位证明或任命书(本人在项目中的职务聘书) 4.工程获奖证明&#xff1a;项目获得市优的证书、省优…

Ubuntu 22.04.1 LTS VirtualBox7.0 解决虚拟机窗口失去焦点一段时间后,虚拟机显示不刷新问题

故障描述&#xff1a; virtualbox安装在ubuntu系统上&#xff0c;虚拟机内安装了windows操作系统。使用中发现&#xff0c;当linux系统窗口被激活&#xff0c;如firefox浏览器&#xff0c;虚拟机的显示一段时间后会暂停刷新&#xff0c;鼠标划入虚拟机窗口后&#xff0c;才会立…

分布式概念

文章目录 一、CAP定理和BASE定理1.1 CAP定理1.2 CAP取舍1.3 BASE定理 二、分布式事务2.1 柔性事务2.2 两阶段提交协议2.3 三阶段提交协议 三、分布式ID3.1 数据库自增ID3.2 数据库多主模式3.3 号段模式3.4 雪花算法3.5 Leaf3.6 使用Redis生成ID 四、限流算法4.1 固定窗口计数器…

插入排序-insertSort

1、基本思路 与冒泡排序和插入排序一样&#xff0c;也是两个元素比较&#xff1b;不过不同的是&#xff0c;在插入排序中&#xff0c;数组的左边会维护一个有序数组&#xff0c;这个数组刚开始时只有一个元素&#xff0c;即数组第一个元素&#xff0c;后续将拿有序数组后的第一…

TypeScript实现一个贪吃蛇小游戏

游戏效果 文件目录 准备1&#xff1a;新建index.html&#xff0c;编写游戏静态页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

小程序开发实战案例五 | 小程序如何嵌入H5页面

在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况&#xff0c;今天我们就来聊一聊怎么把 H5 页面塞到小程序中。 本篇文章将会从下面这几个方面来介绍&#xff1a; 小程序承载页面的前期准备小程序如何承载 H5小程序和 H5 页面如何通讯小程序和 H5 页面的相互跳转 小…

安全加速SCDN是什么

安全加速SCDN&#xff08;Secure Content Delivery Network&#xff0c;SCDN&#xff09; 是集分布式DDoS防护、CC防护、WAF防护、BOT行为分析为一体的安全加速解决方案。已使用内容分发网络&#xff08;CDN&#xff09;或全站加速网络&#xff08;ECDN&#xff09;的用户&…