引言
没有完美的程序,只有不断的追求完美,我们才能进步和成长,程序的运行不可能是一帆风顺的,当出现一些错误时,比如500服务器内部错误,404用户访问错误的URL,405用户无此权限........针对这些问题Spring Boot给我们提供了一些错误的信息页面提示。
Spring Boot提供的404错误页面作为开发人员我们一眼就能看懂,但是如果给用户看这种页面,不知情的用户还以为我们的系统怎么了,造成用户体验度非常不好,针对这些问题我们应该给用户友好的提示,一般我们都需要定制一些错误的页面。
自定义错误页面:
1.静态资源的方式:
1.在resources
目录下创建public/error
目录,编写错误页面。
2.访问测试:
2.动态方式:
1.使用IDEA建立一个Spring Boot项目,在pom.xml文件中添加和配置如下内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
2.在src/main/
下创建webapp/view/error/
目录,并在下面定义错误页面:
3.在application.yml
文件中配置Spring MVC
视图解析器:
4.编写ErrorConfiguration
配置类:
(1)编写代码之间我们先普及一下小知识:
我们使用基于java容器配置的方式,在Spring 3.0
中引入了基于java容器的配置,Spring
Java容器配置支持中的中心工件是 @Configuration
注解用于注释类和@Bean
用于注释方法,对于熟悉Spring
XML配置中<beans/>
配置的开发人员,@Bean
注释与<bean/>
元素的作用相同。
EmbeddedServletContainerCustomizer
接口可以自定义嵌入式servlet容器的策略界面。这种类型的bean将在容器本身启动之前与容器工厂进行回调,因此我们可以设置端口,地址,错误页面等。
通过查看API发现此接口只有一个方法customize
,此方法需要传递ConfigurableEmeddedServletContainer
的实现类对象。
ConfigurableEmeddedServletContainer
是一个接口,阅读API文档得知此接口继承了ErrorPageRegistry
接口。
阅读API文档得知ErrorPageRegistry
接口中只有一个addErrorPage
方法,此方法需要传递ErrorPage
对象。
阅读API文档得知ErrorPage
类表示简单和容器无关的servlet错误页面抽象,此类相当于web.xml
中的<error-page>
,ErrorPage提供了三种构造方法,我们只使用public ErrorPage(org.springframework.http.HttpStatus status,String path)
构造,指出一个错误类型(org.springframework.http.HttpStatus
是一个枚举类型,里面提供了http
状态码
),并传递一个错误呈现的路径即可。
(2)知识普及完了开始编写编写ErrorConfiguration配置类:
@Configuration
public class ErrorConfiguration {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400.html"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404.html"));
container.addErrorPages(newErrorPage(HttpStatus.METHOD_NOT_ALLOWED,"/error/405.html"));
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500.html"));
}
};
}
5.编写ErrorController
前端控制器:
(1)脑补一下:
Spring4.3
中引进了@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
、@PatchMapping
,来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。
@GetMapping
是一个组合注解,是@RequestMapping(method = RequestMethod.GET)
的缩写,该注解将http get
请求映射到特定的处理方法上,其余的那几个大家举一反三也就明白了吧。
(2)编写代码:
@Controller
@RequestMapping(value = "error")
public class ErrorController {
/**
* 配置400错误转发
* @return
*/
@GetMapping(value = "400.html")
public String badequest() {
return "error/400";
}
/**
* 配置404错误转发
* @return
*/
@GetMapping(value = "404.html")
public String notFound() {
return "error/404";
}
/**
* 配置405错误转发
* @return
*/
@GetMapping(value = "405.html")
public String merthodNotAllowed() {
return "error/405";
}
/**
* 配置500错误转发
* @return
*/
@GetMapping(value = "500.html")
public String serverError() {
return "error/500";
}
}
6.访问测试:
总结
这两种方式我这里都进行了配置,我想证明一下两种方式如果同时存将会使用哪种方式呢,通过实践证明,当静态资源配置和动态配置同时存在时动态资源配置生效。
网友评论