遇到问题:
@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中有个内容协商原则。
@H_403_303@
@H_502_311@简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。
@H_502_311@
@H_502_311@Accept: application/xml 将返回xml格式数据
@H_502_311@Accept: application/json 将返回json格式数据
@H_502_311@
@H_502_311@优点:是这种方式是理想的标准方式
@H_502_311@缺点:是由于浏览器的差异,导致发送的Accept Header头可能会不一样,从而导致服务器不知要返回什么格式的数据
@H_502_311@
@H_502_311@二:根据扩展名来判断,比如:
@H_502_311@/mvc/test.xml 将返回xml格式数据
@H_502_311@/mvc/test.json 将返回json格式数据
@H_502_311@/mvc/test.html 将返回html格式数据
@H_502_311@
@H_502_311@缺点:丧失了同一URL的多种展现方式。在实际环境中使用还是较多的,因为这种方式更符合程序员的习惯
@H_502_311@三:根据参数来判断
@H_502_311@/mvc/test?format=xml 将返回xml数据
@H_502_311@/mvc/test?format=json 将返回json数据
@H_502_311@缺点:需要额外的传递format参数,URL变得冗余繁琐,缺少了REST的简洁风范
@H_502_311@
@H_502_311@<!--1、检查扩展名(如my.pdf);2、检查Parameter(如my?format=pdf);3、检查Accept Header-->
@H_502_311@ <bean id="contentNegotiationManager"class="org.springframework.web.accept.ContentNegotiationManagerfactorybean">
@H_502_311@ <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
@H_502_311@ <!-- 是否忽略Accept Header -->
@H_502_311@<property name="mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension,favorParameter是true时起作用 -->
@H_502_311@ <value>
@H_502_311@ccjson=application/json
@H_502_311@ccxml=application/xml
@H_502_311@ html=text/html
@H_502_311@ </value>
@H_502_311@ </property>
@H_502_311@ <!-- 默认的content type -->
@H_502_311@ </bean>
@H_502_311@
@H_502_311@<mvc:annotation-driven
@H_502_311@ validator="validator"
@H_502_311@ conversion-service="conversionService"
@H_502_311@content-negotiation-manager="contentNegotiationManager"
@H_502_311@ >
@H_502_311@</mvc:annotation-driven>
@H_502_311@
@H_502_311@现在对这段做下补充,经过测试发现:这边的3个规则是有优先顺序的,spring会优先匹配favorPathExtension(检查扩展名),其次匹配剩余2个规则,
<!-- 指定数据转换管理器 -->
<
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,
@H_502_311@contentNegotiateManager就会认为你请求的内容类型(Content-Type)为application/json,那么它就要将响应的内容类型(Content-Type)设置为application/json,最终HttpMessageConverter能将你的json正确返回给前台。
@H_502_311@总结:想要利用spring自己的
@H_502_311@HttpMessageConverter
@H_502_311@自动转成json的方式,那么需要了解其的内容协商规则,当然如果在返回之前手动转成json格式的数据,那么就可以一招制敌了。
-
Accept:application/json,text/javascript,*/*; q=0.01
-
Accept-Encoding:gzip,deflate,br
-
Accept-Language:zh-CN,zh;q=0.8
-
Connection:keep-alive
-
Content-Length:4
-
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
-
Cookie:JSESSIONID=61B1FF442274EE9364FB05318EFDA30A; __utma=111872281.1109517436.1491358058.1492066273.1492070833.3; __utmz=111872281.1491358058.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
-
Host:localhost:8080
-
Origin:http://localhost:8080
-
Referer:http://localhost:8080/springmvc_sun_12_1/user/userAdmin.html
-
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/57.0.2987.98 Safari/537.36
-
X-Requested-With:XMLHttpRequest