处理器方法也可以返回Object 对象。这个 Object 可以是 Int e ger S tring 自定义对象,Map List 等。但返回的 对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody 注解, 将转换后的 JSON 数据 放入到响应体中。
注册注解驱动
将Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转换器的开启,需要由 来完成。在spring5.0中,使用注解开发的时候就需要这个.在5.0之前可以不写.但是将数据转为json还是需要的
SpringMVC使用消息转换器实现请求 数据 和对象 ,处理器方法返回 对象和响应 输出 之间的自动转换
当Spring 容器进行初始化过程中,在 处创建注解驱动时,默认创建了七个 HttpMessageConverter 对象。也就是说,我们注册 ,就是为了让容器为我们创建 HttpMe ssageConverter 对象。
HttpMessageConverter接口 : HttpMessageConverter 是 Spring3.0 新添加的一个接 口,负责将请求信息转换为一个对象(类型为 T ),将对象 类型为 T )输出为响应信息
一共有五个接口
boolean canRead(Class> clazz,MediaType mediaType): 指定转换器 可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对 象,同时指定支持 MIME 类型(text/html,applaiction/json 等
boolean canWrite(Class> clazz,MediaType mediaType): 指定转换器 是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型 在 MediaType 中定义。LIst getSupportMediaTypes():该转换器支持的媒体类型。
T read(Class extends T> clazz,Htt pInputMessage inputMessage) 将请求信息流转换为 T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写到响应流中,同时指定相应的媒体类 型为 contentType
springMVC默认使用Jackson工具帮助我们转换,所以需要加入对应坐标
常用的实现类是作用
返回字符串对象(Object)-String
String表示数据,和视图无关
处理器方法返回String区分数据还是视图?
看处理器方法上面是否有@ResponseBody
1.有@ResponseBody, String就是数据
2.没有@ResponseBody,String就是视图
index2.jsp页面
<script>
$(function () {
$("button").click(function () {
$.ajax({
url:"test01/test_string_ajax.do",
type : "post",
dataType:"json",
success :function (request) {
alert(request);
}
})
})
})
script>
控制器
@RequestMapping(value = "test_string_ajax")
@ResponseBody
public String test_string_ajax(){
return "Hello SpringMVC HttpMessageConverter";
}
测试:因为页面返回接口的是一个json,但是要给字符串不能转成json所以会报错
把页面代码dataType:"json",去掉测试,现在个前端响应一个正常的字符串
需要注意的是响应头信息为text/plain;charset=ISO-8859-1,此时响应中文会有问题返回的字符串中带有中文字符,则接收方页面将会出现乱码。此时需要使用@RequestMapping 的 produces 属性 指定字符集 。
@RequestMapping(value = "test_string_ajax",produces = "text/plain;charset=utf-8")
响应对象
返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为 JSON 格式的数据发送给浏览器的。
由于转换器底层使用了Jackson 转换方式将对象转换为 JSON 数据,所以需要导入 Jackson的相关(坐标)。
index2.jsp
<script>
$(function () {
$("button").click(function () {
$.ajax({
url:"test01/test_object_ajax.do",
type : "post",
dataType:"json",
success :function (request) {
alert(request.name + " ," + request.age);
}
})
})
})
script>
controller类
@RequestMapping(value = "test_object_ajax")
@ResponseBody
public Student test_object_ajax(){
Student student = new Student();
student.setName("浪里虎哥");
student.setAge(12);
return student;
}
测试:
处理器方法返回对象的内部处理过程:
1.框架根据处理器方法返回值的数据类型, 遍历HttpMessageConverter接口的实现类,判断哪个实现类能处理这种返回值类型。String-StringHttpMessageConveger
2.使用HttpMessageConverter的实现类,调用它的write方法,把返回值对象转为需要的数据格式(文本,json,xml等)String的返回值转为 iso-8859-1编码的文本字符串
3.使用@ResponseBody,把2中的结果数据,通过应答对象的输出流,输出到浏览器。
返回lIst
index2.jsp
<script>
$(function () {
$("button").click(function () {
$.ajax({
url:"test01/test_list_ajax.do",
type : "post",
dataType:"json",
success :function (request) {
//alert(request.name + " ," + request.age);
$(request).each(function (index) {
alert(request[index].name + request[index].age);
})
}
})
})
})
script>
controller
@RequestMapping(value = "test_list_ajax")
@ResponseBody
public List test_list_ajax(){
Student student1 = new Student();
student1.setName("浪里虎哥1");
student1.setAge(12);
Student student2 = new Student();
student2.setName("浪里虎哥2");
student2.setAge(13);
List students = new ArrayList<>();
students.add(student1);
students.add(student2);
return students;
}
测试
喜欢转发
明天见
SpringMVC 11 请求参数返回值void
SpringMVC 10 处理器方法的返回值(ModelAndView和String))
SpringMVC 09 请求参数中文乱码问题
SpringMVC 08 请求参数绑定
SpringMVC 07 @RequestMapping说明
SpringMVC 06 注解式开发入门
SpringMVC 05 再解
SpringMVC 04 执行流程的简单原码分析分析
SpringMVC 03 视图解析器及简述执行流程
SpringMVC 02 概述及配置式入门
SpringMVC 01 前述 三层架构和MVC设计模式