【SpringMVC】| 异常处理器、基于全注解配置SpringMVC

news2024/11/15 11:32:29

目录 

异常处理器

1. 基于配置的异常处理

2. 基于注解的异常处理(用类代替xml配置)

基于全注解配置SpringMVC

1. 创建初始化类,代替web.xml

2. 创建SpringConfig配置类,代替spring的配置文件

3. 创建WebConfig配置类,代替SpringMVC的配置文件


异常处理器

(1)SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver

(2)HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver(SpringMVC默认使用的异常处理器)和SimpleMappingExceptionResolver(SpringMVC提供的自定义的异常处理器 )

1. 基于配置的异常处理

需求:出现某个异常,跳转到某个指定页面

controller

    @RequestMapping("/exception")
    public String testException(){
        int m = 10/0;
        return "success";
    }

执行结果:抛出异常信息

在SpringMVC中自定义的异常处理器SimpleMappingExceptionResolver  

①第一个参数:是异常映射exceptionMappings,本质上是一个Properties类型,所以要使用props标签指定key和value。key是指定某个异常,value表示出现这个异常就会跳转到某个页面,这个页面没有写前缀,也会被thymeleaf拼接前后缀!

②第二个参数:name是异常参数exceptionAttribute,value是一个变量参数(是一个键)、可以根据这个键拿到抛出的异常信息。

    <!--自定义异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--抛出那个异常去跳转到那个页面-->
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
        <!--异常信息放到域对象中,到error页面中展示-->
        <property name="exceptionAttribute" value="ex"></property>
    </bean>

error.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>error</h1>
<p th:text="${ex}"></p>
</body>
</html>

执行结果:

注:不在浏览器上直接抛出异常,而是跳转到某个指定的页面,打印异常的信息!

2. 基于注解的异常处理(用类代替xml配置)

假如现在出现了空指针异常

    @RequestMapping("/exception")
    public String testException(){
        String s = null;
        s.toString();
        return "success";
    }

异常类的组件

主要用到两个注解:@ControllerAdvice 和 @ExceptionHandler

@ControllerAdvice注解是将当前类标识为异常处理的组件,是一个复合注解,有@Component注解的功能,可以让组件扫描到,所以这个类不需要在配置文件中配置了。

②@ExceptionHandler注解是一个异常的数组,ex表示当前请求处理中出现的异常对象。

package com.zl.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionController {
    
    @ExceptionHandler(value = {NullPointerException.class})
    public String testException(Exception ex, Model model){
        model.addAttribute("ex",ex);
        return "error";
    }
}

执行结果:

基于全注解配置SpringMVC

使用配置类和注解代替web.xmlspringmvc.xml配置文件的功能!

1. 创建初始化类,代替web.xml

(1)在Servlet3.0环境中,容器会在类路径中(src或resources下)查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。

(2)Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。

(3)Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。

解释:默认是要必须重写三个方法:分别代替Spring的配置、SpringMVC的配置、还有DispatcherServlet的映射规则;但是我们知道在web.xml中标配是两个过滤器和一个DispatcherServlet,所以还要重写一个方法,去代替这两个过滤器的配置!

package com.zl.mvc.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;


// web工程的初始化类,用来代替web.xml
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    // 指定spring的配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    // 指定SpringMVC的配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    // 指定DispatcherServlet的映射规则,即url-pattern
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    
    // 添加过滤器
    @Override
    protected Filter[] getServletFilters() {
        // post乱码过滤器
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceRequestEncoding(true);
        characterEncodingFilter.setForceResponseEncoding(true);

        // 处理put和delete请求的过滤器
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();

        return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
    }
}

2. 创建SpringConfig配置类,代替spring的配置文件

注:SSM整合之后,spring的配置信息写在此类中!

package com.zl.mvc.config;

import org.springframework.stereotype.Controller;

@Controller
public class SpringConfig {
}

3. 创建WebConfig配置类,代替SpringMVC的配置文件

目前主要配置8个部分:

1. 扫描组件;

2. 视图解析器thymeleaf ;

3. 视图控制器:view-controller ;

4. 默认的Servlet(静态资源的处理):default-servlet-handler ;

5. 开启mvc注解驱动 ;

6. 文件上传解析器;

7. 异常处理器 ;

8. 拦截器;

注:对于一些Bean直接配置就可以使用,对于一些组件的开启:例如视图控制器等就需要实现 WebMvcConfigurer这个接口,然后调用方法去实现!

package com.zl.mvc.config;

import com.zl.mvc.interceptor.TestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import java.util.List;
import java.util.Properties;

// 代替SpringMVC的配置文件
@Configuration // 将当前类标识为一个配置类
// 1. 扫描组件
@ComponentScan("com.zl.mvc.controller")
// 5. 开启mvc注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer { // 对于一些组件的功能就需要实现这个接口去实现

    // 2. 视图解析器thymeleaf
    //配置生成模板解析器
    @Bean // 将返回的对象纳入Spring容器管理
    public ITemplateResolver templateResolver() {
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
                webApplicationContext.getServletContext());
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }

    //生成模板引擎并为模板引擎注入模板解析器
    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }

    //生成视图解析器并未解析器注入模板引擎
    // 每个方法的参数是上一个对象,通过自动装配完成的!
    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }

    // 3. 视图控制器:view-controller
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello").setViewName("hello");
    }

    // 4. 默认的Servlet(静态资源的处理):default-servlet-handler
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    // 6. 文件上传解析器
    @Bean
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        return commonsMultipartResolver;
    }

    // 7. 异常处理器
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();

        Properties prop = new Properties();
        prop.setProperty("java.lang.ArithmeticException", "error");
        // 主要就调用两个方法
        exceptionResolver.setExceptionMappings(prop);
        exceptionResolver.setExceptionAttribute("ex");
        resolvers.add(exceptionResolver);
    }

    // 8. 拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 创建拦截器对象
        TestInterceptor interceptor = new TestInterceptor();
        // 后面跟拦截路径和放行路径
        registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns("/select");
    }
}

controller:发出请求跳转到index

package com.zl.mvc.controller;

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


@Controller
public class TesController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }
}

index.html页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>index</h1>
</body>
</html>

测试结果:通过配置类和注解的方式也能正常访问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈夫曼树的原理及构造方法

目录 1. 什么是哈夫曼树 2. 为什么有哈夫曼树 3. 哈夫曼树的原理 3.1 哈夫曼树的构造方法 3.2 哈夫曼解码 3.3 几种定义 4. 哈夫曼二叉树的特点 5. 关于哈夫曼树的代码 1. 什么是哈夫曼树 哈夫曼树解决的是编码问题&#xff0c;给定N个权值作为N个叶子结点&#xff0c;构…

Springboot tomcat bean 默认作用域 singleton 情况下模拟线程不安全情况 设置多例方式 prototype

目录 写一个控制层的类 验证方法 ​编辑 分别执行如下请求&#xff0c;先执行等待时间久的 日志结果 结论 配置多例模式 配置文件application.properties 类加注解 配置类方式 写一个控制层的类 package com.example.ctr;import lombok.extern.slf4j.Slf4j; import …

【ISE】PlanAhead report_timing报VIOLATED问题

这里写自定义目录标题 背景ISE PR结果PlanAhead结果使用ISE twx使用PlanAhead综合、实现 问题 分析Timer Settings 结论&#xff1f; 背景 最近调试一个老型号FPGA&#xff0c;时序问题分析&#xff0c;方便以后参考。 ISE PR结果 在下图可以看到All Constraints Met&#x…

iOS iPadOS safari 独立Web应用屏幕旋转的时候 onresize window.innerHeight 数值不对。

iOS iPadOS safari 独立Web应用屏幕旋转的时候 onresize window.innerHeight 数值不对 一、问题描述 我有一个日记应用&#xff0c;是可以作为独立 Web 应用运行的那种&#xff0c;但在旋转屏幕的时候获取到的 window.innerHeight 和 window.innerWidth 就不对了&#xff0c;…

【C#】使用System.Data.SqlClient 进行简单批量操作

在实际项目开发中&#xff0c;可能会在定时任务里进行批量添加的操作&#xff0c;或者需要写一些小工具进行批量添加测试。 此篇文章就是使用System.Data.SqlClient 进行简单批量操作。 目录 1、批量插入数据1.1、示例代码1.2、列映射1.3、是否需要映射列 2、批量更新数据3、链…

ZigBee组网-基于协议栈的UART实验(实现收发)(保姆级)

目录 基于协议栈的UART实验 前言 协议栈中的TI自带UART的使用实验 UART配置基本步骤 串口初始化 串口发送 串口接收回显 实验效果 拓展 移植我们自己UART串口 移植配置过程 实验效果 基于协议栈的UART实验 前言 与之前的Zigbee裸机实验不同&#xff0c;我们既可以…

神奇的MATLAB解密工具,让你轻松解密.p文件!

大家都知道&#xff0c;MATLAB是一款功能强大的数学软件&#xff0c;但是在进行代码保护和共享方面&#xff0c;却存在一些困难。这时候&#xff0c;一款优秀的MATLAB解密工具就显得尤为重要。它可以帮助我们解决诸多问题&#xff0c;比如.p文件解密、p文件转m代码等。接下来&a…

mallocstacklogging和MallocStackLoggingNoCompact引起的app文稿数据快速增加

最近由于定位一个iOS16系统适配引起的闪退设置了mallocstacklogging和MallocStackLoggingNoCompact。 配置如下&#xff1a; 在上线前测试&#xff0c;结果发现手机存储空间不足。删除了手机的很多图片后&#xff0c;测试不到两分钟&#xff0c;手机存储空间又不足了。查看app…

Flink运行原理

Apache Flink是什么&#xff1f;对于这个问题&#xff0c;Apache软件基金会官方给出了定义&#xff1a;Flink是一种框架和分布式处理引擎&#xff0c;主要用于对无界和有界数据流进行有状态计算。 本文将从以下几个方面来了解flink运行原理&#xff1a; 【Flink运行时四大组件…

骨传导耳机可以长期佩戴吗,几款佩戴舒适的骨传导耳机清单

骨传导耳机是通过耳朵传声方式&#xff0c;提高了听神经的使用频率&#xff0c;对听觉系统所产生刺激会随之下降。目前骨传导耳机主要应用于运动和娱乐两大领域&#xff0c;尤其是在运动场景中骨传导耳机能够避免传统耳机因佩戴入耳式耳机造成的听力下降问题&#xff0c;更能增…

Python批量将doc转成docx并读取docx的内容

有时候我们需要将doc的文件转成docx的格式&#xff0c;但是如果直接修改文件名后缀的话有时候会没有效果&#xff0c;今天我们利用python批量将doc后缀的word文档转成docx的格式。 也找了很多方法&#xff0c;最终还是找到了就是利用win32com去解决这个问题 很多人在执行这一…

【MySQL】不就是事务

前言 嗨咯&#xff0c;小伙伴们大家好呀&#xff0c;我已经一个星期没有更新了&#xff0c;实在抱歉&#xff01;本期我们要学习MySQL初阶中的最后一课&#xff0c;MySQL数据库中的事务也算是近几年面试必考的问题&#xff0c;所以我们一定要认真学习。 目录 前言 目录 一、事…

学会用智慧轻松的方式过生活

曾经&#xff0c;有位远在黑龙江的女性福主告诉峰民&#xff0c;她说她活不久了。 峰民很是惊讶&#xff0c;不可能吧&#xff0c;你才39岁啊&#xff0c; 她说&#xff1a;我查出了子宫有瘤&#xff0c;峰民听后就说&#xff0c;没事&#xff0c;放心&#xff0c;肯定是良性。…

Python3,处理Excel文件IO流的方法那么多,或许只有Pandas算得上靠谱。

Pandas处理Excel文件IO流的方法 1、引言2、代码实例2.1 什么是文件IO流2.1.1定义2.1.2 字节流、字符流 2.2 常见的Excel文件IO流处理方法2.3 Pandas处理Excel文件IO流2.3.1 直接读取处理2.3.2 转换io流进行处理 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 求助。 小…

深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用22-构建万能数据生成类的技巧&#xff0c;适用于CNN,RNN,GNN模型的调试与训练贯通。本文将实现了一个万能数据生成类的编写&#xff0c;并使用PyTorch框架训练CNN、RNN和GNN模型。 目录&#xff1…

摄像机控制——旁轴摇移

通常摄像机进行摇移控制的时候&#xff0c;都是以摄像机正前方中心位置作为注视点进行环绕控制的&#xff0c;如果在注释点位置有物体&#xff0c;那么感受上是围绕着该物体进行观察。 但是最近公司的策划要求摇移时候的围绕点是鼠标点击的位置&#xff0c;而不是摄像机的正中心…

零基础网络安全学习路线,真的很全,建议收藏!!!

很多小伙伴在网上搜索网络安全时&#xff0c;会出来网络安全工程师这样一个职位&#xff0c;它的范围很广&#xff0c;只要是与网络安全挂钩的技术人员都算网络安全工程师&#xff0c;一些小伙伴就有疑问了&#xff0c;网络安全现在真的很火吗&#xff1f; 那么今天博主就带大…

从0实现基于Linux socket聊天室-多线程服务器模型(一)

前言Socket在实际系统程序开发当中&#xff0c;应用非常广泛&#xff0c;也非常重要。实际应用中服务器经常需要支持多个客户端连接&#xff0c;实现高并发服务器模型显得尤为重要。高并发服务器从简单的循环服务器模型处理少量网络并发请求&#xff0c;演进到解决C10K&#xf…

AntDB数据库将携创新性解决方案亮相2023可信数据库发展大会

由中国通信标准化协会指导&#xff0c;中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;主办的“2023可信数据库发展大会”将于2023年7月4日——5日在北京国际会议中心召开。作为深耕通信行业15年的国产数据库产品&#xff0c;AntDB受邀参会&…

记录一下kibana启动链接报错问题(kibana server is not ready yet)

记录一下kibana启动链接报错问题(kibana server is not ready yet) 今天启动kibana出现该问题 先去看了看是否是elasticsearch连接出错 启动了容器 docker start elasticsearch docker start kibana进入了kibana容器 docker exec -it kibana bash进行了下面的操作&#xf…