SpringMVC -- 文件上传、异常处理器和拦截器

SpringMVC 实现文件上传

1. 文件上传的必要前提
1. form 表单的 enctype(enctype 是表单请求正文的类型)取值必须是:multipart/form-data(默认值 application/x-www-form-urlencoded)
2. method 属性取值必须是 Post 
3. 提供一个文件选择域 < input type=”file” />
2. 文件上传示例
  • 上传文件需要的 jar 包
    <dependency>
      <groupId>commons-fileuploadgroupId>
      <artifactId>commons-fileuploadartifactId>
      <version>1.3.1version>
    dependency>
    <dependency>
      <groupId>commons-iogroupId>
      <artifactId>commons-ioartifactId>
      <version>2.4version>
    dependency>
  • 文件上传的 JSP 页面
	<h3>文件上传h3>
	<form action="user/fileupload" method="post" enctype="multipart/form-data">
		选择文件:<input type="file" name="upload"/><br/>
		<input type="submit" value="上传文件"/>
	form>
  • 控制器代码
@RequestMapping(value="/fileupload")   
public String fileupload(HttpServletRequest request,MultipartFile upload) throws Exception {
	System.out.println("SpringMVC方式的文件上传...");
	// 先获取到要上传的文件目录
	String path = request.getSession().getServletContext().getRealPath("/uploads");
	// 创建 File 对象,向该路径下上传文件
	File file = new File(path);
	// 判断路径是否存在,不存在则创建该路径
	if(!file.exists()) {
		file.mkdirs();
	}
	// 获取到上传文件的名称
	String filename = upload.getOriginalFilename();
	// 把文件的名称唯一化
	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	filename = uuid+"_"+filename;
	// 上传文件
	upload.transferTo(new File(file,filename));
	return "success";
}
  • 配置文件解析器对象
<!-- 配置文件解析器对象,要求 id 名称必须是 multipartResolver -->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="10485760"/>
</bean>

SpringMVC 异常处理

1. 异常处理思路

controller 调用 service、service 调用 dao,异常都是向上抛出的,最终由 DispatcherServlet 找异常处理器进行异常的处理

2. SpringMVC 的异常处理
  • 自定义异常类
package com.mvc.exception;

public class SysException extends Exception {
    //存储提示信息
    private String message;

   getter、setter 省略
}
  • 自定义异常处理器
package com.mvc.exception;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SysExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        //获取到异常对象
        SysException sysException = null;
        if (e instanceof SysException){
            sysException = (SysException) e;
        }else {
            sysException = new SysException("系统正在维护...");
        }

        //创建 ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        // 存入错误的提示信息
        mv.addObject("errorMsg",sysException.getMessage());
        // 跳转的 Jsp 页面
        mv.setViewName("error");
        return mv;
    }
}
  • 配置异常处理器

	<bean id="sysExceptionResolver" class="com.mvc.exception.SysExceptionResolver">bean>

SpringMVC 拦截器

1. 拦截器的概述
  • SpringMVC 框架中的拦截器用于对处理器进行预处理和后处理的技术
  • 拦截器和过滤器的功能比较类似,主要区别如下:
    • 过滤器是 Servlet 规范的一部分,任何框架都可以使用过滤器技术
    • 拦截器是 SpringMVC 框架独有的
    • 过滤器配置了 /*,可以拦截任何资源
    • 拦截器只会对控制器中的方法进行拦截
  • 拦截器是 AOP 思想的一种实现方式
  • 想要自定义拦截器,需要实现 HandlerInterceptor 接口
2. 自定义拦截器步骤
  • 编写一个普通类实现 HandlerInterceptor 接口
package com.mvc.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyIntercepter1 implements HandlerInterceptor {

    /**
     * 预处理,controller 方法执行前
     * return true:放行,执行下一个拦截器。如果没有,执行 conroller 方法
     * return false:不放行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor运行成功");
        return true;
    }
}
  • 配置拦截器

    <mvc:interceptors>
    
        <mvc:interceptor>
        
            <mvc:mapping path="/user/*"/>
            
            
            
            <bean class="com.mvc.interceptor.MyIntercepter1">bean>
        mvc:interceptor>
    mvc:interceptors>
3. HandlerInterceptor 接口中的方法
  • preHandle 方法
    • controller 方法执行前拦截的方法
    • 可以使用 request 或者 response 跳转到指定的页面
    • return true 表示放行,执行下一个拦截器,如果没有拦截器,执行 controller 中的方法
    • return false 表示不放行,不会执行 controller 中的方法
  • postHandle 方法
    • controller 方法执行后执行的方法,在 JSP 视图执行前
    • 可以使用 reques t或者 response 跳转到指定的页面
    • 如果指定了跳转的页面,那么 controller 方法跳转的页面将不会显示
  • afterCompletion 方法
    • 在 JSP 执行后执行
    • request 或者 response 不能再跳转页面

你可能感兴趣的:(SpringMVC -- 文件上传、异常处理器和拦截器)