遇到问题: @RequestMapping (value = "/view.html" )
@ResponseBody
public Object view( @RequestParam int id ) {
User user = userService .findById( id );
return user ;
}

$.ajax({
type: "POST" ,
url:path+ "/user/view.html" ,
data:{id:obj.attr( "userid" )},
dataType: "json" ,
success: function (result){
alert(JSON.stringify(result));
},
error: function (result){
console.log(JSON.stringify(result));
}
});

使用.html后缀的请求名,想依赖 @ResponseBody( 关于@ResponseBody:将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,而是调用适合HttpMessageConverter,将返回值写入输出流。 )(Jackson相关包已提交导入)自动返回json,发现报406错误,很是费解,查询网上各处文章,发现有同学说是 如果后缀是html是不能响应json数据的。需要修改后缀名。
在做伪静态化过程中,以.html结尾的后缀,做post请求时,不能响应json格式,这是spring官方做出的处理。看完之后本来想是好吧,既然是spring都申明这个问题采取规避原则,那我就不纠结了,然而后来反复想还是觉得不对,spring不至于ajax连后缀.html,.jsp这种都不支持吧,继续寻找解决方案,终于找到ajax中有个内容协商原则。

什么是内容协商
简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。
这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。

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的简洁风范

使用内容协商的功能,如果不使用第三种方式的话,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"/>
<property name="mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension,favorParameter是true时起作用 -->
<value>
ccjson=application/json
ccxml=application/xml
html=text/html
</value>
</property>
<!-- 默认的content type -->
<property name="defaultContentType"value="text/html"/>
</bean>

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

这段内容来自 http://sishuok.com/forum/blogPost/list/6996.html


现在对这段做下补充,经过测试发现:这边的3个规则是有优先顺序的,spring会优先匹配favorPathExtension(检查扩展名),其次匹配剩余2个规则,
根据上面的原则,在你的spring配置文件中添加下面内容即可
<!-- 指定数据转换管理器 -->
< mvc:annotation-driven content-negotiation-manager = "cnManager" />
<!-- favorPathExtension属性值默认为true 会根据请求路径来识别你的数据类型,入.html返回html。.json返回json-->
< bean id = "cnManager" class = "org.springframework.web.accept.ContentNegotiationManagerfactorybean" >
< property name = "ignoreAcceptHeader" value = "false" />
< property name = "favorPathExtension" value = "false" />
< property name = "defaultContentType" value = "text/html" />
< property name = "favorParameter" value = " false " />
<!-- <property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
<entry key="json" value="application/json"/>
</map>
</property> -->
</ bean >
我们利用第三种检查请求头的方式来决定要返回什么类型数据,所以把 favorPathExtension和 favorParameter都设为false,把 ignoreAcceptHeader也设为false,表示不忽略,需要检查请求头,因为我们申明dataType是json,查看控制台发现Accept是application/json, contentNegotiateManager就会认为你请求的内容类型(Content-Type)为application/json,那么它就要将响应的内容类型(Content-Type)设置为application/json,最终HttpMessageConverter能将你的json正确返回给前台。
总结:想要利用spring自己的 HttpMessageConverter 自动转成json的方式,那么需要了解其的内容协商规则,当然如果在返回之前手动转成json格式的数据,那么就可以一招制敌了。

  1. Accept:
    application/json,text/javascript,*/*; q=0.01
  2. Accept-Encoding:
    gzip,deflate,br
  3. Accept-Language:
    zh-CN,zh;q=0.8
  4. Connection:
    keep-alive
  5. Content-Length:
    4
  6. Content-Type:
    application/x-www-form-urlencoded; charset=UTF-8
  7. Cookie:
    JSESSIONID=61B1FF442274EE9364FB05318EFDA30A; __utma=111872281.1109517436.1491358058.1492066273.1492070833.3; __utmz=111872281.1491358058.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
  8. Host:
    localhost:8080
  9. Origin:
    http://localhost:8080
  10. Referer:
    http://localhost:8080/springmvc_sun_12_1/user/userAdmin.html
  11. User-Agent:
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/57.0.2987.98 Safari/537.36
  12. X-Requested-With:
    XMLHttpRequest

ajax中的内容协商的更多相关文章

  1. xcode – Cordova plugin.xml添加“Header Search Paths”条目

    我希望将Cordova插件添加到Xcode项目后,在“HeaderSearchPaths”下添加一个新条目.如何在Cordovaplugin.xml文件中进行配置?

  2. ios – 有关多个连接/提要/视图的XML解析的设计/实现建议

    >我应该在每个视图中都有解析器类/对象或解析XML提要吗?

  3. iOS的相当于Android的colors.xml的是什么?

    如果没有,组织整个应用程序使用的颜色的最佳方法是什么?

  4. iOS中的XML转换为JSON

    我需要将XML响应转换为JSON.我的XML响应:我正在使用本网站的XMLReader支持文件:XMLReader我正在使用此代码将XML转换为JSON我收到了JSON响应:我需要这样的回应:我在线转换时得到这个回应.如何获得这样的回应提前致谢.解决方法此代码不会将任何内容转换为JSON.它给你一个NSDictionary.您需要从字典中实际创建JSON数据.尝试这个大小.

  5. ios – Info.plist格式不正确

    解决方法plist文件是严格指定格式的XML文档;XML和PropertyList结构都有非常严格的规则.如果您尝试手动编辑info.plist(即文本),您可以轻松搞砸事情,方法是打开Asas>源代码:您不太可能正确使用此格式.因此,您应该始终使用OpenAs>编辑info.plist.物业清单:这允许属性列表编辑器为您生成XML,并且不太可能在生成的XML结构中出错.当然,我想你仍然可能搞砸某些东西的价值……

  6. ios – 在没有XML的情况下更新sqlite数据库

    我的应用程序需要来自sqlite数据库的数据.它将附带此数据库的一个版本,但我需要定期更新它(很可能每月一次).通常情况下,我一直在通过我设置的一堆网络服务将我的应用程序的其他部分的更新作为XML发送,但我现在正在处理的这个特定数据库非常大(大约20-30MB),而且我当我尝试以这种方式发送时出现超时错误.我尝试将数据库放在我的公司服务器上,然后将其下载到NSData对象中.然后我将该数据对象保存

  7. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  8. parser:parseErrorOccurred31#parser:parseErrorOccur

    GB2312或GBK编码的网页,要先用gb编码解码,然后替换其中的gb字符串,再用utf8编码成data给parser就能解析中文网页了。NSXMLParser将停止解析在遇到特殊字符后我读一个XML文件从谷歌天气api和解析它使用NSXMLParser。城市问题是巴黎。它不会处理之后像postal_code的标签。所以我的问题是,有什么办法可以从返回的URLXML字符串中删除所有非ascii字符吗?解决方法1:还行。然后我将字符串转换为NSdata然后把nsdata对象传递给我的NSXMLParser。

  9. Swift-使用NSXMLParser解析XML文件

    Update2015/12/01:UpdatedforXcode7.1.1(7B1005)andSwift2.1.Swift-使用NSXMLParser解析XML文件解析XML文件需要实现NSXMLParserDelegate协议,实现以下几个函数:具体代码实现:访问:http://www.oschina.net/action/api/news_list将页面保存为current_news_lis

  10. Swift开发:解析xml文件案例

    swift代码:结果:

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部