美文网首页
四、Web开发(8)

四、Web开发(8)

作者: 吴国友 | 来源:发表于2018-05-01 16:13 被阅读13次

7、错误处理机制

1)、SpringBoot默认的错误处理机制

默认效果:

​ 1)、浏览器,返回一个默认的错误页面

浏览器发送请求的请求头:


​ 2)、如果是其他客户端,默认响应一个json数据


原理:

​ 可以参照ErrorMvcAutoConfiguration;错误处理的自动配置;

给容器中添加了以下组件

​ 1、DefaultErrorAttributes:

帮我们在页面共享信息;
@Override
    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
            boolean includeStackTrace) {
        Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
        errorAttributes.put("timestamp", new Date());
        addStatus(errorAttributes, requestAttributes);
        addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
        addPath(errorAttributes, requestAttributes);
        return errorAttributes;
    }

​ 2、BasicErrorController:处理默认/error请求

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
    
    @RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
    public ModelAndView errorHtml(HttpServletRequest request,
            HttpServletResponse response) {
        HttpStatus status = getStatus(request);
        Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
                request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());
        
        //去哪个页面作为错误页面;包含页面地址和页面内容
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
    }

    @RequestMapping
    @ResponseBody    //产生json数据,其他客户端来到这个方法处理;
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request,
                isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

​ 3、ErrorPageCustomizer:

    @Value("${error.path:/error}")
    private String path = "/error";  系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)

​ 4、DefaultErrorViewResolver:

@Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
            Map<String, Object> model) {
        ModelAndView modelAndView = resolve(String.valueOf(status), model);
        if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
            modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
        }
        return modelAndView;
    }

    private ModelAndView resolve(String viewName, Map<String, Object> model) {
        //默认SpringBoot可以去找到一个页面?  error/404
        String errorViewName = "error/" + viewName;
        
        //模板引擎可以解析这个页面地址就用模板引擎解析
        TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
                .getProvider(errorViewName, this.applicationContext);
        if (provider != null) {
            //模板引擎可用的情况下返回到errorViewName指定的视图地址
            return new ModelAndView(errorViewName, model);
        }
        //模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面   error/404.html
        return resolveResource(errorViewName, model);
    }

​ 步骤:

​ 一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理;

​ 1)响应页面;去哪个页面是由DefaultErrorViewResolver解析得到的;

protected ModelAndView resolveErrorView(HttpServletRequest request,
      HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
    //所有的ErrorViewResolver得到ModelAndView
   for (ErrorViewResolver resolver : this.errorViewResolvers) {
      ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
      if (modelAndView != null) {
         return modelAndView;
      }
   }
   return null;
}

相关文章

  • 四、Web开发(8)

    7、错误处理机制 1)、SpringBoot默认的错误处理机制 默认效果: ​ 1)、浏览器,返回一个...

  • 四、Web开发(1)

    1、简介 使用SpringBoot; 1)、创建SpringBoot应用,选中我们需要的模块; 2)、Spring...

  • 四、Web开发(2)

    3、模板引擎 JSP、Velocity、Freemarker、Thymeleaf SpringBoot推荐的Thy...

  • 四、Web开发(11)

    3)、替换为其他嵌入式Servlet容器 默认支持: Tomcat(默认使用) Jetty Undertow

  • 四、Web开发(3)

    4、SpringMVC自动配置 https://docs.spring.io/spring-boot/docs/1...

  • 四、Web开发(4)

    6、RestfulCRUD 1)、默认访问首页 2)、国际化 1)、编写国际化配置文件; 2)、使用Resourc...

  • 四、Web开发(5)

    3)、登陆 开发期间模板引擎页面修改以后,要实时生效 1)、禁用模板引擎的缓存 2)、页面修改完成以后ctrl+f...

  • 四、Web开发(6)

    5)、CRUD-员工列表 实验要求: 1)、RestfulCRUD:CRUD满足Rest风格; URI: /资源...

  • 四、Web开发(9)

    2)、如果定制错误响应: 1)、如何定制错误的页面; ​ 1)、有模板引擎的情况下;error...

  • 四、Web开发(7)

    7)、CRUD-员工修改 修改添加二合一表单 8)、CRUD-员工删除

网友评论

      本文标题:四、Web开发(8)

      本文链接:https://www.haomeiwen.com/subject/oltfrftx.html