SpringBoot学习1 - WebMvcConfigurer接口 - 自定义拦截器、页面跳转、静态资源映射、状态码页面、统一异常处理

1. 自定义拦截器

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println(request.getRequestURI());

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}


配置类

// WebMvcConfigurer的接口方法全部是default
@Configuration
public class MyConfigurer  implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();
        // 需要拦截的路径,以及排出拦截的路径
        registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/resources/**");
    }

}

2. 自定义页面跳转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUnsIJ4H-1587871247091)(en-resource://database/26374:1)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efYsFjtp-1587871247099)(en-resource://database/26376:1)]


访问 localhost:端口/contextName/index - 自动跳转到main.html页面

// WebMvcConfigurer的接口方法全部是default
@Configuration
public class MyConfigurer  implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

//            addViewController:对应的地址栏请求
//            setViewName:渲染页面的实际路径
        registry.addViewController("index").setViewName("main");
    }

}

3. 自定义静态资源的映射 - 可通过配置文件取代

方案
方案1. 全局配置文件进行配置
方案2. 实现WebMvcConfigurer接口进行配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8BXJWMr6-1587871247106)(en-resource://database/26378:1)]


静态资源配置 -可以访问static-locations子目录的文件

  # 静态资源的路径
  mvc:
    # 路径匹配
    static-path-pattern: /resources/**
  resources: 
    # 实际映射的静态资源文件路径
    static-locations: classpath:/resources/

上面的配置等价于下面的代码

代码配置 -不可以访问ddResourceLocations子目录的文件

@Configuration
public class MyConfigurer  implements WebMvcConfigurer {
   
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources123/**").addResourceLocations("classpath:resources/");
    }
}

4. 自定义状态码页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e55xFo5V-1587871247114)(en-resource://database/26392:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCdCZOOB-1587871247122)(en-resource://database/26394:1)]

BookController控制器

@Controller
@RequestMapping("books")
public class BookController {

    @GetMapping("exception1")
    @ResponseBody
    public String testException() {

        throw new MyException("自定义错误1");

    }
    
    
    @PostMapping("exception2")
    @ResponseBody
    public String testException2() {

        throw new MyException("自定义错误2");

    }

}



5xx.html - thymeleaf可接收异常 - 获取异常的信息

<!DOCTYspanE html>
<html lang="en" xmlns:th=httspan://www.thymeleaf.org>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>5xx自定义状态码页面</h1>
    timestamspan:<span th:text="${timestamspan}"></span>
    <br>

    status:<span th:text="${status}"></span>
    <br>

    error:<span th:text="${error}"></span>
    <br>

    excespantion:<span th:text="${excespantion}"></span>
    <br>

    message:<span th:text="${message}"></span>
    <br>

    errors:<span th:text="${errors}"></span>
    <br>


</body>
</html>


状态码
404:没有该对应的请求地址接口
405:请求地址正确,请求的方法不对
500:接口方法执行时抛出异常

1. 随便输入一个SpringBoot应用下的地址 - 没写接口 - 404页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gPfTzYZI-1587871247130)(en-resource://database/26396:1)]

2. 接口地址正确,但请求方式不对,浏览器请求是Get,但我写的接口是Post请求 - 405页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zi6UjeIG-1587871247133)(en-resource://database/26398:1)]

3. 接口地址正确,但请求方式正确,但执行过程中抛出异常 - 500页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnJvTwqX-1587871247136)(en-resource://database/26400:1)]

5. 自定义统一异常处理

代码步骤

  1. @RestControllerAdvice 声明是异常处理中心类
  2. @ExceptionHandler 声明处理的是什么类型的异常方法


Spring统一异常处理架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Icx8QikM-1587871247140)(en-resource://database/26414:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SykVHeQR-1587871247144)(en-resource://database/26410:1)]



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njCTg19r-1587871247151)(en-resource://database/26412:1)]

BookController控制器

@Controller
@RequestMapping("books")
public class BookController {


    @GetMapping("exception1")
    @ResponseBody
    public String testException() {

        throw new MyException("自定义错误1");

    }


}



MyExceptionHandler统一异常处理类

@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(MyException.class)
    public ModelAndView ExcpetionHandler(MyException myException) {
        ModelAndView model = new ModelAndView();

        System.out.println("我经过这里MyExceptionHandler");
        model.addObject("message", myException.getMessage());
        model.addObject("note", "this is @ControllerAdvice");

        model.setViewName("error/5xx");
        return model;
    }

}


5xx.html状态码页面

<!DOCTYspanE html>
<html lang="en" xmlns:th=httspan://www.thymeleaf.org>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>5xx自定义状态码页面</h1>


    message:<span th:text="${message}"></span>
    <br>
    note: <span th:text="${note}"></span>
    <br>


</body>
</html>


测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mu0MEp9R-1587871247156)(en-resource://database/26418:1)]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值