暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringMVC 12 请求参数返回值 Object

敲代码的人 2019-10-02
241

处理器方法也可以返回Object 对象。这个 Object 可以是 Int e ger S tring 自定义对象,Map List 等。但返回的 对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody 注解, 将转换后的 JSON 数据 放入到响应体中。


注册注解驱动

将Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转换器的开启,需要由 <mvc:annotation driven/> 来完成。在spring5.0中,使用注解开发的时候就需要这个.在5.0之前可以不写.但是将数据转为json还是需要的

SpringMVC使用消息转换器实现请求 数据 和对象 ,处理器方法返回 对象和响应 输出 之间的自动转换

当Spring 容器进行初始化过程中,在 <mvc:annotation driven/> 处创建注解驱动时,默认创建了七个 HttpMessageConverter 对象。也就是说,我们注册 <mvc:annotation driven/>,就是为了让容器为我们创建 HttpMe ssageConverter 对象。



HttpMessageConverter接口 : HttpMessageConverter<T> 是 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<MediaType> 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<Student> test_list_ajax(){
Student student1 = new Student();
student1.setName("浪里虎哥1");
student1.setAge(12);
Student student2 = new Student();
student2.setName("浪里虎哥2");
student2.setAge(13);
List<Student> 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 再解<url pattern/>

SpringMVC 04 执行流程的简单原码分析分析

SpringMVC 03 视图解析器及简述执行流程

SpringMVC 02 概述及配置式入门

SpringMVC 01 前述 三层架构和MVC设计模式

文章转载自敲代码的人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论