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:因作者能力有限,如有误还请谅解;

猜你喜欢

转载自www.cnblogs.com/WHL5/p/9104001.html