处理时间(Date)类型

Spring Boot 进行参数绑定使用的是 SpringMvc ,涉及 Date 类型的参数绑定的时候,默认是时间格式是 yyyy/MM/dd ,我们可以自定义格式,只需要配置文件里面配置下:

# 日期格式
spring.mvc.date-format=yyyy.MM.dd

thymeleaf 页面拼接字符串

表达式之间直接使用 + 拼接,比如 :@{/emp/} + ${emp.id} ;


映射路径占位符

在映射路径中可以使用占位符的 @GetMapping(/emp/{id}) ;这样参数传入 id 就会被放到


使用 put、delete 方法

表单 仅支持两种方法提交,POST ,GET

如果想要使用其他方法,则需要进行一番操作;

  1. SpringMvc 配置 HiddenHttpMethodFilterSpring Boot 已经自动配置好了,美滋滋);

  2. 页面创建一个表单

  3. 创建一个 input 项,typehidden·name 属性值必须为 _method,然后 value 属性的值,就写我们想要使用的方法:

    <input type="hidden" name="_method" value="put">


错误处理机制

  1. Spring Boot 默认返回一个白板页面;

  2. 自定义错误响应

    • 定制错误的页面

      • 有模板引擎

        将错误页面放在 类路径templates/error 文件夹下面,命名为 状态码.html ,这样发生错误的时候,就会去寻找状态码对应的页面;

        当然这样很傻,那么多状态码,需要写很多页面,因此,还可以直接创建 4xx.html5xx.html ,这样发生 404,402,403 这些 4xx 的错误的时候,由于没有对应的页面,就会退而其次,匹配 4xx.html 页面,5xx 也是同样的道理 ;

        如果 4xx.html404.html 同时存在,这时候发生 404 错误,会匹配上 404.html ,精确优先 ;

        在页面中还可以获取一些信息:timestamp(时间戳)、status(状态码)、error(错误提示)、exception(异常对象),message(异常消息),errors(JSR303数据校验的错误信息)

      • 没有模板引擎

        没有模板引擎,就去静态资源文件夹下面,寻找对应的 4xx.html ,5xx.html

      • 以上两种情况都没有

        那就莫得选择了,只能使用 Spring Boot 的默认错误提示页面 ;

    • 定制错误 JSON

      自定义异常处理器,使用 @ControllerAdvice 标注类,然后在方法上,使用 @ExceptionHandler 标注要处理什么异常,然后只要发生了对应的异常,该方法就会得到调用,方法参数可以写一些我们自己想要获得的对象;

      @ControllerAdvice
      public class MyExceptionController { @ResponseBody
      @ExceptionHandler({UserNotExistException.class})
      public Map<String,Object> handlerUserNotExist(Exception e){
      Map<String,Object> map = new HashMap<>();
      map.put("code","Test Exception");
      map.put("message",e.getMessage());
      return map ;
      }
      }

      方法的返回值,就会被送到页面,但是这样有个缺点,丢失自适应效果(本来浏览器和终端方法,Spring Boot 会显示不同的效果的,浏览器显示 白板错误页面,终端显示 JSON ),无论是浏览器还是终端,都显示 JSON 串;

      进行改动下,转发到 /error炸,就可以自适应了:

       @ExceptionHandler({UserNotExistException.class})
      public String handlerUserNotExistAdaptive(Exception e){
      Map<String,Object> map = new HashMap<>();
      map.put("code","Test Exception");
      map.put("message",e.getMessage());
      // 转发到 /error
      return "forward:/error" ;
      }

      但是 又有新问题了:发生异常以后,状态码,就会变成 4xx ,5xx,然后被我上面的方法捕捉到以后,来了一个转发,异常被吞咽了,异常链断掉了,状态码已经变了,变为正常的 200,因为转发又没发生异常;

      虽然转发到 /error ,但是状态码已经变了,此时去 /error 下面,没有对应的页面了,就只能找默认的页面了;

      因此,我们在转发之前,设置下状态码:request.setAttribute("javax.servlet.error.status_code",400);,键不是瞎写的,是必须是这个:

      @ExceptionHandler({UserNotExistException.class})
      public String handlerUserNotExistAdaptive(Exception e, HttpServletRequest request){
      request.setAttribute("javax.servlet.error.status_code",400);
      Map<String,Object> map = new HashMap<>();
      map.put("code","Test Exception");
      map.put("message",e.getMessage());
      // 转发到 /error
      return "forward:/error" ;
      }

      现在还有最后一个问题,我们在转发的时候,带过去的数据,页面其实拿不到的,现在要解决这个问题:

      页面上能用的数据,或者 JSON 返回能用的数据,其实都是在 ErrorAttributes.class 类里面的,通过 getErrorAttibutes 获取的,因此,我们只需要获取到 getErrorAttibutes 方法的返回值,然后再返回值里面添加上我们自己的数据即可 ;

      @Component
      public class MyErrorAttributes extends DefaultErrorAttributes { @Override
      public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
      Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
      errorAttributes.put("message","Test");
      return errorAttributes;
      }
      }

如果我们在别的地方也有数据想要带到页面,需要向下面这样做:

  1. 首先在转发之前,将我们的数据放到域里面;


    @ExceptionHandler({UserNotExistException.class})
    public String handlerUserNotExistAdaptive(Exception e, HttpServletRequest request){
    request.setAttribute("javax.servlet.error.status_code",400); Map<String, Object> myErrorAttributesMap = new HashMap<>();
    myErrorAttributesMap.put("message","sasasa");
    myErrorAttributesMap.put("code","Test Exception");
    request.setAttribute("errorAttributesMap",myErrorAttributesMap); // 转发到 /error
    return "forward:/error" ;
    }
  2. 然后在 getErrorAttibutes 方法,从域里面取出来,然后添加到 getErrorAttibutes 方法的返回值中;

@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
// 数字代表域,0 是 request , 1 是 session ,
Map<String, Object> errorAttributesMap = (Map<String, Object>) webRequest.getAttribute("errorAttributesMap", 0);
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
errorAttributes.put("message","Test");
errorAttributes.put("error",errorAttributesMap);
return errorAttributes;
}

(6)Spring Boot web开发 --- 错误处理页面的更多相关文章

  1. Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析

    前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...

  2. Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎

    前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...

  3. Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件

    1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...

  4. 四、Spring Boot Web开发

    四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...

  5. 4.Spring Boot web开发

    1.创建一个web模块 (1).创建SpringBoot应用,选中我们需要的模块: (2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 (3).自己编 ...

  6. Spring Boot Web 开发注解篇

    本文提纲 1. spring-boot-starter-web 依赖概述 1.1 spring-boot-starter-web 职责 1.2 spring-boot-starter-web 依赖关系 ...

  7. (5)Spring Boot web开发 --- Restful CRUD

    文章目录 `@RestController` vs `@Controller` 默认访问首页 设置项目名 国际化 登陆 & 拦截 Restful 风格 @RestController vs @ ...

  8. spring boot系列(二)spring boot web开发

    json 接口开发 在以前的spring 开发的时候需要我们提供json接口的时候需要做如下配置: 1 添加jackjson等jar包 2 配置spring controller扫描 3 对接的方法添 ...

  9. Spring Boot Web 开发@Controller @RestController 使用教程

    在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...

随机推荐

  1. 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation

    DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation 作者:Hao Chen Xiaojuan Qi Lequan Yu ...

  2. ORACLE数据库特性

    目录 ORACLE数据库特性 一.学习路径 二.ORACLE的进程情况 三.ORACLE服务器的启动和关闭 (SQLPLUS环境挂起和恢复等) 连接Oracle的几种方式 四.几个关注点 1. ORA ...

  3. Perl关于分椰子的趣味问题

    话说某天一艘海盗船被天下砸下来的一头牛给击中了,5个倒霉的家伙只好逃难到一个孤岛,发现岛上孤零零的,幸好有有棵椰子树,还有一只猴子! 大家把椰子全部采摘下来放在一起,但是天已经很晚了,所以就睡觉先晚上 ...

  4. Web Worker 使用教程【转】

    原文:http://www.ruanyifeng.com/blog/2018/07/web-worker.html 一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个 ...

  5. VOT-2016 代码评测工具的使用说明

    VOT-2016 代码评测工具的使用说明 2018-10-14 09:37:04 VOT-2016 官网:http://www.votchallenge.net/vot2016/ 评测代码链接:htt ...

  6. win10 'make' 不是内部或外部命令

    win10 解决“ 'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件”的问题 https://www.jianshu.com/p/9bffbaf12bed windows下提示make不 ...

  7. 使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小

    https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-stor ...

  8. Dart函数方法

    /* 内置方法/函数: print(); 自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } */ void printInfo( ...

  9. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

  10. Python3基础 complex 声明复数

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...