smalllove 2019-12-24
1. 全局类型转换器
写一个类实现实现converter<S,T>接口,在springmvc的配置文件中配置一个FormattingConversionServiceFactoryBean 类,在类里面给converters属性赋值,converters是set类型的集合,用set标签赋 值,值为实现converter<S,T>接口的全类名,最后在Mvc:annotation-driven标签配置一个converservice-service属性,属性名是FormattingConversionServiceFactoryBean 所在bean的id
2.局部类型转换器
使用注解@DateTimeFormat:时间类型的类型转换器,指定pattern属性值,可以放在参数上或者bean类中的属性名上
@NumberFormat:数值类型的类型转换器,指定pattern属性值,可以放在参数上或者bean类中的属性名上
3.文件上传
前端:需要在表单上设置encype 属性,值为“multipart/form-data”。
后台:方法参数上写MultipartFile file参数接收文件。
导包:commons-fileupload.jar commons-io.jar
配置SpringXMl: 配置一个多媒体解析器:CommonsMultiPartResolver,设置defaultEncoding (编码)和MaxUploadSize (文件大小)属性值
实现:
//获取jsp域对象
ServletContext context = request.getServletContext();
//获取真实路径
String realPath = context.getRealPath("/upload");
//获取路径
File directory = new File(realPath);
//没有就创建
if(!directory.exists()) {
directory.mkdirs();
}
//处理文件名
String fileName = UUID.randomUUID().toString().replaceAll("-","")+file.getOriginalFilename();
//写入文件
FileOutputStream fos = new FileOutputStream(new File(realPath+"/"+fileName));
//获取文件的输入流
InputStream in = file.getInputStream();
//把上传输入流copy给输出流
IOUtils.copy(in, fos);
//关流
in.close();
fos.close();
//完成
4.文件下载
1.方法返回值为ResponseEntity
2.设置响应头信息
实现:
//获取文件真是路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/"+fileName);
//输入流读取文件
FileInputStream fis = new FileInputStream(new File(realPath));
//把文件读到字节数组
byte[] body = new byte[fis.available()];(fis.available())为文件的大小
fis.read(body);
//获取头
MultiValueMap<String, String> headers = new HttpHeaders();
//处理文件编码
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
//设置头信息
headers.add("Content-Disposition", "attachment;filename="+fileName);
//设置状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(body, headers, statusCode);
//返回ResponseEntity 对象
return responseEntity;
//完成
5.拦截器(Interceptor)
写一个类实现HanderInterceptor接口
实现方法 * preHandle:在目标方法执行之前执行
* 返回值:boolean类型,true表示放行该请求,false表示拦截该请求
* 作用:日志、权限验证、获取连接
postHandle:在目标handler方法执行之后,在视图渲染(render)之前【给页面填充数据】执行
* 作用:修改域中的值,用的不多
*/
* afterCompletion:在目标handler方法执行之后,在视图渲染(render)之后【给页面填充数据】执行
* 作用:释放资源,用的不多。
在SpringXML中配置mvc:interceptors,并在创建内部bean配置该拦截器(实现HandlerIntercepter的类)
拦截器执行顺序:preHandle--->目标方法--->postHandle?渲染视图?afterCompletion
多拦截器执行顺序:按照mvc:interceptors中前后顺序执行
mvc:interceptors的子标签:mvc:intercepto 属性有<mvc:mapping path=""> 拦截路径 <mvc:excude-mapping path=""> 直接放行的资源 (放行的优先级高 )
多个拦截器方法执行顺序 :按顺序先执行所有拦截器的 preHandle,执行目标方法,倒序执行postHandle,渲染视图,倒叙执行afterCompletion
6.SpringMVC的运行流程图
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象进行绑定。加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。