Halo(十一)
Spring Boot 继承 AbstractErrorController 实现全局异常处理
@RequestMapping("${server.error.path:${error.path:/error}}"):
如果在 application 中设置了 server.error.path,就映射该值。
如果 error.path 有值就映射该值。
否则映射 /error。
优先级=> server.error.path > error.path > /error
自定义错误页面:
Spring Boot 将所有的错误默认映射到/error, 实现ErrorController。
Html静态页面:在resources/static/error/ 下定义
如添加404页面: resources/static/error/404.html页面,中文注意页面编码
模板引擎页面:在templates/error/ 下定义
如添加5xx页面: resources/templates/error/5xx.ftl
注:resources/templates/error/ 的优先级比较 resources/static/error/高
通过在src/main/resources/templates文件夹中添加error.html错误页面实现自定义错误信息。
通过在src/main/resources/templates/error中添加404.html等以http错误码开头的页面实现不同http错误状态的不同展现。
/error 请求的触发前提是系统中抛出的异常到最终都没有被处理掉:
Spring Boot可以通过 @ControllerAdvice 和 @ExceptionHandler 实现捕获系统中的异常。
如果 @ControllerAdvice 中如果有其他异常没有捕获到,最终仍然会通过 BasicErrorController 处理这些异常。
request 对象中包含的异常信息:
javax.servlet.error.status_code 类型为Integer 错误状态代码
javax.servlet.error.exception_type 类型为Class 异常的类型
javax.servlet.error.message 类型为String 异常的信息
javax.servlet.error.exception 类型为Throwable 异常类
javax.servlet.error.request_uri 类型为String 异常出现的页面
javax.servlet.error.servlet_name 类型为String 异常出现的servlet名
Object throwableObject = request.getAttribute("javax.servlet.error.exception");
if (throwableObject == null) {
//未发现异常
return;
}
Throwable throwable = (Throwable) throwableObject;
log.error("捕获一个异常", throwable);
@Slf4j
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class CommonController extends AbstractErrorController {
//错误参数
private final ErrorProperties errorProperties;
/**
* ErrorAttributes:
* 提供给用户可以记录或显示的错误属性。
* 我们可以自定义一个ErrorAttributes类,只要实现ErrorAttributes即可。
* 默认 Spring Boot 已经帮我们实现了一个DefaultErrorAttributes。
*/
public CommonController(ErrorAttributes errorAttributes,
ServerProperties serverProperties) {
super(errorAttributes);
this.errorProperties = serverProperties.getError();
}
/**
* 错误处理器
*/
@GetMapping
public String handleError(HttpServletRequest request, HttpServletResponse response, Model model) {
//Http状态
HttpStatus status = getStatus(request);
log.error("错误Path:[{}],状态码:[{}]", getErrorPath(), status);
//将错误描述放入error属性中
Map<String, Object> errorDetail = Collections.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request)));
model.addAttribute("error", errorDetail);
log.debug("错误描述:[{}]", errorDetail);
if (status.equals(HttpStatus.INTERNAL_SERVER_ERROR)) {
//内部服务错误:500
return "themes/主题名/500";
} else if (status.equals(HttpStatus.NOT_FOUND)) {
//未发现错误:404
return "themes/主题名/404"
} else {
//默认错误处理器
return "common/error/error";
}
}
/**
* 获取错误Path:/error
*/
@Override
public String getErrorPath() {
return this.errorProperties.getPath();
}
}
Controller 返回值
1、返回 ModelAndView
返回 ModelAndView 是最常见的一种返回结果。
需要在方法结束的时候定义一个 ModelAndView 对象,并对 Model 和 View 分别进行设置。
2、返回String
1):字符串代表逻辑视图名
真实的访问路径 = “前缀” + 逻辑视图名 + “后缀”
Model的返回方式如下:
public String test(Model model){
model.addAttribute(attrName,attrValue);
return "逻辑视图名";
}
2):代表redirect重定向(return "redirect:path")
使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request。
3):代表forward转发(return "forward:path")
通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到下一次请求中去。
3、返回void
返回这种结果的时候可以在Controller方法的形参中定义HTTPServletRequest和HTTPServletResponse对象进行请求的接收和响应。
1)使用request转发页面
request.getRequestDispatcher("转发路径").forward(request,response);
2)使用response进行页面重定向
response.sendRedirect("重定向路径");
3)也可以使用response指定响应结果
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter.write("json串");
Halo(十一)的更多相关文章
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 我的MYSQL学习心得(十一) 视图
我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- WCF学习之旅—第三个示例之五(三十一)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) WCF学习 ...
- [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合
[占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合 Datasets can often contain components of that require differe ...
- 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...
- CPrimerPlus第十一章中的“选择排序算法”学习
C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- GPS部标监控平台的架构设计(十一)-基于Memcached的分布式Gps监控平台
部标gps监控平台的架构,随着平台接入的车辆越来越多,架构也面临越来越大的负载挑战,我们当然希望软件尽可能的优化并能够接入更多的车辆,减少在硬件上的投资.但是当车辆增多到某一个临界点的时候,仍然要面临 ...
- 双十一 VS 火车票(12306)
火车票开售了,又是一年,code了一年,咱们也该回顾回顾了. 还记得12306上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...
随机推荐
- [CSP-S模拟测试]:赛(贪心+三分)
题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...
- [CSP-S模拟测试]:柱状图(树状数组+二分+三分)
题目描述 $WTH$获得了一个柱状图,这个柱状图一共有$N$个柱子,最开始第$i$根柱子的高度为$x_i$,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下:$1.$屋顶存在一个最高的柱子,假设 ...
- 学习如何使用Markdown
Markdown 新手指南点击查看 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ---段落 引用 这是一个无序列表 这是一个无序列表 这是一个父无序列表 这是一个子无序列表 这是一个有 ...
- windows下源码安装调试postgresql
环境:windows 10 postgresql版本:postgresql-9.6.5 使用工具:vs2017社区版 辅助工具:perl.diff.flex.bison 相关工具下载地址: perl下 ...
- Jsoup获取DOM元素
(1)doc.getElementsByTag(String tagName); (2)doc.getElementById(String id); (3)doc.getElementsByClass ...
- 【CDN+】 一些常用的Linux命令,crontab+VI+Hive(持续更新)
前言 本文主要是记录下工作中可能用到的一些linux指令,当作字典查用 Crontab 基本命令 # 安装 yum -y install vixie-cron crontabs#查看状态 servic ...
- JS-Promise(使异步操作同步执行)
单个异步操作同步 <div id="box"></div> <script> var box = document.querySelector( ...
- npm install 安装不成功,提示python2.7
npm install 安装不成功的原因 是因为缺少python的环境 解决方法: 1.去官网下载https://www.python.org/download/releases/2.7/ 2.安装成 ...
- 002-Visio绘制时序图
一.概述 1.1.什么时候使用 当编码的时候,知道有的用例的业务逻辑按照比较确定的时间先后顺序进行展开.这时候,我们就需要知道我们设计的系统中的不同类之间传递消息(可以认为是不同对象函数间的调用)要按 ...
- swiper在vue中的用法
首先通过npm i vue-awesome-swiper --save 来在vue中下载插件 然后再main.js中引入 require('swiper/dist/css/swiper.css')im ...