当前位置: 首页 > news >正文

seo优化网站技术排名百度推广网站服务器和空间有什么区别

seo优化网站技术排名百度推广,网站服务器和空间有什么区别,山西建设工程造价管理协会网站,自己制作wordpress主题Spring 异常处理三种方式 异常处理方式一. ExceptionHandler异常处理方式二. 实现HandlerExceptionResolver接口异常处理方式三. ControllerAdviceExceptionHandler三种方式比较说明(强烈推荐各位看一下#xff0c;我觉得自己总结的比较多#xff0c;嘿嘿#xff0c;不对之…Spring 异常处理三种方式 异常处理方式一. ExceptionHandler异常处理方式二. 实现HandlerExceptionResolver接口异常处理方式三. ControllerAdviceExceptionHandler三种方式比较说明(强烈推荐各位看一下我觉得自己总结的比较多嘿嘿不对之处请指出) 文章目录Spring 异常处理三种方式问题描述: 假如对异常不进行处理异常处理的方式有三种:一. Controller层面上异常处理 ExceptionHandler原理说明二. 全局级别异常处理器 实现HandlerExceptionResolver接口原理分析三.全局级别异常处理器 ControllerAdviceExceptionHandler四.比较说明.问题描述: 假如对异常不进行处理 假如SpringMvc我们不对异常进行任何处理, 界面上显示的是这样的. 异常处理的方式有三种: 一. Controller层面上异常处理 ExceptionHandler 说明:针对可能出问题的Controller新增注解方法ExceptionHandler. Controller RequestMapping(/testController) public class TestController {RequestMapping(/demo1)ResponseBodypublic Object demo1(){int i 1 / 0;return new Date();}ExceptionHandler({RuntimeException.class})public ModelAndView fix(Exception ex){System.out.println(do This);return new ModelAndView(error,new ModelMap(ex,ex.getMessage()));} }注意事项: 一个Controller下多个ExceptionHandler上的异常类型不能出现一样的否则运行时抛异常. Ambiguous ExceptionHandler method mapped for;ExceptionHandler下方法返回值类型支持多种常见的ModelAndViewResponseBody注解标注ResponseEntity等类型都OK. 原理说明 代码片段位于:org.springframework.web.servlet.DispatcherServlet#doDispatch 执行RequestMapping方法抛出异常后Spring框架 try-catch的方法捕获异常, 正常逻辑发不发生异常都会走processDispatchResult流程 区别在于异常的参数是否为null . HandlerExecutionChain mappedHandler null;Exception dispatchException null;ModelAndView mv null;try{mappedHandlergetHandler(request); //根据请求查找handlerMapping找到controllerHandlerAdapter ha getHandlerAdapter(mappedHandler.getHandler());//找到处理器适配器HandlerAdapterif(!mappedHandler.applyPreHandle(request,response)){ //拦截器preHandlereturn ;} mvha.handle(request,response); //调用处理器适配器执行RequestMapping方法mappedHandler.applyPostHandle(request,response,mv); //拦截器postHandle}catch(Exception ex){dispatchExceptionex;}processDispatchResult(request,response,mappedHandler,mv,dispatchException) //将异常信息传入了代码片段位于org.springframework.web.servlet.DispatcherServlet#processDispatchResult 如果RequestMapping方法抛出异常拦截器的postHandle方法不执行进入 processDispatchResult判断入参 dispatchException不为null , 代表发生异常调用processHandlerException处理, 代码片段位于:org.springframework.web.servlet.DispatcherServlet#processHandlerException this当前对象指dispatchServlet,handlerExceptionResolvers可以看到有三个HandlerExceptionResolver, 这三个是mvc:annotation-driven /帮我们注册的. 遍历有序集合handlerExceptionResolvers调用接口的resolveException方法. 记录mvc:annotation-driven/注册的第一个 HandlerExceptionResolver : ExceptionHandlerExceptionResolver, 继承关系如下面所示. 代码片段位于:org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver#resolveException AbstractHandlerExceptionResolver 和 AbstractHandlerMethodExceptionResolver名字看起来非常相似. 这里AbstractHandlerExceptionResolver 的shouldApplyTo都返回 true, logException用来记录日志、prepareResponse方法用来设置response的Cache-Control. 异常处理方法就位于doResolveException. 代码片段位于:org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver#shouldApplyTo 接口方法实现是AbstractHandlerExceptionResolver的resolveException先判断 shouldApplyTo, AbstractHandlerExceptionResolver 和子类AbstractHandlerMethodExceptionResolver都实现了shouldApplyTo方法子类的shouldApplyTo都调用父类AbstractHandlerExceptionResolver的shouldApplyTo. 查看父类AbstractHandlerExceptionResolver的shouldApplyTo方法. 代码片段位于:org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver#shouldApplyTo Spring初始化的时候并没有额外配置 , 所以mappedHandlers和mappedHandlerClasses都为null, 可以在这块扩展进行筛选 AbstractHandlerExceptionResolver提供了 setMappedHandlerClasses 、setMappedHandlers用于扩展. 代码片段位于org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver#doResolveException 代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#doResolveHandlerMethodException 似曾相识的ServletInvocableHandlerMethodgetExceptionHandlerMethod目的就是获取 针对异常的处理方法没找到的话这里就直接返回了找到了执行异常处理方法; 之后同Spring请求方法执行一样的处理方式设置argumentResolvers、returnValueHandlers之后进行调用异常处理方法 ExceptionHandler的方法入参支持Exception SessionAttribute 、 RequestAttribute注解 HttpServletRequest 、HttpServletResponse、HttpSession. ExceptionHandler方法返回值常见的可以是: ModelAndView 、ResponseBody注解、ResponseEntity; getExceptionHandlerMethod说明 获取对应的ExceptionHandler方法封装成ServletInvocableHandlerMethod返回. 代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#getExceptionHandlerMethod exceptionHandlerCache是针对Controller层面的ExceptionHandler的处理方式而exceptionHandlerAdviceCache是针对ControllerAdvice的处理方式. 这两个属性都位于ExceptionHandlerExceptionResolver中. handlerType指代Controller的class属性尝试从缓存A exceptionHandlerCache 中根据controller的class 查找ExceptionHandlerMethodResolver 缓存A之前没存储过Controller的class 所以新建一个ExceptionHandlerMethodResolver 加入缓存中. ExceptionHandlerMethodResolver 的初始化工作一定做了某些工作! resolveMethod方法根据异常对象让 ExceptionHandlerMethodResolver 解析得到 method 匹配到异常处理方法 就直接封装成对象 ServletInvocableHandlerMethod 就不会再去走ControllerAdvice里的异常处理器了. 这里说明了ExceptionHandlerMethodResolver 初始化的时候完成存储 ExceptionHandler. 查看ExceptionHandlerMethodResolver 初始化工作内容: 代码片段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#ExceptionHandlerMethodResolver handlerType为传入的Controller的class属性通过EXCEPTION_HANDLER_METHODS选出 class 中标注ExceptionHandler的方法解析Exception注解的value值(class类型的数组)并加入到当前ExceptionHandlerMethodResolver的mappedMethods集合中key为 异常类型 value为 method. 如果ExceptionHandler的 value属性为空就会将方法入参中的Throwable的子类作为异常类型. ExceptionHandler的value属性和方法入参不能同时都为空否则会抛出异常. ExceptionHandlerMethodResolver完成了初始化工作如何根据当前发生异常类型查找到对应方法? 代码片段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#resolveMethod resolveMethodByExceptionType根据当前抛出异常寻找 匹配的方法并且做了缓存以后遇到同样的异常可以直接走缓存取出method 代码片段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#resolveMethodByExceptionType resolveMethodByExceptionType方法尝试从缓存AexceptionLookupCache中根据 异常class类型获取Method 初始时候肯定缓存为空 就去 遍历ExceptionHandlerMethodResolver的mappedMethods(上面提及了key为异常类型value为method), exceptionType为当前RequestMapping方法抛出的异常判断当前异常类型是不是ExceptionHandler中value声明的子类或本身满足条件就代表匹配上了可能存在多个匹配的方法使用ExceptionDepthComparator排序排序规则是按照继承顺序来(继承关系越靠近数值越小当前类最小为0,顶级父类Throwable为int最大值)排序之后选取继承关系最靠近的那个并且存入ExceptionHandlerMethodResolver的exceptionLookupCache中key为当前抛出的异常value为解析出来的匹配method. 至此 ExceptionHandler Spring读取到并解析出来完毕了后续流程和Spring正常请求流程一样包括ExceptionHandler的方法入参、方法返回值. ExceptionHandler的方法入参支持Exception SessionAttribute 、 RequestAttribute注解 HttpServletRequest 、HttpServletResponse、HttpSession. ExceptionHandler方法返回值常见的可以是: ModelAndView 、ResponseBody注解、ResponseEntity; 二. 全局级别异常处理器 实现HandlerExceptionResolver接口 public class MyHandlerExceptionResolver implements HandlerExceptionResolver {Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println(发生全局异常!);ModelMap mmpnew ModelMap();mmp.addAttribute(ex,ex.getMessage());return new ModelAndView(error,mmp);}}使用方式 只需要将该Bean加入到Spring容器可以通过Xml配置也可以通过注解方式加入容器; ​ 方法返回值不为null才有意义如果方法返回值为null可能异常就没有被捕获. 缺点分析比如这种方式全局异常处理返回JSP、velocity等视图比较方便返回json或者xml等格式的响应就需要自己实现了.如下是我实现的发生全局异常返回JSON的简单例子. public class MyHandlerExceptionResolver implements HandlerExceptionResolver {Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println(发生全局异常!);ModelMap mmpnew ModelMap();mmp.addAttribute(ex,ex.getMessage());response.addHeader(Content-Type,application/json;charsetUTF-8);try {new ObjectMapper().writeValue(response.getWriter(),ex.getMessage());response.getWriter().flush();} catch (IOException e) {e.printStackTrace();}return new ModelAndView();}}原理分析 记得之前介绍了 DispatcherServlet的HandlerExceptionResolver集合这种方式的HandlerExceptionResolver就是从DispatcherServlet的HandlerExceptionResolver集合入手的. 代码片段位于:org.springframework.web.servlet.DispatcherServlet#processHandlerException this对象指代DispatcherServlet和上面方式对比发现我们只是将MyHandlerExceptionResolver 加入到Spring容器dispatchServlet 的 handlerExceptionResolvers属性就多了我们自己定义的全局异常解析器 ExceptionHandlerMethodResolver是用来解析Controller层面的ExceptionHandler注解当前Controller没有找到ExceptionHandler来处理自己抛出的异常才遍历下一个HandlerExceptionResolver HandlerExceptionResolver是个有序集合Spring注册的HandlerExceptionResolver调用resolveException都失败之后才轮到我们自定义的MyHandlerExceptionResolver 而且我们自定义的MyHandlerExceptionResolver 就没法使用SpringMvc的注解等等. 我们只是将HandlerExceptionResolver加入到Spring容器中,Spring是如何通知给DispatcherServlet呢? 代码片段位于:org.springframework.web.servlet.DispatcherServlet#initHandlerExceptionResolvers initHandlerExceptionResolvers只是DispatcherServlet初始化策略方法initStrategies中的一小步可以看到只要是SpringMvc父子容器中注册的HandlerExceptionResolver类型实例DispatcherServlet都会自动将其加入到DispatcherServlet的handlerExceptionResolvers中. 所以我们需要做的只是实现HandlerExceptionResolver接口并且纳入Spring容器管理即可. 三.全局级别异常处理器 ControllerAdviceExceptionHandler 简单使用方法 ControllerAdvice public class GlobalController {ExceptionHandler(RuntimeException.class)public ModelAndView fix1(Exception e){System.out.println(全局的异常处理器);ModelMap mmpnew ModelMap();mmp.addAttribute(ex,e);return new ModelAndView(error,mmp);} }package com.abc.admin;import com.github.pagehelper.Page; import com.viready.scpms.pojo.bean.ResponseResult; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;ControllerAdvice public class ControllerAdviceHandler implements ResponseBodyAdviceObject {ResponseBodyExceptionHandler(value Throwable.class)public ResponseResult catchAllError(HttpServletRequest request, HttpServletResponse response, Throwable error) {return ResponseResult.exception(error);}Overridepublic boolean supports(MethodParameter method, Class? extends HttpMessageConverter? clazz) {return method.getContainingClass().getPackage().getName().startsWith(com.abc) (method.getContainingClass().getAnnotation(RestController.class) ! null ||(method.getMethod() ! null method.getMethod().getAnnotation(ResponseBody.class) ! null));}Overridepublic Object beforeBodyWrite(Object result, MethodParameter methodParameter, MediaType mediaType,Class? extends HttpMessageConverter? aClass,ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {return result instanceof ResponseResult ? result :result instanceof Page ? ResponseResult.page((Page?) result) :ResponseResult.successData(result);} }用法说明: 这种情况下 ExceptionHandler 与第一种方式用法相同返回值支持ModelAndViewResponseBody等多种形式. 方式一提到ExceptionHandlerExceptionResolver不仅维护Controller级别的ExceptionHandler同时还维护的ControllerAdvice级别的ExceptionHandler. 代码片段位于org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#getExceptionHandlerMethod isApplicableToBeanType方法是用来做条件判断的ControllerAdvice注解有很多属性用来设置条件basePackageClasses、assignableTypes、annotations等比如我限定了annotations为注解X 那标注了X 的ControllerA就可以走这个异常处理器ControllerB就不能走这个异常处理器. 现在问题的关键就只剩下了exceptionHandlerAdviceCache是什么时候扫描ControllerAdvice的下面的逻辑和ExceptionHandler的逻辑一样了. exceptionHandlerAdviceCache初始化逻辑: 代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#afterPropertiesSet afterPropertiesSet是Spring bean创建过程中一个重要环节. 代码片段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#initExceptionHandlerAdviceCache ControllerAdviceBean.findAnnotatedBeans方法查找了SpringMvc父子容器中标注 ControllerAdvice 的bean, new ExceptionHandlerMethodResolver初始化时候解析了当前的ControllerAdvice的bean的ExceptionHandler,加入到ExceptionHandlerExceptionResolver的exceptionHandlerAdviceCache中key为ControllerAdviceBeanvalue为ExceptionHandlerMethodResolver . 到这里exceptionHandlerAdviceCache就初始化完毕. 查找SpringMvc父子容器中所有ControllerAdivce的bean的方法 代码片段位于org.springframework.web.method.ControllerAdviceBean#findAnnotatedBeans 遍历了SpringMVC父子容器中所有的bean标注ControllerAdvice注解的bean加入集合返回. 四.比较说明. ControllerExceptionHandler、HandlerExceptionResolver接口形式、ControllerAdviceExceptionHandler优缺点说明 在Spring4.3.0版本下 1.优先级来说ControllerExceptionHandler优先级最高其次是ControllerAdviceExceptionHandler最后才是HandlerExceptionResolver说明假设三种方式并存的情况 优先级越高的越先选择而且被一个捕获处理了就不去执行其他的. ​ 2. 三种方式都支持多种返回类型ControllerExceptionHandler、ControllerAdviceExceptionHandler可以使用Spring支持的ResponseBody、ResponseEntity而HandlerExceptionResolver方法声明返回值类型只能是 ModelAndView如果需要返回JSON、xml等需要自己实现. ​ 3.缓存利用ControllerExceptionHandler的缓存信息在ExceptionHandlerExceptionResolver的exceptionHandlerCacheControllerAdviceExceptionHandler的缓存信息在ExceptionHandlerExceptionResolver的exceptionHandlerAdviceCache中, 而HandlerExceptionResolver接口是不做缓存的在前面两种方式都fail的情况下才会走自己的HandlerExceptionResolver实现类多少有点性能损耗. EOF
http://wiki.neutronadmin.com/news/327258/

相关文章:

  • 信用网站建设招标书wordpress 侧栏主题
  • 应持续抓好二级网站的建设工作黑龙江省和城乡建设厅网站
  • 网站后台更新内容后建筑设计有哪些专业
  • 网站建设与管理的专业群深圳建设局网站首页
  • 阿里云加WordPress建站成都网站制作-中国互联
  • 中国市场营销网网站搜索引擎优化总结感悟
  • 做网站的公司周年活动公司的网站如何建设
  • 电子商务网站建设复习题公共体育课程网站建设
  • 设计素材网站月收益漳州北京网站建设
  • 西安手机网站制作南京网站建设优化
  • 上海城乡建设部网站首页wordpress 公式
  • 通河新村街道网站建设线下推广活动有哪些
  • 淮阳网站建设小程序怎么开发自己的小程序代码
  • 效果图网站有哪些做网站加班
  • 购物网站排名2017企业微信公众号开发
  • 小网站怎么赚钱wordpress和帝国
  • 工业设计的网站2021安全员证报名入口
  • 团购网站怎么做推广班级优化大师的利和弊
  • scala做网站网站建设与管理自考本全国卷
  • 使用wordpress快速建站视频教程门户网站广告的类型
  • 下载网站系统免费生成网站软件下载
  • 天长企业网站制作网站请人做要多少钱
  • 网站页面跳转怎么做创建qq网站
  • 链接提交百度站长平台网站收录突然减少
  • 东莞企业网站推广西安网站建设哪家公司好
  • 网站信用认证可以自己做吗做pc端网站行情
  • 玉雕网站建设青岛网络优化
  • 南通网站建设心得网页编程培训学校
  • 建设部网站王尚春支付网站建设推广的会计分录
  • 广州黄埔网站制作阿里云网站建设流程教案