Springboot整合之Listener、静态资源、异常处理、热部署

本文深入讲解SpringBoot的高级特性,包括Listener的整合方法、静态资源访问途径、多种异常处理策略及热部署技巧。

Springboot整合之Listener、静态资源、异常处理、热部署

目录:1、Springboot整合Listener 2、Springboot访问静态资源 3、异常处理 4、热部署

一、SpringBoot整合Listener

两种方式完成组件的注册

1、通过注解扫描完成组件的注册

FirstListener

package com.lee.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 注解的方式注册listener组件
 * <listener>
 *     <listener-class>com.lee.listener.FirstListener</listener-class>
 * </listener>
 */
@WebListener
public class FirstListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("first listener init.....");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("first listener destroy.....");
    }
}

启动类

package com.lee;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//该注解会扫描当前包和其子包下的 @WebServlet,@WebFilter,@WebListener
//并在启动类启动的时候将其实例化
@ServletComponentScan
@SpringBootApplication
public class SpringbootApplicationListener1 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationListener1.class,args);
    }

}

结果:

first listener init.....
second filter init
first filter init

2、通过方法完成组件的注册

SecondListener

package com.lee.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class SecondListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("second listener init....");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("second listener destroy....");
    }
}

启动类

package com.lee;

import com.lee.listener.SecondListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootApplicationListener2 {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplicationListener2.class,args);
    }

    @Bean
    public ServletListenerRegistrationBean<SecondListener> secondListener(){
        ServletListenerRegistrationBean<SecondListener> bean = new ServletListenerRegistrationBean<>();
        bean.setListener(new SecondListener());
        return bean;
    }

}

结果:

second listener init....
first listener init.....
second filter init
first filter init

二、SpringBoot访问静态资源

两种查找静态资源的方式,当然还有其他的方式,后续补充介绍

1、classpath下的static的目录下

Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caQpPYf0-1573701100253)(C:\Users\james\Desktop\笔记\SpringBoot\images\1.png)]

访问:
	http://localhost:8080/images/dear.jpg
	http://localhost:8080/index.html

2、ServletContext根目录下

在main下创建webapp 讲images和html移入即可,不推荐

三、异常处理

异常处理方式

springboot中对于异常处理提供了五中处理方式:
	1、自定义错误页面
	2、@ExceptionHandler注解处理异常
	3、@ControllerAdvice + @ExceptionHandler注解处理异常
	4、配置SimpleMappingExceptionResolver类完成异常处理
	5、自定义HandlerExceptionResolver类处理异常

1、自定义错误页面

springboot默认的处理异常的机制:springboot默认的已经提供了一套处理异常的机制,一旦程序中出现了异常,springboot会向、error的URL发送请求。在springboot中提供了一个叫BasicExcetionController来处理error请求。然后跳转到默认显示异常的页面来展示异常信息。

Controller

package com.lee.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DemoController {

    @RequestMapping("/show")
    public String show(){
        String s = null;
        s.length();
        return "index";
    }

    @RequestMapping("/show2")
    public String show2(){
        int i = 100/0;
        return "index";
    }
}

自定义错误页面/resources/template/error.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异常处理页面</title>
</head>
<body>
    页面出现异常,请您联系管理员.....<br/>
    <span th:text="#{exception}"> </span>
</body>
</html>

2、@ExceptionHandler注解处理异常

Controller

package com.lee.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class DemoController {

    @RequestMapping("/show")
    public String show(){
        String s = null;
        s.length();
        return "index";
    }

    @RequestMapping("/show2")
    public String show2(){
        int i = 100/0;
        return "index";
    }

    @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullException(Exception e){
        ModelAndView mav = new ModelAndView("error1");
        mav.addObject("error",e.toString());
        return mav;
    }

    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView arithmeticException(Exception e){
        ModelAndView mav = new ModelAndView("error2");
        mav.addObject("error",e.toString());
        return mav;
    }
}

自定义错误页面/resources/template/error1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异常处理页面NullPointerException</title>
</head>
<body>
    页面出现异常,请您联系管理员.....<br/>
    <span th:text="${error}"> </span>
</body>
</html>

自定义错误页面/resources/template/error2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异常处理页面ArithmeticException</title>
</head>
<body>
    页面出现异常,请您联系管理员.....<br/>
    <span th:text="${error}"> </span>
</body>
</html>

注意:代码冗余

3、@ControllerAdvice + @ExceptionHandler注解处理异常

Controller

package com.lee.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UsersController {

    @RequestMapping("/showUsers")
    public String showUsers(){
        String s = null;
        s.length();
        return "index";
    }

    @RequestMapping("/showUsers2")
    public String showUsers2(){
        int i = 100/0;
        return "index";
    }
}

GlobalException

package com.lee.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class GlobalException {

    @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullException(Exception e){
        ModelAndView mav = new ModelAndView("error1");
        mav.addObject("error",e.toString());
        return mav;
    }

    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView arithmeticException(Exception e){
        ModelAndView mav = new ModelAndView("error2");
        mav.addObject("error",e.toString());
        return mav;
    }
}

注意:提高了代码的复用性

4、配置SimpleMappingExceptionResolver类完成异常处理

GlobalException2

在这之前要先把上一节的ControllerAdvice去掉,以免影响测试结果

package com.lee.exception;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import java.util.Properties;

/**
 * 配置SimpleMappingExceptionResolver类完成异常处理
 */
@Configuration
public class GlobalException2 {

    //缺点是只能返回异常映射的视图,不能返回异常映射的内容
    @Bean
    public SimpleMappingExceptionResolver method1(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();

        Properties mappings = new Properties();
        /**
         * 参数一:异常的类型,注意必须是异常的全名
         * 参数二:异常返回的视图
         */
        mappings.setProperty("java.lang.NullPointerException","error1");
        mappings.setProperty("java.lang.ArithmeticException","error2");
        //设置异常与视图的映射信息的
        resolver.setExceptionMappings(mappings);
        return resolver;
    }

}

注意:这个方法其实是对ControlerAdvice的一个精简,用一个方法来解决上述异常问题的

5、自定义HandlerExceptionResolver类处理异常

GlobalException3

在这之前要先把上一节的ControllerAdvice和GlobalException2去掉,以免影响测试结果

package com.lee.exception;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class GlobalException3 implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mav = new ModelAndView();

        if(e instanceof NullPointerException){
            mav.setViewName("error1");
        }else if(e instanceof ArithmeticException){
            mav.setViewName("error2");
        }

        mav.addObject("error",e.toString());
        return mav;
    }
}

注意:该方式旨在解决第四种方式不能返回异常内容的问题

还有其他处理异常的方式…待续…

四、热部署

springboot的热部署方式分为两种:
1、SpringLoader插件---【不推荐使用,不再介绍】--热部署的方式 
2、DevTools工具---重新部署的方式

1、DevTools工具

<!-- Spring boot 热部署 : 此热部署会遇到 java.lang.ClassCastException 异常 -->
<!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖该项目的项目如果想要使用devtools,需要重新引入 -->

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
中北萌新程序员于 2024-07-30 22:46:40 发布阅读量4.6w 收藏 1k点赞数 186分类专栏: java框架 每日学习 文章标签: spring boot 后端 java版权每日学习同时被 2 个专栏收录47 篇文章12 订阅订阅专栏java框架15 篇文章4 订阅订阅专栏目录:SpringBootSpring的缺点什么是SpringBootSpringboot3 版本要求Springboot的三种构建方式官网搭建通过IDEA脚手架搭建通过Maven搭建项目SpringBoot的项目结构编写一个测试代码YAML文件自定义配置文件@Value读取配置文件@ConfigurationProperties读取配置文件SpringBoot整合Web开发注册方式一注册方式二SpringBoot整合Web开发_Filter注册方式一注册方式二SpringBoot整合Web开发_Listener注册方式一注册方式二SpringBoot整合Web开发_静态资源SpringBoot整合Web开发_静态资源其他存放位置SpringBoot整合Web开发_JSPSpringBoot整合MyBatisSpringBoot单元测试SpringBoot热部署SpringBoot定时任务SpringBoot内容协商机制SpringBoot内容协商机制_基于请求参数SpringBoot国际化SpringBoot国际化_在Thymeleaf中进行国际化SpringBoot参数校验简单数据类型异常处理参数校验_校验相关注解参数校验_对象类型SpringBoot指标监控添加Actuator功能Spring Boot AdminSpringBoot日志管理Logback打印自定义日志SpringBoot项目部署项目打包多环境配置Dockerfile制作镜像Maven插件制作镜像SpringBoot3新特性与之前版本的改动ProblemDetails原生镜像Native Image 和 GraalVM生成原生镜像生成Linux原生镜像SpringBootSpring的缺点Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。总结起来,Spring的缺点就是:配置过于繁琐。引入的依赖过多,版本控制复杂。什么是SpringBootSpringBootSpring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式SpringBoot的优点:配置简单依赖引入简单提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。自动配置SpringBoot项目自动提供最优配置,同时可以修改默认值满足特定的要求。起步依赖SpringBoot的依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。Springboot3 版本要求然使用SpringBoot是需要一定版本要求的:
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值