用户注册-文件上传
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.3version>
dependency>
注意:
- 在SpringMVC.xml中配置文件解析器
- 文件解析器的Id,必须为"multipartResolver"
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10485600"/>
<property name="maxUploadSizePerFile" value="5242800"/>
bean>
注意:
1. 在Controller的方法参数中,书写MultipartFile类型的参数。
2. 参数名字必须和表单中“文件上传项”的name属性保持一致
@RequestMapping("/upload")
@ResponseBody
public void fileUpload(String name, int age, MultipartFile headImg) throws IOException {
}
@RequestMapping("/upload")
@ResponseBody
public void fileUpload(String name, int age, MultipartFile headImg) throws IOException {
//获取普通项
System.out.println(name);
System.out.println(age);
//处理文件上传项
//0.判断文件是否为空
if (!headImg.isEmpty()) {
//1.获取上传文件的文件名称
String filename = headImg.getOriginalFilename(); //6b.jpeg
//2.处理文件名
filename = new Date().getTime() + "_" + filename; //1573701830347_6b.jpeg
//3.保存该文件
headImg.transferTo(new File("d:\\" + filename));
}
}
注意:
多文件上传时,只要把MultipartFile类型变为数组即可。
但是,要求数组名字,必须和表单中“文件上传项”的name属性保持一致
@RequestMapping("/upload")
@ResponseBody
public void fileUpload(String name, MultipartFile[] uploadFile) throws IOException {
}
Spring MVC 的拦截器类, 似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
定义一个类,实现HandlerInterceptor接口,重写preHandle方法
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("MyInterceptor拦截器执行了...");
//返回true表示放行,返回false表示不放行
return true;
}
}
在springmvc配置文件中.配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.java.interceptor.LoginInterceptor"/>
mvc:interceptor>
mvc:interceptors>
1.拦截器的拦截规则,针对的进入springmvc流程的那些请求.
2.HandlerInterceptor接口中有三个方法:
preHandler 在目标方法执行之前执行
postHandle 在目标方法执行之后,视图对象返回之前执行
afterCompletion 在流程都执行完毕后执行
3.拦截器可以有多个,组成拦截器链
系统的Dao、Service、Controller在出现异常时,都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mA8UWxz7-1583329736749)(img/7.png)]
① 简单异常处理器SimpleMappingExceptionResolver
② 自定义自己的异常处理器,实现HandlerExceptionResolver接口
简单异常处理器,是springmvc提前做好的处理器接口, 直接配置即可使用
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="forward:/error/errorMsg.jsp"/>
<property name="exceptionMappings">
<map>
<entry key="ArithmeticException" value="forward:/error/arithmetic.jsp"/>
<entry key="ClassCastException" value="forward:/error/classCast.jsp"/>
map>
property>
bean>
① 定义一个类,实现HandlerExceptionResolver接口,重写方法
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
//判断出现的异常是什么异常
if (ex instanceof ArithmeticException){
//如果是除零异常
//跳转到"forward:/error/arithmetic.jsp"
modelAndView.setViewName("forward:/error/arithmetic.jsp");
}else if (ex instanceof ClassCastException){
//如果类型转换异常
//跳转到"forward:/error/classCast.jspp"
modelAndView.setViewName("forward:/error/classCast.jsp");
}else{
//其他异常
//就跳转到exceptionPage页面
modelAndView.setViewName("forward:/error/exceptionPage.jsp");
}
return modelAndView;
}
}
② 配置异常处理器
<bean id="exceptionResolver" class="com.itheima.exception.MyExceptionResolver"/>