1. 文件上传

  • Spring 使用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:
    CommonsMultipartResolver;
  • SpringMVC 上下文中默认没有装配 MultipartResolver,因此默认情况下不能处理文件的上传;
    若要使用上传功能,需要在上下文中配置 MultipartResolver;
// 1. 导入 jar 包/* commons-fileupload;* commons-io;*/// 2. 配置 MultipartResolver(多媒体解析器)
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"></property><!-- 文件大小 1M --><property name="maxUploadSize" value="1048576"/>
</bean>// index.jsp
<h2>文件上传</h2>
<form action="${pageContext.request.contextPath}/testUpload" method="post"enctype="multipart/form-data">file1:<input type="file" name="upload"/><br/>file2:<input type="file" name="upload"/><br/>file3:<input type="file" name="upload"/><br/><input type="submit" value="上传"/><br/>
</form>// Demo.java
@RequestMapping(value="/testUpload",method=RequestMethod.POST)
public String testUpload(@RequestParam("upload") MultipartFile[] file)throws IllegalStateException, IOException {for(MultipartFile mf : file){if(!mf.isEmpty()){mf.transferTo(new File("/Users/用户名/Documents/上传/"+mf.getOriginalFilename()));}}return "ok";
}

2. 自定义拦截器

  1. 自定义的拦截器必须实现 HandlerInterceptor 接口:

    • preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行
      处理;如果拦截处理后,还需要调用其他的拦截器,或者是业务处理器,则返回 true; 否则,返回false;
    • postHandle():这个方法在业务处理器处理完请求后,但是,DispatcherServlet 向客户端返回
      响应前被调用,处理用户的 request请求;
    • afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方
      法中进行一些资源清理的操作;
// FirstInterceptor.java
public class FirstInterceptor implements HandlerInterceptor{public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object handler)throws Exception{System.out.println("FirstInterceptor.....preHandle");return true;                                                    }public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object handler, ModelAndView modelAndView)throws Exception{System.out.println("FirstInterceptor.....postHandle");         }public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object handler,Exception ex) throws Exception{System.out.println("FirstInterceptor.....afterCompletion");                    }
}// 注册该拦截器
<mvc:interceptors><bean id="firstInterceptor"class="cn.itcast.springmvc.interceptor.firstInterceptor"/>
</mvc:interceptors>// index.jsp
示例:<a href="${pageContext.request.contextPath}/helloworld">点击这里</a>// Demo.java
@Controller
public class Demo{@RequestMapping(value="/hellowrold",method=RequestMethod.GET)public String helloworld(){System.out.println("======helloworld");return "ok";}
}
运行结果:

2.1 拦截器配置

// 自定义两个拦截器
// FirstInterceptor.java(同上)
// SecondInterceptor.java
public class SecondInterceptor implements HandlerInterceptor{public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object handler)throws Exception{System.out.println("SecondInterceptor.....preHandle");return true;                                                    }public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object handler, ModelAndView modelAndView)throws Exception{System.out.println("SecondInterceptor.....postHandle");         }public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object handler,Exception ex) throws Exception{System.out.println("SecondInterceptor.....afterCompletion");                    }
}// 注册拦截器
<mvc:interceptors><bean id="firstInterceptor"class="cn.itcast.springmvc.interceptor.FirstInterceptor"/><mvc:interceptor><mvc:mapping path="/emps"></mvc:mapping><bean id="secondInterceptor"class="cn.itcast.springmvc.interceptor.SecondInterceptor"/></mvc:interceptor>
</mvc:interceptors>// Demo.java
@Controller
public class Demo{@RequestMapping(value="/emps",method=RequestMethod.GET)public String list(Map<String,Object> map){System.out.println("emps .... 执行");map.put("employees",employeeService.getAll());return "list";}
}// index.jsp
查询所有员工: <a href="${pageContext.request.contextPath}/emps">查询所有</a>
结果分析
  • 第一个拦截器 preHandler 返回 true,第二个也为 true;

  • 第一个拦截器返回 false,第二个为true或false;

  • 第一个拦截器返回 true,第二个为 false;

3. 异常处理

  1. SpringMVC 通过 HandlerExceptionResolver接口处理程序的异常,包括Handler映射,数据绑定以
    及目标方法执行时,发生的异常;
  2. SpringMVC 提供的 HandlerExceptionResolver接口的实现类:
    • ExceptionHandlerExceptionResolver;
    • DefaultHandlerExceptionResolver;
    • ResponseStatusExdeptionResolver;
    • SimpleMappingExceptionResolver;

3.1 HandlerExceptionResolver

  • @ExceptionHandler只处理当前 handler 方法中抛出的异常
// index.jsp
异常示例:<a href="{pageContext.request.contextPath}/testHandler?age=5">异常处理1</a>// Demo.java
@Controller
public class Demo{@RequestMapping(value="/testHandler",method=RequestMethod.GET)public String testHandler(@RequestParam("age") Integer age){int result = 10 / age;System.out.println(result);return "ok";}// 如果请求参数 age=0, 会报异常// error.jsp<body>抱歉,系统繁忙,请稍候在试....</body>// 第一种方式: 返回到错误页面,不带异常信息@ExceptionHandler(value={ArithmeticException.class})public String dealHandlerExceptionResolver(Exception e){System.out.println("111111"+e.getMessage());return "error";}// 第二种方式: 将异常信息返回到错误页面, 需要使用 ModelAndView, 不能使用 Map@ExceptionHandler(value={ArithmeticException.class})public ModelAndView dealHandlerExceptionResolver(Excetption e){System.out.println("22222"+e.getMessage());ModelAndView mv = new ModelAndView();mv.addObject("myexception",e.getMessage());mv.setViewName("error");return mv;}// error.jsp<body>抱歉,系统繁忙,请稍候在试....<br/>异常信息:${requestScope.myexception}</body>// 异常优先级问题// ArithmeticExcetion 继承了 RuntimeException// 如果一个类中既有ArithmeticException, 也有 RuntimeException// 如果出现 ArithmeticException, 会执行ArithmeticException@ExceptionHandler(value={RuntimeException.class})public ModelAndView dealHandlerExceptionResolver2(Excetption e){System.out.println("33333"+e.getMessage());ModelAndView mv = new ModelAndView();mv.addObject("myexception",e.getMessage());mv.setViewName("error");return mv;}
}

3.2 @ControllerAdvice

  • 将所有异常存放在 exception 包下,将业务方法和处理异常的方法分离;
  • @ExceptionHandler中找不到的话,就去@ControllerAdvice标记的类里面查找标记了
    @ExceptionHandler的方法;
// cn.itcast.springmvc.exception.CommonHelperException 类@ControllerAdvice
public class CommonHelperException{@ExceptionHandler(value={ArithmeticException.class})public ModelAndView dealHandlerExceptionResolver(Excetption e){System.out.println("44444"+e.getMessage());ModelAndView mv = new ModelAndView();mv.addObject("myexception",e.getMessage());mv.setViewName("error");return mv;}
}

3.3 ReponseStatusExceptionResolver

// 模拟账户锁定,自定义一个 MyUserLockException 继承了 RuntimeException 的异常类// index.jsp
账户锁定异常:
<a href="${pageContext.request.contextPath}/testResponse?username=lisi">异常示例</a>// cn.itcast.springmvc.exception.MyUserLockException 类
@ResponseStatus(value=HttpStatus.LOCKED,reason="账户被锁定,请拨打10086")
public class MyUserLockException extends RuntimeException{private static final long serialVersionUID = 1L;
}// Demo.java
@Controller
public class Demo{@RequestMapping(value="/testResponse",method=RequestMethod.GET)public String testResponse(@RequestParam("username") String username){// username=zhangsan, 抛出异常if("zhangsan".equalsIgnoreCase(username)){throw new MyUserLockException();}return "ok";}//第二种用法,@ResponseStatus 用在方法上// 如果 name=zhangsan, 报 MyUserLockException,// 如果 name 为其他,报 Not Found@RequestMapping(value="/testResponse",method=RequestMethod.GET)@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="测试...")public String testResponse(@RequestParam("username") String username){// username=zhangsan, 抛出异常if("zhangsan".equalsIgnoreCase(username)){throw new MyUserLockException();}return "ok";}
}

3.4 SimpleMappingExceptionResolver

// 示例: 数组下标越界异常// springDispatcherServlet-servlet.xml 配置
<bean id="simpleMappingExceptionResolver"class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 可以自定义 requestScope.异常名称 --<property name="exceptionAttribute" value="自定义异常名称"/><property name="exceptionMappings"><props><prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop></props></property>
</bean>// index.jsp
异常示例:<a href="${pageContext.request.contextPath}/testSimple?id=3">数组下标越界</a>// error.jsp
<body>
抱歉,系统繁忙,请稍候在试!<br/>
数组下标越界:${requestScope.exception}<br/>
</body>// Demo.java
@Controller
public class Demo{@RequestMapping(value="/testSimple",method=RequestMethod.GET)public String testSimple(@RequestParam("id") Integer id){int[] arr = new int[10];System.out.println(arr[id]);return "ok";}
}

参考资料

  • SpringMVC 基础

转载于:https://www.cnblogs.com/linkworld/p/7783036.html

SpringMVC 之拦截器和异常处理相关推荐

  1. SpringMVC——自定义拦截器、异常处理以及父子容器配置

    SpringMVC--自定义拦截器.异常处理以及父子容器配置 参考文章: (1)SpringMVC--自定义拦截器.异常处理以及父子容器配置 (2)https://www.cnblogs.com/so ...

  2. SpringMVC自定义拦截器与异常处理(自定义异常)

    SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...

  3. SpringMVC之拦截器和异常处理

    第四章 拦截器和异常处理 回顾 课前测: 本章内容 拦截器 异常处理 第一节:拦截器 javaWeb: 三大组件为servlet.filter .listener filter: 1.filter接口 ...

  4. SpringMVC拦截器与异常处理

    SpringMVC拦截器与异常处理 参考文章: (1)SpringMVC拦截器与异常处理 (2)https://www.cnblogs.com/luckgood/p/9724057.html 备忘一下 ...

  5. 【SSM框架系列】SpringMVC的文件上传、拦截器及异常处理

    SpringMVC的文件上传 服务器端实现文件上传的技术有很多种,Servlet3.0,FileUtils,框架等等,都可以实现文件上传,不管使用哪一种上传技术,都必须满足三要素: 表单项type=& ...

  6. springmvc高级(拦截器,全局异常处理,文件上传)

    SpringMVC 1.文件上传 文件上传: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传 1).文件上传编程步骤 # 1.项目中引入相关依赖 <dependency> ...

  7. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  8. SpringMVC应用拦截器判断用户是否登录

    拦截器定义 实现HandlerInterceptor接口,实现接口方法. import javax.servlet.http.HttpServletRequest; import javax.serv ...

  9. Struts2拦截器实现异常处理机制

    http://bbs.itcast.cn/thread-10364-1-1.html Struts2拦截器实现异常处理机制   在j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印 ...

最新文章

  1. go gdb调试 参数设置 减小执行文件体积
  2. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构
  3. JavaScript中类型检测
  4. Linux下mount FreeBSD分区
  5. docker安装redis(最新)
  6. 关于使用layui中的tree的一个坑
  7. 批量导出某个简书用户的所有文章列表和文章超链接
  8. 基于Google Reader发展起来的个性化推荐系统之三大问题
  9. vue.js能美化界面吗_vue将单页面改造成多页面应用的方法
  10. Java虚拟机(三)——类加载子系统概述
  11. python文件都是脚本吗_脚本语言系列之Python | Python文件IO
  12. ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi
  13. (原創) 如何Real Time產生灰階影像? (SOC) (DE2-70) (TRDB-D5M)
  14. linux c获取进程状态,Linux C 获取进程的退出值
  15. l360清零软件无响应_爱普生l360清零软件官方版
  16. java webp图片转换为png或jpg
  17. 2017一季度人才大数据报告IT人才需求遥遥领先
  18. 按键精灵post请求_按键精灵安卓版能发送post和get请求吗
  19. 数据结构与算法---均摊时间复杂度
  20. 初识华为云数据库GaussDB(for Cassandra

热门文章

  1. iphone怎么变android,如何将安卓变ios7 将安卓变iphone的两种简单方法分享
  2. linux 将当前时间往后调整2分钟_自动调整linux系统时间和时区与Internet时间同步...
  3. 微博 用户画像_分析用户画像?从微博数据采集开始!
  4. 分数优先遵循志愿php源码_天津中考录取16字原则:分数优先、遵循志愿、一次投档、额满为止...
  5. 职校电子计算机专业高考分数线,2015年重庆高考分数线公布:一本文572理573
  6. zookeeper 客户端_zookeeper进阶-客户端源码详解
  7. python123数字形式转换_python基本数据类型的使用、转换----数字(有待完善)
  8. h5打开麦克风权限录音_MAC录屏没有声音?如何在苹果电脑MACBOOK上录音录屏
  9. dword类型和十进制有什么区别_微信小商店有几种类型,有什么区别?
  10. 自动化测试框架cucumber_基于Cucumber和Testng的WebUI自动化测试方法与流程