处理JSON
加入jar包
jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
修改springMVC.xml
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
编写处理器方法
增加页面链接
HttpMessageConverter原理
HttpMessageConverter
1)HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息
2)HttpMessageConverter接口定义的方法:
-
①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,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
-
⑤void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
-
-
3)DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,
而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
4)加入 jackson jar 包后, RequestMappingHandlerAdapter
装配的 HttpMessageConverter 如下:
文件下载
@Controller
public class SrpingMVCHandler {
/**
* 使用HttpMessageConveter完成下载功能:
*
* 支持 @RequestBody @ResponseBody HttpEntity ResponseEntity
*
* 下载的原理: 将服务器端的文件 以流的形式 写到 客户端.
* ResponseEntity: 将要下载的文件数据, 以及响应信息封装到ResponseEntity对象中,浏览器端通过解析
* 发送回去的响应数据, 就可以进行一个下载操作.
*/
@RequestMapping(value = "/download")
public ResponseEntity<byte[]> testPara(HttpSession session) throws Exception {
//将响应数据 以及一些响应头信息封装到ResponseEntity中
//发送给浏览器端的数据
InputStream in = session.getServletContext().getResourceAsStream("images/aa.jpg");
byte [] imgs = new byte[in.available()];
in.read(imgs);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=songlaoshi.jpg");
//设置响应码
HttpStatus statusCode = HttpStatus.OK; // 200
return new ResponseEntity<byte[]>(imgs, headers, statusCode);
}
}
文件上传
简介
1)SpringMVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的
2)Spring用** Jakarta Commons FileUpload**技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver
3)配置 MultipartResolver
defaultEncoding:必须和用户JSP的pageEncoding属性一致,以便正确解析表单的内容,为了让CommonsMultipartResolver正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的添加到类路径下。
代码
加入jar
commons-fileupload-1.2.1.jar
commons-io-2.0.jar
配置文件上传解析器
修改springmvc.xml
<!-- 配置文件上传解析器
id必须是"multipartResolver",否则,会报错误:
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</bean>
上传页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="testUpload" method="post" enctype="multipart/form-data">
文件: <input type="file" name="file"/><br><br>
描述: <input type="text" name="desc"/><br><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
控制器方法
@Controller
public class SrpingMVCHandler {
@RequestMapping(value = "/testUpload", method=RequestMethod.POST)
public String testParam(@RequestParam("desc")String desc,
@RequestParam("file")MultipartFile multipartFile,
HttpSession session) throws Exception {
//获取到上传文件的名字
String uploadFileName = multipartFile.getOriginalFilename();
// 获取服务器端的upload文件夹的真实路径
String realPath = session.getServletContext().getRealPath("uploads");
File targetFile = new File(realPath + "/" + uploadFileName);
System.out.println(realPath);
/*
//获取输入/输出流
InputStream in = multipartFile.getInputStream();
FileOutputStream os = new FileOutputStream(targetFile);
//写文件
int i ;
while((i = in.read())!=-1) {
os.write(i);
}
in.close();
os.close();
*/
multipartFile.transferTo(targetFile);
return "success";
}
}