环境:
1.页面编码为utf-8
2.tomcat8
3.jdk1.8
4.spring-mvc
演示正常状态
@ResponseBody将List<Room>对象转换成json字符串返回给页面
// 控制层
@RequestMapping(value = "room")
@ResponseBody
public List<Room> findRoom() {
return roomService.findRoom();
}
<script>
$(function () {
$.get({
url: "http://localhost:8080/room",
dataType:"json",
success: function (list){
//拼接
var html = "";
$.each(list, function (index, province) {
html += "<option value=" + province.id + ">" + province.name + "</option>";
});
$("#room").append(html);
$("option").show();
},
error: function () {
alert("error");
}
})
})
</script>
出现?的状态
使用ObjectMapper.writeValueAsString(对象)方法先转换成json字符串, 再返回String数据
//控制层
@RequestMapping(value = "room")
@ResponseBody
public String findRoom() throws JsonProcessingException {
List<Room> room = roomService.findRoom();
return new ObjectMapper().writeValueAsString(room);
}
前端与上图一样
查找问题过程:
A、猜测1:出现?, 初步怀疑是编码问题
做法: 重新对返回的json字符串做各种编码, 尝试了ISO-8859-1,gbk, 最后用utf-8
结果:
尝试了各种编码。
发现ObjectMapper.writeValueAsString(对象)返回的就是编码为UTF-8的字符串, 则推翻猜测1。
B、猜测2:controller层返回的编码、数据都没问题, 问题应该出在前端页面!
做法:
sou一下发现,
ajax发异步请求给controller处理返回的时候, 有出现中文乱码的情况,
最后要在@RequestMapping里面加入produces = "text/json;charset=UTF-8"才能显示正常
【ps: 属性produces可以设置返回数据的类型以及编码,
要与@ResponseBody一起使用】
@RequestMapping(value = "room",produces = "text/json;charset=UTF-8")
@ResponseBody
public String findRoom() throws JsonProcessingException {
List<Room> room = roomService.findRoom();
String s = new ObjectMapper().writeValueAsString(room);
return s;
}
结果:一切正常。页面正常显示中文,修改效果如图1。
以下是响应头数据:
结论:
第一种方法用@ResponseBody直接将返回对象List<Room>转换为json字符串,自动帮我们指定返回数据类型以及编码。
第二种方法在代码中先用ObjectMapper.writeValueAsString(对象)转换为json字符串,再返回String, 此时@ResponseBody没指定编码,
而在@RequestMapping里面加入produces = "text/json;charset=UTF-8"
指定编码与返回类型, 数据才能正常
ps:
1.方法2不支持修改String编码为ISO--8859-1返回给页面, 因为页面是utf-8编码, 还是会乱码
2.方法2感觉@ResponseBody没做事, 但是不能删掉, 不加会返回404错误。
详情查询资料就是说:
因为RequestMappingAdapt 在处理返回结果时,
会有很多个HandlerMethodReturnValueHandler,
而具体选择那个 则是通过 HandlerMethodReturnValueHandlerComposite.selectHandler()来寻找,
如果没有指定 @ResponseBody,这里就会匹配到一个 ViewNameMethodReturnValueHandler,
它回去寻找一个jsp的视图,而这个jsp视图不存在的话就会报404
2020.01.06更新:
★、在方法内
response.setContentType("text/json;charset=UTF-8");
亦不会生效
详细原理请参考:
https://www.cnblogs.com/kaiblog/p/7565231.html