处理器方法也可以返回Object对象。这个Object可以是Integer,String,自定义对象, Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。 返回对象,需要使用@ResponseBody注解,将转换后的JSON数据放入到响应体中。
实现步骤:
1.在pom.xml中加入处理json的工具库的依赖,springmvc默认使用的jackson:
由于返回Object数据,一般都是将数据转化为了JSON对象后传递给浏览器页面的。而 这个由Object转换为JSON,是由消息转换器HttpMessageConverter底层使用Jackson工具完成的,所以需要导入Jackson 的相关Jar包。
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
2.在springmvc配置文件中加入 <mvc:annotation-driven> 注解驱动:
注解驱动涉及到了消息转换器接口
<!-- 注册mvc的注解驱动 -->
<mvc:annotation-driven/>
作用:<mvc:annotation-driven/>在加入到springmvc配置文件后,会自动创建消息转换器HttpMessageConverter接口的7个实现类对象,完成java对象到json、xml、text、二进制等数据格式的转换。(这里:将JAVA对象转换为JSON格式的数据 )
ObjectMapper om = new ObjectMapper();
json = om.writevalueAsString(student);
3.在处理器方法的上面加入@ResponseBody注解:
作用:通过HttpServletResponse应答对象,将转换后的JSON数据放入到响应体中,输出给浏览器
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.printIn(json);
HttpMessageConveter接口 :消息转换器。
注解驱动涉及到了消息转换器接口。
功能:定义了java转为json,xml,二级制,text等数据格式的方法。 这个接口有很多的实现类
这些实现类完成 java对象到json , java对象到xml,java对象到二进制等数据的转换
<mvc:annotation-driven/>在加入到springmvc配置文件后,会自动创建消息转换器HttpMessageConverter接口的7个实现类对象,包括 MappingJackson2HttpMessageConverter ( 使用jackson工具库中的ObjectMapper实现java对象转换成json字符串:
ObjectMapper om = new ObjectMapper();
json = om.writevalueAsString(student);
@Controller
@RequestMapping("/data")
public class MyController4 {@RequestMapping("/single.do")@ResponseBodypublic Student doJsonObject(){//创建java对象,转为jsonStudent student = new Student("李四",22,"lisi@qq.com");return student;}@RequestMapping("/list.do")@ResponseBodypublic List<Student> doJsonArray(){//创建List对象,转为jsonArrayList<Student> students = new ArrayList<>();students.add(new Student("李四",22,"lisi@qq.com"));students.add(new Student("王五",23,"wangwu@qq.com"));return students;}@RequestMapping(value = "/string.do",produces = "text/palin;charset = utf-8")@ResponseBodypublic String doStringData(String name , Integer age){return "有ResponseBody注解,返回String就是数据";}
}
当返回值为String类型时:
当处理器方法返回的是String时,区分返回值String是数据,还是视图,就看有没有@ResponseBody注解,如果有ResponseBody注解,返回String就是数据,反之就是视图
默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码。
解决方案:
RequestMapping增加一个属性 produces,使用这个属性指定新的contentType,设置输出结果类型。
@RequestMapping(value = "/string.do",produces = "text/palin;charset = utf-8")@ResponseBodypublic String doStringData(String name , Integer age){return "有ResponseBody注解,返回String就是数据";}