SpringMVC处理Json
①.引入依赖
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
②.编写处理类
@ResponseBody
@RequestMapping("/testjson")
public List<User> testJson() {
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "admin", 22, "admin@163.com"));
userList.add(new User(2, "admin", 22, "admin@163.com"));
userList.add(new User(3, "admin", 22, "admin@163.com"));
userList.add(new User(4, "admin", 22, "admin@163.com"));
return userList;
}
③.测试
HttpMessageConverter<T>
HttpMessageConverter<T>是spring3.0新增的一个接口,负责将请求信息转换为一个对象(类型为T),将对象(类型T)输出为响应信息
实现类:
使用HttpMessageConverter<T>
- 使用HttpMessageConverter<T>将请求信息转换并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,spring提供了两种途径:
--使用@requestBody / @responseBody对处理方法进行标注
--使用HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或者返回值
- 当控制器处理方法用到@requestBody / @responseBody 或HttpEntity<T> / ResponseEntity<T> 时,spring首先根据请求头或响应头的Accept 属性选择匹配的HttpMessageConterver , 进而根据参数类型或泛型类型过滤得到匹配的HttpMessageConterver ,若找不到可用的HttpMessageConterver 将报错
- @requestBody / @responseBody不需要成对出现
@requestBody / @responseBody 示例
@requestBody json-->对象
@responseBody 对象-->json
<!--测试 @requestBody / @responseBody -->
<form action="/testHttpMessageConverter" method="POST" enctype="multipart/form-data">
File: <input type="file" name="file"/>
Desc: <input type="text" name="desc"/>
<input type="submit" value="Submit"/>
</form>
/**
*
* @Title: testHttpMessageConverter
* @Description:
* @RequestBody: 将请求类型转为字符串
* @ResponseBody 将响应类型转为字符串
* @param: @param body
* @param: @return
* @return: String
* @throws
*/
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
System.out.println(body);
return "helloworld! " + new Date();
}
上传桌面上的aaa.txt
HttpEntity<T> / ResponseEntity<T> 示例
如下的文件下载.
文件上传
• spring MVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver(接口)实现的。Spring 用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResovlerSpring
• Spring MVC 上下文中默认没有装配MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用Spring 的文件上传功能,需现在上下文中配置MultipartResolver
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1-jenkins-1</version>
</dependency>
②.配置CommonsMultipartResolver
<!-- 配置 MultipartResolver 来上传文件 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</bean>
③.编写控制类
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
throws IOException {
System.out.println("desc: " + desc);
System.out.println("OriginalFilename: " + file.getOriginalFilename()); //原始文件名
System.out.println("InputStream: " + file.getInputStream()); //输入流
// 方式一:通过流的方式上传文件
OutputStream os = new FileOutputStream("E:/" + new Date().getTime() + file.getOriginalFilename());
InputStream is = file.getInputStream();
int temp;
// 一个一个字节的读取并写入
while ((temp = is.read()) != (-1)) {
os.write(temp);
}
os.flush();
os.close();
is.close();
//方式二:采用file.Transto 来保存上传的文件
/*System.out.println("fileName:" + file.getOriginalFilename());
String path = "E:/" + new Date().getTime() + file.getOriginalFilename();
File newFile = new File(path); // 通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(newFile);*/
//可以保存到webapp目录下的upload文件夹
/*String path = request.getSession().getServletContext().getRealPath("upload");
String fileName = file.getOriginalFilename();
System.out.println(path);
File targetFile = new File(path, fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
file.transferTo(targetFile);*/
return "success";
}
④.编写jsp
<!--文件上传 -->
<form action="/testFileUpload" method="POST" enctype="multipart/form-data">
File: <input type="file" name="file"/>
Desc: <input type="text" name="desc"/>
<input type="submit" value="Submit"/>
</form>
文件下载
下载webapp下file/abc.txt
①.编写jsp
<a href="testResponseEntity">Test ResponseEntity</a>
②.编写控制层
/**
*
* @Title: testResponseEntity
* @Description: 文件下载
* @param: @param session
* @param: @return
* @param: @throws IOException
* @return: ResponseEntity<byte[]>
* @throws
*/
@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;
}