Spring框架深入(五)--文件上传和异常处理
一、文件上传
在我们的日常生活中,经常会遇到与文件上传相关的。比如,注册账号时头像的上传;而SpringMVC也提供了支持文件上传的方法;我们就来简单的看一个案例;
1、引入支持文件上传的jar包(当然也需要SpringMVC的必需包);
2、写一个上传页面
<body> <form action="upload.action" method="post" enctype="multipart/form-data"> <input type="text" name="username"/><br> <input type="file" name="pic"/><br> <input type="submit"/> </form> </body>
这儿需要注意的是:传递的方法应为:post;还需要设置一个enctype="multipart/form-data";否则无法完成上传;
enctype:HTML表单如何打包数据文件是由enctype这个属性决定的。enctype有以下几种取值:
application/x-www-form-urlencoded
在发送前编码所有字符(默认)(空格被编码为’+’,特殊字符被编码为ASCII十六进制字符)
multipart/form-data
不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain
空格转换为 “+” 加号,但不对特殊字符编码。
3、书写controller层代码:
@Controller public class UploadController { @RequestMapping("upload.action") public String upload(String username,MultipartFile pic) throws IllegalStateException, IOException { System.out.println(username); //得到原始路径 String originFileName = pic.getOriginalFilename(); if(pic!=null && originFileName!=null && originFileName.length()>0) { //图片上传的物理路径 String pic_path="d:\\temp\\"; File file=new File(pic_path+originFileName); //上传动作 pic.transferTo(file); } return "result"; } }
在这里,图片的原始路径使用MultipartFile类型的参数来接收;
需要注意的是:图片上传的物理路径需要提前创建好;
4、在SpringMVC配置文件中配置支持文件上传的类为Spring中的一个bean;这里SpringMVC为我们提供了一个支持文件上传的类;
<!-- 配置支持文件上传的类作为Spring中的一个bean --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
到这里,一个简单的文件上传案例就完成了;
二、异常处理
1、异常处理机制:
从图上我们可以看出,当异常被抛到SpringMVC这个巨大的Servlet时,它就会被交给HandlerExceptionResolver,然后这个方法会从异常列表中找到对应的视图,如果找到了,就会返回给客户端,如果没有,就会返回一个异常堆栈;
常见的异常代码对应关系:
2、除了使用程序已经从定义好的异常类之外,我们还可以自定义异常类,返回我们想要的视图;
(1)、自定义一个异常类,继承Exception类;
/* * 全局异常类:其他所有的异常都变成该类的异常 * 从而实现其他所有异常都能定位在一个错误页面 * */ public class MyDefineGlobalException extends Exception { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MyDefineGlobalException(String message) { super(); this.message=message; } }
(2)、定义一个异常处理类,实现HandlerExceptionResolver接口;
public class GlobalExceptionHandler implements HandlerExceptionResolver { /* * ModelAndView:异常要返回的页面 * arg3:到底抛出了哪种异常--MyDefineGlobalException * 异常--页面 * */ @Override public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) { MyDefineGlobalException myExp = null; if(arg3 instanceof MyDefineGlobalException) { myExp = (MyDefineGlobalException) arg3; }else { myExp = new MyDefineGlobalException("未知异常"); } //将异常信息返回到页面 ModelAndView mv=new ModelAndView(); mv.addObject("msg",myExp.getMessage()); mv.setViewName("error"); return mv; } }
(3)、自定义一个错误页面;我们这儿就简单的写一个;
<body> error:${msg } </body>
显示它的异常信息;
(4)、在SpringMVC中配置异常处理的bean;
<!-- 配置异常处理器 --> <bean class="exception.GlobalExceptionHandler"></bean>
(5)、测试结果:
到这儿,一个简单的自定义异常处理也就完成了;
PS:因作者能力有限,如有误还请谅解;