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上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...
随机推荐
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...
- HDU 5634 Rikka with Phi
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 ------------------------------------------------ ...
- 软件-Jenkins:Jenkins 百科
ylbtech-软件-Jenkins:Jenkins 百科 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续 ...
- 为什么每次打出的包都是Release版本呢?
参考了:xcodebuild命令 https://www.cnblogs.com/liuluoxing/p/8622108.html 重新打个包,验证一下想法
- vcsa6.5安装部署配置(vSphere vsan 6.5)
首先您最好先了解下vcenter和vcsa是啥:VMware Vsphere 几个不同的组件 esxi是在物理服务器安装的服务端,所有虚拟机是安装再esxi里面的,是服务端:vcenter是管理端 是 ...
- python实现自动发送邮件
Python发送邮件成功的前提,应是先开启授权码.目前使用广泛的邮箱有:163邮箱.qq邮箱等. 163邮箱开启授权码的方法如下图: qq邮箱开启授权码的方法如下图: 接下来代码的实现: import ...
- Bootstrap 学习笔记4 巨幕页头略缩图警告框
- 洛谷T89643 escape
题目描述 题目链接:https://www.luogu.org/problem/T89643 由于 Kiana 实在是太忙了,所以今天的题里面没有 Kiana. 某一天学校里有 n 节课,出题人希望逃 ...
- [CF960G]Bandit Blues(第一类斯特林数+分治卷积)
Solution: 先考虑前缀,设 \(f(i, j)\) 为长度为 \(i\) 的排列中满足前缀最大值为自己的数有 \(j\) 个的排列数. 假设新加一个数 \(i+1\) 那么会有: \[ f ...
- JS对像和数组的遍历
零. 通用遍历方法 0.1 for...in... let obj = {0:"a", 1:"b", 2:"c"}; for (let ke ...