快捷搜索:  汽车  科技

springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器)

springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器).....}catch(Exception1 e){public String xxx(){try{......

一、异常解析器

项目中会面临各种异常

  • 运行时异常,大多在开发测试阶段解决掉
  • 非运行时异常,是必须要处理的
  • 业务异常,是根据业务要求,在出现非法情况时,人为抛出的
1、异常处理方案

DAO、service的所有异常,必须无条件上抛,全部集中到Controller

Controller中处理所有异常,将不同的异常转发到不同的错误处理结果中

2、方案

方案一、Controller中的每个handler自己处理异常

public String xxx(){

try{

......

}catch(Exception1 e){

.....

}catch(Exception1 e){

.....

}

}

这种处理异常的方式,把异常处理的逻辑分散在各个handler中,不利于管理。

方案二:Controller中的每个handler不在自己处理异常,而是直接上抛所有异常。

定义一个“异常解析器”集中捕获处理所有异常

public class MyExResolver implements HandlerExceptionResolver { /** * * @param httpServletRequest * @param httpServletResponse * @param o 出现异常的handler * @param e * @return * * 异常解析器:主体逻辑 * 执行时刻:当handler中抛出异常时,会执行,捕获异常,并可以跳转到错误页面 */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest HttpServletResponse httpServletResponse Object o Exception e) { ModelAndView mv = new ModelAndView(); if (e instanceof SQLException){ mv.setViewName("redirect:/dispatch/xxx"); }else if (e instanceof NullPointerException){ mv.setViewName("redirect:/dispatch/xxx"); }else{ mv.setViewName("redirect:/dispatch/xxx"); } return mv; } }

<!--在springmvc中声明异常解析器即可--> <bean class="com.suyang.resolver.MyExResolver"></bean>二、拦截器

主要针对 handler 抽取controller中的冗余功能。

主要作用场景:登录判断(用的较少)

1、定义拦截器

public class MyInterceptor implements HandlerInterceptor{ //在handler之前执行 public boolean preHandle(HttpServletRequest request HttpServletResponse response Object handler) throws Exception { //登录状态判断 if (request.getSession().getAttribute("user") != null) { return true; } response.sendRedirect("/user/login"); //中断前响应 return false;//拦截了,中断请求,后续的拦截器或handler都不在执行 } //在handler之后执行 public void postHandle(HttpServletRequest request HttpServletResponse response Object handler @Nullable ModelAndView modelAndView) throws Exception { } //页面渲染完毕执行 public void afterCompletion(HttpServletRequest request HttpServletResponse response Object handler @Nullable Exception ex) throws Exception { } }2、配置拦截路径

<!--声明拦截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/inter/**"/> <bean class="com.suyang.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>三、上传1、导入依赖

<!--======================上传下载======================--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <!--======================上传下载======================-->2、表单

//上传文件时,enctype="multipart/form-data" <%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <head> <title>上传</title> </head> <body> <form action="${pageContext.request.contextPath}/upload/test1" method="post" enctype="multipart/form-data"> <input type="text" name="username"/><br> <input type="file" name="source" /><br> <input type="submit" value="上传"> </form> </body> </html>3、上传解析器

<!--上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--请求的编码格式,必须和jsp的pageEncoding属性一致,默认为ISO-8859-1--> <property name="defaultEncoding" value="utf-8"/> <!--最大上传文件大下,单位字节--> <property name="maxUploadSize" value="1048576"/> </bean>4、Handler

配置上传解析器后,handler中形参MultipartFile source才会收到请求的文件

@RequestMapping("test1") public String test1(MultipartFile source String username) throws IOException { //文件的原始名称 String filename = source.getOriginalFilename(); //定制全局唯一的命名 String unique = java.util.UUID.randomUUID().toString(); //获取文件的后缀 String ext = FilenameUtils.getExtension(filename); //定制全局唯一文件名 String uniqueFileName = unique "." ext; System.out.println("全局唯一文件名=" uniqueFileName); //文件类型 String type = source.getContentType(); System.out.println("filename:" filename "---type:" type); //将上传的文件存到指定目录中 source.transferTo(new File("f:\\" filename)); return "index"; }四、下载1、超链

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <head> <title>下载</title> </head> <body> <a href="${pageContext.request.contextPath}/download/test1?name=20211111143240.jpg">免费下载</a> </body> </html>2、Handler

@RequestMapping("test1") public void test1(String name HttpServletResponse response) throws IOException { //下载文件存放路径 String path = "f:"; //文件的完整路径 File.separator="\" String filepath = path File.separator name; System.out.println(filepath); //设置响应头,告知浏览器,要以附件的形式保存内容,name为浏览器显示的下载文件名 //不设置会默认打开文件 response.setHeader("content-disposition" "attachment;filename=" name); //new FileInputStream()读取目标文件,response.getOutputStream()写出给客户端浏览器 IOUtils.copy(new FileInputStream(filepath) response.getOutputStream()); }

springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器)(1)

猜您喜欢: