目录
1、处理Json的过程
核心是转换器HttpMessageConverter<T>
1.1 HttpMessageConverter<T>接口
HttpMessageConverter<T> 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息
同时,框架内部也为我们准备好了实现类(也允许我们添加第三方实现类,比如我们用json,就需要添加jackson jar包,最后就是json实现类)
使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入 参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径(就是我们需要做的事情):
①注解法: 使用 @RequestBody / @ResponseBody 对处理方法进行标注 (普通的回显内容)
②入参法: 使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值 (一般用于文件下载效果)
当控制器处理方法使用到 @RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错
案例演示1:用ajax技术处理(页面不发生变化,需要通过Js向服务端发送请求)前后端传输Json对象( 使用 @RequestBody / @ResponseBody )
非常简单,只需要在方法上加入@ResponseBody注解
处理JSON具体步骤:
(1)加入jar包
(2)编写目标方法,使其返回JSON对应的对象或集合(不是java类型的,可以被js解析后显示给客户)
(3)在方法上添加@ResponseBody注解
回到主页面input.jsp,我们用jQuery来写ajax代码简洁的多。首先就要导入jquery和js,然后写好访问代码
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function(){
$("#testJson").click(function(){
var url = this.href;
var args = {};
$.post(url, args, function(data){
for(var i = 0; i < data.length; i++){
var id = data[i].id;
var lastName = data[i].lastName;
alert(id + ": " + lastName);
}
});
return false;
});
})
</script>
</head>
<body>
<a href="emps">List All Employees</a>
<br><br>
<a href="testJson" id="testJson">Test Json</a>
<br><br>
</body>
进入服务端,springmvctest.java类 在处理json的方法上,添加一个@ResponseBody属性,就可以返回一个集合,获取employee的所有信息
package com.atguigu.springmvc.test;
@Controller
public class SpringMVCTest {
@Autowired
private EmployeeDao employeeDao;
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee> testJson(){
return employeeDao.getAll(); //employeeDao是类的私有属性,而且注入了内容,因此这里才可以直接用
}
}
这里有入参,用一个@RequestBody标注,可以告诉SpringMvc该用哪一种转换器处理
package com.atguigu.springmvc.test;
@Controller
public class SpringMVCTest {
@Autowired
private EmployeeDao employeeDao;
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "helloworld! " + new Date();
}
}
案例演示2:下载效果(使用HttpEntity<T> / ResponseEntity<T>)
进入index.jsp
<a href="testResponseEntity">Test ResponseEntity</a>
然后进入springmvctest.java编写服务端
package com.atguigu.springmvc.test;
@Controller
public class SpringMVCTest {
@Autowired
private EmployeeDao employeeDao;
@RequestMapping("/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
byte [] body = null;
ServletContext servletContext = session.getServletContext();
InputStream in = servletContext.getResourceAsStream("/files/abc.txt");
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=abc.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}
}
点击后,即可直接下载