① 文件上传表单三要素
- method = "post"
- enctype = "multipart/form-data"
- 上传项 type = "file"
② 示例
<form action="/file" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" />
文件名:<input type="file" name="uploadfile" />
<input type="submit" value="上传"/>
</form>
① 依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
② 文件上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 编码格式 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 最大上传大小 -->
<property name="maxUploadSizePerFile" value="10240000" />
</bean>
③ controller
@RequestMapping("/file")
@ResponseBody
public void uploadFile(String username, MultipartFile uploadfile) throws IOException {
//获取后缀
String sname = uploadfile.getOriginalFilename();
String sub = sname.substring(sname.lastIndexOf("."), sname.length());
//修改文件名
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
String name = sdf.format(new Date()) + new Random().nextInt(100) + "_username=" + username + sub;
//保存文件至磁盘
uploadfile.transferTo(new File("C:\\Users\\Demo_Null\\Desktop\\" + name));
}
# 多文件上传
- 在页面写多个 file, name 不同,后台接收多个
- 在页面写对各 file, name 相同,后台使用同名数组接收
<mvc:interceptors>
<!-- 一个拦截器,可配多个 -->
<mvc:interceptor>
<!-- 拦截路径 -->
<mvc:mapping path="/**" />
<!-- 定义的拦截器 -->
<bean class="全限定名" />
</mvc:interceptor>
</mvc:interceptors>
# 不拦截某个路径 <mvc:exclude-mapping path="/login/**" />
# 拦截器需要实现 HandleInterceptor 接口并复写 proHandle、hostHandle、afterCompletion方法
① 单个拦截器
- proHandle 先于 Controller 执行【返回值为 true 时放行, false 拦截】
- Controller 执行完成后 视图渲染前 hostHandle 执行
- 整个过程完成后 afterCompletion 执行【proHandle 放行后,不论后面是否成功,此拦截器 afterCompletion 都会执行】
② 多个拦截器
- proHandle 顺序执行
- hostHandle、afterCompletion 逆序执行
# 此处顺序为 配置文件定义拦截器的先后顺序
① 使用范围
- 过滤器
* 只要是 web 项目中都可以使用 过滤器和拦截器
- 拦截器
* 只有 SpringMVC 项目才能使用 拦截器
② 作用范围
- 过滤器
* 配置了 /* 之后 所有资源都会被拦截
- 拦截器
* 配置了 /** 之后对于 HTML、JS、CSS、img等资源不会拦截,只能拦截 Controller 的方法
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
<!-- 默认异常处理 -->
<property name="defaultErrorView" value="error" />
<!-- 指定异常处理 -->
<property name="exceptionMappings" >
<map>
<entry key="异常全限定名" value="视图名称" />
</map>
</property>
</bean>
① 创建一个 异常类, extends Exception implement HandleExceptionResolver 并 复写 resolverException 方法
② 声明一个异常处理器
<bean id="exceptionResolver" class="自定义异常全限定名"/>
# 只有配置了自定义异常 且 抛出了 自定义异常 才会进入异常处理