(6)Spring Boot web开发 --- 错误处理页面
处理时间(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
;
如果想要使用其他方法,则需要进行一番操作;
SpringMvc
配置HiddenHttpMethodFilter
(Spring Boot
已经自动配置好了,美滋滋);页面创建一个表单
创建一个
input
项,type
为hidden
,·name
属性值必须为_method
,然后value
属性的值,就写我们想要使用的方法:<input type="hidden" name="_method" value="put">
错误处理机制
Spring Boot
默认返回一个白板页面;自定义错误响应
定制错误的页面
有模板引擎
将错误页面放在 类路径 的
templates/error
文件夹下面,命名为 状态码.html ,这样发生错误的时候,就会去寻找状态码对应的页面;当然这样很傻,那么多状态码,需要写很多页面,因此,还可以直接创建
4xx.html
、5xx.html
,这样发生404,402,403
这些4xx
的错误的时候,由于没有对应的页面,就会退而其次,匹配4xx.html
页面,5xx
也是同样的道理 ;如果
4xx.html
、404.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;
}
}
如果我们在别的地方也有数据想要带到页面,需要向下面这样做:
首先在转发之前,将我们的数据放到域里面;
@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" ;
}
然后在
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开发 --- 错误处理页面的更多相关文章
- Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析
前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...
- Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎
前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...
- Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件
1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...
- 四、Spring Boot Web开发
四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...
- 4.Spring Boot web开发
1.创建一个web模块 (1).创建SpringBoot应用,选中我们需要的模块: (2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 (3).自己编 ...
- Spring Boot Web 开发注解篇
本文提纲 1. spring-boot-starter-web 依赖概述 1.1 spring-boot-starter-web 职责 1.2 spring-boot-starter-web 依赖关系 ...
- (5)Spring Boot web开发 --- Restful CRUD
文章目录 `@RestController` vs `@Controller` 默认访问首页 设置项目名 国际化 登陆 & 拦截 Restful 风格 @RestController vs @ ...
- spring boot系列(二)spring boot web开发
json 接口开发 在以前的spring 开发的时候需要我们提供json接口的时候需要做如下配置: 1 添加jackjson等jar包 2 配置spring controller扫描 3 对接的方法添 ...
- Spring Boot Web 开发@Controller @RestController 使用教程
在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...
随机推荐
- vue后台_纯前端实现excel导出/csv导出
之前的文件下载功能一般是由前后端配合实现,由于项目需要,纯前端实现了一把excel的导出功能: 一.excel导出 1.安装依赖库 xlsx:这是一个功能强大的excel处理库,但是上手难度也很大,还 ...
- leetcode 467. 环绕字符串中唯一的子字符串
题目描述: 把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwx ...
- DELPHI开发LINUX包
DELPHI开发LINUX包 我们知道,有了包的存在,开发插件架构的程序,才成为可能 . DELPHI在WINDOWS里面的包的扩展名是.bpl. 在LINUX里面的包的扩展名是.so. 怎样在LIN ...
- 项目启动报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.wuhongyu.mapper.OrdersMapper.selectByExample
在用maven配置mybatis环境时出现此BindingExceptiony异常,发现在classes文件下没有mapper配置文件,应该是maven项目没有扫描到mapper包下的xml文件, 在 ...
- nrm -- 一键切换npm源
0. 背景 先描述一下没有nrm时我们是怎样使用npm源的 查看npm源地址,终端中输入 npm config list 可以看到npm源 metrics-registry = "https ...
- JFinal-layui极速开发企业应用管理系统
Jfinal-layui 官网:http://www.qinhaisenlin.com/ 项目:https://gitee.com/QinHaiSenLin/Jfinal-layui 介绍 JFina ...
- 004 DOM01
一:说明 1.Js的三个部分 ECMAScripts标准:JS的基本语法 DOM:文档对象模型,操作页面的元素的 BOM:浏览器对象模型,操作浏览器 2.术语 文档:一个页面就是一个文档 元素:页面中 ...
- 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() & ...
- zz SOLID (面向对象设计)
SOLID (面向对象设计) 维基百科,自由的百科全书 跳到导航 跳到搜索 在程序设计领域, SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] ...
- SpringCloud-Eureka配置instanceId显示IP
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: preferIpAddress: tr ...