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-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</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>
<!-- 要拦截的具体方法
path = /user/* 表示拦截当前类下的所有方法
path = /** 表示拦截所有方法 -->
<mvc:mapping path="/user/*"/>
<!--不要拦截的方法-->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<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 不能再跳转页面