SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】

39 篇文章 1 订阅
33 篇文章 2 订阅

SpringBoot系列文章目录

SpringBoot知识范围-学习步骤–【思维导图知识范围】

本系列校训

用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!

SpringBoot技术很多很多

本文专指ErrorPage出错页面,可以是SSM的项目,也可以是springBoot 的项目
在这里插入图片描述

韩顺平说:学习JAVA的人有两大难
第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥
第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。
Spring的外围技术就更多了。其实,ErrorPage就是其中之一。
在这里插入图片描述
所以,学习东西要系统一些,如果基本功不够,那后面的技术就会学的很浮。

环境及工具:

本系列环境

环境win11
工具idea 2017/idea 2018
jdk1.8
数据库mysql5.5
maven3.2.1
项目导入方式maven 导入
数据库前端工具mysql-front (navicat 也可以)

数据库前端工具:mysql-front (navicat 也可以)
主要是这些跟PHPStudy 2018 整合了,所以有的时候懒的打开navicat
关于环境的重要性,直接看上面的《SpringBoot 的项目编译即报错处理–JSB系列之001

必要的知识

error-page元素用于将一段错误代码或一个异常类型映射到Web应用中的资源路径,从而在产生特殊的HTTP错误或指定的Java异常时,将显示相关的资源。
error-code元素包含HTTP错误代码。exception-type是Java异常类型的完全限定的名称。location元素是Web应用中的资源相对于应用目录的路径。
下图就是一个错误页面的例子:
本质上就是让你原来的错误页数,换了一个“肤”,所以,其实,错误页面是接手了以前的那一堆的文字(这个会让客户很难受)
在这里插入图片描述
但是问题也是相对的。
在这里插入图片描述
事实上成熟的程序员更愿意看到的是这样的出错页面,因为这里包括了出错的信息,方便程序员修正这个错误,
所以,ErrorPage(错误页面)一般是在项目的后期再加上去,不然很影响项目的前期调错

这里举个例子要注意的是这是JSP技术,每次产生HTTP 404错误代码时,下面的部署描述符可使Web容器显示error404.html页面:

JSP page指令errorPage设置错误页
errorPage 属性用来指定一个 JSP 页面,由该页面来处理当前页面中抛出但未被捕获的任何异常(即类型为 Throwable 的对象)。它的应用方式如下:
<%@ page errorPaqe=“Relative URL” %>
会出现错误的页面

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page errorPage="error.jsp"%>
<html>
<head>
<title>test errorPage</title>
</head>
<body>
<center><h2>errorPage属性测试</h2></center>
</body>
</html>

错误处理页error.jsp

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page isErrorPage="true"%><%--表示该页面是错误页 --%>
<html>
<head>
<title>test isErrorPage</title>
</head>
<body>
<center><h2>isErrorPage属性测试</h2></center>
</body>
</html>

深层一些的知识

异常由外到内如下:
web服务器处理异常—>web应用里面web.xml处理异常—>Spring框架处理异常---->控制器注释处理异常
—>控制器方法里面try处理异常
这里有一个顺序的问题
在这里插入图片描述

  1. Tomcat异常处理
    简单,暴力,项目实施人员就搞定,完全不管项目技术。

  2. Web应用程序
    有web.xml 的时候真香系列
    :在conf/web.xml里面加入错误页面配置信息。

    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/jsp/404.jsp</location>
    </error-page>    
    <error-page>
        <error-code>500</error-code>
        <location>/WEB-INF/jsp/500.jsp</location>
    </error-page>
    <error-page>
        <exception-type>
            java.lang.Exception
        </exception-type>
        <location>/WEB-INF/jsp/error.jsp</location>
    </error-page>
  1. Spring框架处理异常
    就是本文啦。

上效果图

这里的效果图是本项目的,要区分开
在这里插入图片描述

在Spring Boot里使用ErrorPage

这里还需要配置类的知识,请参见《SpringBoot 的配置类–JSB系列之003
这里一定要把这个知识点弄懂,还有就是配置类与其它的controller的运行顺序。
在这里插入图片描述

package com.code.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;


@Configuration
public class WebConfig extends WebMvcConfigurerAdapter implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ErrorPageInterceptor());
        super.addInterceptors(registry);
    }
}

然后,做一个ErrorPageInterceptor 拦截器
在这里插入图片描述

package com.code.config;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;

/**
 * @program: ccx-axis-change
 * @description: 自定义errorPage拦截器
 * @author: YangPeng
 * @create: 2018-07-11 15:51
 **/
@Component
public class ErrorPageInterceptor extends HandlerInterceptorAdapter {
    private List<Integer> errorCodeList = Arrays.asList(404, 403, 500);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
            Exception {
        if (errorCodeList.contains(response.getStatus())) {
            //捕获异常后进行重定向,controller对应的requestMapping为/error/{code}
            response.sendRedirect("/error/" + response.getStatus());
            return false;
        }
        return super.preHandle(request, response, handler);
    }
}

再然后,是处理这个映射地址的controler类

在这里插入图片描述

package com.code.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;



/**
 * @program: ccx-axis-change
 * @description: 自定义controller,来接收拦截器拦截后重定向的请求
 * @author: YangPeng
 * @create: 2018-07-11 15:51
 **/
@Controller

public class ErrorPageController {
    @RequestMapping(value = "/error/{code}")
    public String error(@PathVariable int code, Model model) {
        String pager = "";
        switch (code) {
            case 403:
                model.addAttribute("code", 404);
                pager = "/common/error_403";
                break;
            case 404:
                model.addAttribute("code", 500);
                pager = "/common/error_404";
                break;
            case 500:
                model.addAttribute("code", 500);
                pager = "/common/error_500";
                break;
        }
        return pager;
    }
}

最后还要做一个errorpage.html 或error.jsp的页面。
这里写的简单一些。

<html>
<head>
    <title>Title</title>
</head>
<body>
<img src="../img/error.jpg">
</body>
</html>

最后的成果。
在这里插入图片描述

还要注意的是

如果项目里使用了shiro 的话,一定要把 验证码的URL放出来,不然的话,你的验证码的路径被你自己的shiro 敌我不分的胡乱杀掉了。
这里就不详细说了,这个知识点涉及的问题,比验证码还多。

/**
	 * 配置shiro的过滤器
	 */
	@Bean(SHIRO_FILTER)
	public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
		ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
		// 设置安全管理器
		factoryBean.setSecurityManager(securityManager);
		// 设置未登陆的时要跳转的页面
		factoryBean.setLoginUrl(loginUrl);
		Map<String, String> filterChainDefinitionMap = new HashMap<>();
		// 设置放行的路径
		if (anonUrls != null && anonUrls.length > 0) {
			for (String anon : anonUrls) {
				filterChainDefinitionMap.put(anon, "anon");
			}
		}
		filterChainDefinitionMap.put("/static/**", "anon"); // 先把页面全放行了,不然调 试起来太麻烦了 ,by项目花园范德彪
		filterChainDefinitionMap.put("/code/**", "anon"); //这里要注意的是把验证码的URL放出来,不然不会显示到登陆上。by项目花园范德彪
		
		// 设置登出的路径
		if (null != logOutUrl) {
			filterChainDefinitionMap.put(logOutUrl, "logout");
		}
		// 设置拦截的路径
		if (authcUlrs != null && authcUlrs.length > 0) {
			for (String authc : authcUlrs) {
				filterChainDefinitionMap.put(authc, "authc");
			}
		}
		Map<String, Filter> filters=new HashMap<>();
//		filters.put("authc", new ShiroLoginFilter());
		//配置过滤器
		factoryBean.setFilters(filters);
		factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
		return factoryBean;
	}

成功之后就可以展示出效果图的样子了。

另外:
数据源里的datasource 的名字。用户名,密码。还有就是mysql 的驱动是com.mysql.jdbc.Driver
总的来说,
com.mysql.jdbc.Driver 是 mysql-connector-java 5.5之前的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及6之后的的,
初学者容易陷入一个误区,就是什么东西最新版是最好的,事实上很有可能他写的东西,明明JDK6.0就完全足够。一边喊着自己的机器内存不足,一边让内存运行着他自己用不到的东西。就比如说idea应该算是这些开发者工具里最卡的。有人可能明明只是打开几个网页,那为什么不使用webstorm? 甚至不是写很多代码的时候,为什么不选择更轻量级的VSCode?

配套资源

配套资源
SpringBoot中ErrorPage(错误页面)的使用–【ErrorPage组件】
https://download.csdn.net/download/dearmite/88136229

作业:

无,看懂即是神
范德彪经典语录: 学SpringBoot,你不能按套路出牌,你要灵活
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

项目花园范德彪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值