文档章节

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

有一个小阿飞
 有一个小阿飞
发布于 10/16 22:34
字数 1431
阅读 13
收藏 0

SpringBoot学习,第二天

目录: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

访问:
	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>

© 著作权归作者所有

有一个小阿飞
粉丝 12
博文 94
码字总数 107746
作品 0
昌平
程序员
私信 提问
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
546
0
Spring Boot学习资源

Spring Boot 入门 http://blog.csdn.net/isea533/article/details/50278205 ---------------------------------------------------------- Spring Boot 静态资源处理 http://blog.csdn.net/c......

IamOkay
2017/02/17
464
0
220.详细整理学习spring boot

1.springboot是什么? 有什么用? 1.1 是什么 一个整合常用第三方框架,简化xml配置,完全采用注解形式,内置tomcat容器,帮助开发者快速实现项目搭建,spring boot 的web组件默认集成的是spr...

Lucky_Me
04/23
147
1
Springboot入坑(二):Springboot中Filter、Listener的用法

Springboot入坑(二):Springboot中Filter、Listener的用法 上一篇文章中我们讲到了快速搭建Springboot项目以及整合Mybatis,但是在实际的开发中我们还需要用到很多的东西。后面的文章中我们...

舒文joven
2018/07/25
289
0
不学无数——SpringBoot入门V

SpringBoot 1.开发一个Web程序 SpringBoot是非常适合开发Web应用的,因为他内嵌有Tomcat、Jetty、Undertow或者Netty。大部分的应用可以通过加载spring-boot-starter-web模块能够快速的创建并...

不学无数d
2018/07/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法

下面的元素属性和元素方法都通过 elem.属性 或 elem.方法 的方式使用,window属性通过 window.属性 的方式使用,document属性则通过document调用: <script> /* ****** 元素视图属性 * offs...

Bing309
18分钟前
4
0
Apache Kafka快速入门指南

简介 Kafka是基于发布订阅的消息系统。最初起源于LinkedIn,于2011年成为开源Apache项目,然后于2012年成为Apache顶级项目。Kafka用Scala和Java编写,因其分布式可扩展架构及可持久化、高吞吐...

AiChinaTech
20分钟前
2
0
Discrete Cosine Transform [DCT] (离散余弦变换)

Discrete Cosine Transform [DCT] (离散余弦变换)

divenwu
20分钟前
2
0
如何玩转 TiDB 性能挑战赛?本文教你 30 分钟快速上手拿积分!

作者:wish 上周我们正式宣布了 TiDB 性能挑战赛。在赛季内,通过向 TiDB、TiKV、PD 贡献代码完成指定类别任务的方式,你可以获得相应的积分,最终你可以使用积分兑换礼品或奖金。在性能挑战...

TiDB
21分钟前
2
0
12、SpringMVC数据回显

数据回显方法 1.springmvc默认对pojo数据进行回显。 pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) 使用@ModelAttribute指定pojo回显...

快乐的瓶子
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部