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上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...
随机推荐
- PB TB级数据
Byte.KB.MB.GB.TB.PB.EB.ZB.YB. 1KB=1000B1MB=1000KB1GB=1000MB1TB=1000GB 1TB=240B=1024MB 1PB=250B k M G ...
- python cv2在验证码识别中的使用
使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志 cv2.IMREAD_COLOR:默认参数,读入一副彩色图 ...
- legend3---1、meedu安装
legend3---1.meedu安装 一.总结 一句话总结: 视频的安装教程做主菜,辅以文档安装教程做配料,口感甚佳. 1.为什么不直接从github下载文件的发行版,而要选择composer方式安 ...
- TP5内部异常API数据输出的自定义方法编写
需求:利用postman进行请求api接口过程中 关于一些数据输出异常的情况下 我们希望通过自己编写一些类和方法 实现便于后端人员进行根据提示进行调试处理! 以下测试的时候 请设置 app_debug ...
- 知道css有个content属性吗?有什么作用?有什么应用?
css的content属性专门应用在 before/after 伪元素上,用来插入生成内容.最常见的应用是利用伪类清除浮动. //一种常见利用伪类清除浮动的代码 .clearfix:after { c ...
- 九个console命令调试JS
下面九个console命令,可以帮助我们更方便地调试 常用的console命令,最常用的事console.log() 1 //常用的console命令,其中最常用的console.log() 2 co ...
- KEIL建立新唐MCU的工程时,移植官网程序报错变量未定义问题解决方法
最近在使用新唐的MCU,新唐的MCU使用还算方便,你安装好KEIL之后再安装 Nu-Link_Keil_Driver_V3.00.6909 驱动即可建立新唐的MCU工程,注意的是因为新唐MCU是C51 ...
- SPOJ NICEBTRE - Nice Binary Trees(树 先序遍历)
传送门 Description Binary trees can sometimes be very difficult to work with. Fortunately, there is a c ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- P5030 长脖子鹿放置
题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...