处理时间(Date)类型

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

  1. # 日期格式
  2. 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 标注要处理什么异常,然后只要发生了对应的异常,该方法就会得到调用,方法参数可以写一些我们自己想要获得的对象;

      1. @ControllerAdvice
      2. public class MyExceptionController {
      3. @ResponseBody
      4. @ExceptionHandler({UserNotExistException.class})
      5. public Map<String,Object> handlerUserNotExist(Exception e){
      6. Map<String,Object> map = new HashMap<>();
      7. map.put("code","Test Exception");
      8. map.put("message",e.getMessage());
      9. return map ;
      10. }
      11. }

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

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

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

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

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

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

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

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

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

      1. @Component
      2. public class MyErrorAttributes extends DefaultErrorAttributes {
      3. @Override
      4. public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
      5. Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
      6. errorAttributes.put("message","Test");
      7. return errorAttributes;
      8. }
      9. }

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

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


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

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

(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. vue后台_纯前端实现excel导出/csv导出

    之前的文件下载功能一般是由前后端配合实现,由于项目需要,纯前端实现了一把excel的导出功能: 一.excel导出 1.安装依赖库 xlsx:这是一个功能强大的excel处理库,但是上手难度也很大,还 ...

  2. leetcode 467. 环绕字符串中唯一的子字符串

    题目描述: 把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwx ...

  3. DELPHI开发LINUX包

    DELPHI开发LINUX包 我们知道,有了包的存在,开发插件架构的程序,才成为可能 . DELPHI在WINDOWS里面的包的扩展名是.bpl. 在LINUX里面的包的扩展名是.so. 怎样在LIN ...

  4. 项目启动报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.wuhongyu.mapper.OrdersMapper.selectByExample

    在用maven配置mybatis环境时出现此BindingExceptiony异常,发现在classes文件下没有mapper配置文件,应该是maven项目没有扫描到mapper包下的xml文件, 在 ...

  5. nrm -- 一键切换npm源

    0. 背景 先描述一下没有nrm时我们是怎样使用npm源的 查看npm源地址,终端中输入 npm config list 可以看到npm源 metrics-registry = "https ...

  6. JFinal-layui极速开发企业应用管理系统

    Jfinal-layui 官网:http://www.qinhaisenlin.com/ 项目:https://gitee.com/QinHaiSenLin/Jfinal-layui 介绍 JFina ...

  7. 004 DOM01

    一:说明 1.Js的三个部分 ECMAScripts标准:JS的基本语法 DOM:文档对象模型,操作页面的元素的 BOM:浏览器对象模型,操作浏览器 2.术语 文档:一个页面就是一个文档 元素:页面中 ...

  8. nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)

    现象 1.centos6.9 用rpm包安装nginx 2.修改Nginx的多个配置文件和配置项 3.service nginx restart 报错: nginx: [emerg] open() & ...

  9. zz SOLID (面向对象设计)

    SOLID (面向对象设计) 维基百科,自由的百科全书 跳到导航 跳到搜索 在程序设计领域, SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] ...

  10. SpringCloud-Eureka配置instanceId显示IP

    eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: preferIpAddress: tr ...