springMVC学习笔记(三)
springmvc
multipart形式数据
首先引入jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
前端:
1、需要form表单
2、需要method为post
3、enctype=multipart
4、file组件
<h2>
<fieldset>
<form action="/demo/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
<input type="submit" value="上传">
</form>
</fieldset>
</h2>
后端:
1、进行文件重命名
2、存储到磁盘(考虑同一目录文件过多,可以按照日期创建新的文件夹)
3、把文件存储路径更新到数据库
@RequestMapping(value = "/upload")
@ResponseBody
public ModelAndView upload(MultipartFile uploadFile, HttpSession session) throws IOException {
//处理上传文件
String originalFilename = uploadFile.getOriginalFilename();
//获取后缀
String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
//新名称
String newName= UUID.randomUUID().toString()+"."+ext;
//存储,存储到指定的文件夹,/upload/yyyy-MM-dd,考虑到文件过多的情况,按照日期生成子文件夹
String realPath = session.getServletContext().getRealPath("/uploads");
String datePath=new SimpleDateFormat("yyyy-MM-dd").format(new Date());
File folder=new File(realPath+"/"+datePath);
if (!folder.exists()){
folder.mkdirs();
}
uploadFile.transferTo(new File(folder,newName));
// TODO 更新到数据库字段
}
在springmvc中,我们需要在xml中配置文件上传解析器。
<!-- 多元素解析器
id固定为multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件大小上限,单位是字节,-1代表没有上限,也是默认的-->
<property name="maxUploadSize" value="5000000"></property>
</bean>
spring mvc 异常处理机制
springmvc 异常处理器
public class DemoController {
//springmvc 的异常处理机制(异常处理器)
//注意:写在controller中 只会对当前controller生效
@ExceptionHandler(ArithmeticException.class)
public void handlerException(ArithmeticException exception, HttpServletResponse response){
//处理逻辑
try {
response.getWriter().write(exception.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}
全局controller生效
//controller增强,可以让我们捕获所有controller对象handler方法抛出的异常
@ControllerAdvice
public class GlobalExceptionResolver {
//springmvc 的异常处理机制(异常处理器)
//注意:卸载controller 只会对当前controller生效
@ExceptionHandler(ArithmeticException.class)
public ModelAndView handlerException(ArithmeticException exception, HttpServletResponse response){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg", exception.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
重定向参数传递flash属性
1、拼接方式
@RequestMapping("handleRedirect")
public String handleRedirect(String name, RedirectAttributes redirectAttributes){
return "redirect:handle01?name="+name;//拼接参数安全性、长度都有局限
}
2、使用flash属性
//可以使用flash属性
//addFlashAttribute方法设置了一个flash属性,该属性会被暂存到session中,在跳转到页面之后,该属性值销毁。
redirectAttributes.addFlashAttribute("name",name);
return "redirect:handle01";