SpringMVC-异常处理及常用组件

异常处理器

1.基于配置的异常处理

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

HandlerExceptionResolver接口的实现类有: DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

springmvc提供了自定义的异常处理器SimpleMappingExceptionResolver, 使用方式: (注意拦截器要放行)

 
<!--配置 异常处理--><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!--properties的键表示 处理器方法执行过程中出现的异常,properties的键表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面--><property name="exceptionMappings"><props><prop key="java.lang.ArithmeticException">error</prop></props></property><!-- 设置 将异常信息共享在请求域中的 键 ,也可以不设置,如果不设置 页面中 就可以不写 ${ex}--><property name="exceptionAttribute" value="ex"></property></bean>
 @RequestMapping("/testExp")public String testExp(){System.out.println(1/0);return "success";}

编写 error.html

 出现错误<p th:text="${ex}"></p>   显示异常错误信息

页面显示:

出现错误

java.lang.ArithmeticException: / by zero

2.基于注解的异常处理

去掉或注释掉 springmvc 配置文件的 异常的配置SimpleMappingExceptionResolver ,采用注解方式

 //@ControllerAdvice  将当前类所标识为 异常处理的组件@ControllerAdvicepublic class ExceptionContoller {//@ExceptionHandler  用于设置所标识方法处理的异常@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})//ex 表示 当前请求处理中出现的异常对象public String test(Exception ex, Model model){model.addAttribute("ex",ex);return "error";}}@RequestMapping("/testExp")public String testExp(){System.out.println(1/0);return "success";}

页面显示:

出现错误

java.lang.ArithmeticException: / by zero

注解配置springmvc

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

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

在Servlet3.0环境中,容器会在类路径中查找实现javaxervlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。

Spring提供了这个接口的实现,名为SpringServletContainerlnitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的 WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletinitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容嚣的时候,容器会自动发现它,并用它来配置Servlet上下文。

 /**** web工程的初始化类,用来代替 web.xml*/​public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {//指定spring的配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//指定springmvc的配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}// 指定dispacherservlet的映射规则​@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//注册 过滤器@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceResponseEncoding(true);​HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();​return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};}}@Configuration   //将当前类标识为一个配置类@ComponentScan(basePackages = "com.ly")   // 1.扫描组件@EnableWebMvc    // 5.开启mvc注解驱动public class WebConfig  {​//3.view-controller​​//4: default-servlet-handler​//6. 文件上传解析器​//7. 异常处理​//8.拦截器​/*** 2.视图解析器* 以下 3个方式 都是 配置  视图解析器*///生成视图解析器,并 为 解析器注入模板引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine){ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}​​​//生成模板引擎 并为模板引擎注入模板解析器@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver){SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}​​//配置生成模板解析器@Beanpublic ITemplateResolver templateResolver(){WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);return templateResolver;​}​​}//替换spring配置文件@Configurationpublic class SpringConfig {}@Controllerpublic class TestController {​@RequestMapping("/")public String index(){return "index";}}

在webapp/WEB-INF/templates/index.html

 <body>首页</body>

启动项目 即可访问 index.html

完整版 ---使用配置类 代替springmvc.xml

 package com.ly.config;​import com.ly.interceptor.TestInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.MultipartBodyBuilder;import org.springframework.web.context.ContextLoader;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.multipart.MultipartFile;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 javax.swing.*;import java.util.List;import java.util.Properties;​/*** 代替springmvc.xml* 1.扫描组件* 2.视图解析器* 3.view-controller* 4: default-servlet-handler* 5. mvc注解驱动* 6. 文件上传解析器* 7.异常处理* 8.拦截器*/@Configuration   //将当前类标识为一个配置类@ComponentScan(basePackages = "com.ly")   // 1.扫描组件@EnableWebMvc    // 5.开启mvc注解驱动public class WebConfig implements WebMvcConfigurer {​//3.view-controller​@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/hello").setViewName("hello");}​//4: default-servlet-handler@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}//8.拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {TestInterceptor tt = new TestInterceptor();registry.addInterceptor(tt).addPathPatterns("/**");}​//6. 文件上传解析器@Beanpublic MultipartResolver multipartResolver(){CommonsMultipartResolver commonsMultipartResolver =new CommonsMultipartResolver();return  commonsMultipartResolver;}//7. 异常处理@Overridepublic 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);}​/*** 2.视图解析器* 以下 3个方式 都是 配置  视图解析器*///生成视图解析器,并 为 解析器注入模板引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine){ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}​​​//生成模板引擎 并为模板引擎注入模板解析器@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver){SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}​​//配置生成模板解析器@Beanpublic ITemplateResolver templateResolver(){WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());templateResolver.setPrefix("/WEB-INF/templates/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);return templateResolver;​}​​}

Springmvc常用组件

1.springmvc常用组件

  • DispatcherServlet: 前端控制器,不需要工程师开发,由框架提供

    作用:统一处理请求和响应,整个流程控制的中心,由它调用其他组件处理用户的请求

  • HandlerMapping:处理器映射器,不需要工程师开发,由框架提供

    作用:根据请求的url,method等信息查找Handler 即控制器方法

  • Handler: 处理器,需要工程师开发

    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理

  • HandlerAdapter: 处理器适配器, 不需要工程师开发, 由框架提供

    作用: 通过HandlerAdapter对处理器(控制器方法)进行执行

  • ViewResolver: 视图解析器,不需要工程师开发, 由框架提供

    作用:进行视图解析,得到相应的视图, 例如 ThymeleafView等

  • View: 视图,

    作用:将模型数据通过页面展示给用户

2.DispatcherServlet初始化过程

DispatcherServlet本质上是一个Servlet,所以天然的遵循Servlet的生命周期,所以宏观上是Servlet生命周期来进行调度

1.初始化WebApplicationContext

所在类:org.springframework.web.servlet.FramewrokServlet

里的 initWebApplicationContext() 方法

2.创建WebApplicationContext

所在类:org.springframework.web.servlet.FramewrokServlet

里的createWebApplicationContext()

3.DispatcherServlet初始化策略

FramewrokServlet创建WebApplicationContext后,刷新容器,

调用 onRefresh()方法此方法在DispatcherServlet中进行了重写

调用了initStrategies()方法,初始化策略,即初始化DispatcherServlet的各个组件

3.DispatcherServlet调用组件处理请求

1.processRequest()

FramewrokServlet重写了HttpServlet中的service() 和doXXX(), 这些方法中调用了processRequest(request,response)

2.doService()

所在类 org.springframework.web.servlet.DispatcherServlet

3.doDispatch() 处理请求响应

所在类 org.springframework.web.servlet.DispatcherServlet

4.processDispatchResult()

所在类 org.springframework.web.servlet.DispatcherServlet

处理模型数据,渲染视图

4.Springmvc执行流程

1.用户向服务器发送请求,请求被springmvc前端控制器DispatcherServlet捕获

2.DispatcherServlet对请求URL进行解析, 得到请求资源标识符(URI),判断请求URI对应的映射:

a. 不存在

i.再判断是否配置了 mvc:default-servlet-handler

ii.如果没配置,则控制台报映射查找不到,客户端展示404错误

No mapping for GET /xx/xx Completed 404 NOT_FOUND

iii.如果有配置,则访问目标资源(一般为静态资源 如 js,css,html), 找不到客户端也会展示 404错误

handler.SimpleHandlerMapping -Mapped to org.springframework.web.servlet.resources.DefaultServletHttpHandler Completed 404 NOT_FOUND

b.存在则执行下面的流程

3.根据该URI,调用HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回

4.DispatcherServlet根据获得的Handler, 选择一个合适的HandlerAdapter

5.如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler() 方法 [正向]

6.提取Request中的模型数据,填充Handler入参,开始执行Handler(controller)方法,处理请求,在填充Handler的入参过程中,根据你的配置spring将帮你做一些额外的工作:

a. HttpMessageConverter: 将请求消息(如json,xml等数据)转换成一个对象,将对象转换为指定的响应信息

b.数据转换:对请求消息进行数据转换,如String转换成Integer,Double等

c.数据格式化: 对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期等

d.数据验证:验证数据的有效性(长度,格式等),验证结果存储到BindingResult或Error中

7.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象

8.此时将开始执行拦截器的postHandle() 方法 [逆向]

9.根据返回的ModelAndView(此时会判断是否存在异常,如果存在异常,则执行HandlerExceptionResolver进行异常处理),选择一个适合的ViewResolver进行视图解析,根据Model 和View,来渲染视图

10.渲染视图完毕 ,执行拦截器的afterCompletion()方法[逆向]

11.将渲染结果返回给客户端

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

英杰社区https://bbs.csdn.net/topics/617804998 一、背景 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 程序包含以下几个部…

数据库的导入导出以及备份

1.数据库的导出和导入 一.navicat导入导出 导入&#xff1a;右键➡运行SQL文件 导出选&#xff1a;中要导出的表➡右键➡转储SQL文件➡数据和结构 mysqldump命 1. 进入navicat安装目录的bin目录&#xff0c;cmd打开命令窗口 2. mysql -u用户名 -p ➡ 输入密码 3. creat…

李沐之神经网络基础

目录 1.模型构造 1.1层和块 1.2自定义块 1.3顺序块 1.4在前向传播函数中执行代码 2.参数管理 2.1参数访问 2.2参数初始化 3.自定义层 3.1不带参数的层 3.2带参数的层 4.读写文件 4.1加载和保存张量 4.2加载和保存模型参数 1.模型构造 1.1层和块 import torch fr…

K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用

最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…

网卡高级设置-提高网络环境

网卡高级设置&#xff0c;提高网络质量排除一些连接问题 一、有线网卡 1、关闭IPv6&#xff1b; 可以关闭协议版本6&#xff0c;因为它会引起一些网络连接问题&#xff0c;而且现在几乎用不到IP6。 2、关闭节约电源模式&#xff1b; 右击计算机->设备->设备管理器-&…

视频智能分析/边缘计算AI智能分析网关V4区域入侵检测算法如何配置?

边缘计算AI智能分析网关&#xff08;V4版&#xff09;部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音告警播放。算法配置后&#xff0c;即可对监控视频流进行实时检测&#xf…

陶瓷碗口圆度检测案例-原理概述

检测概述 随着社会的发展和人民生活水平的提高&#xff0c;现在市场不仅对陶瓷产品数量提出新的要求&#xff0c;还在质量上提出了更加严苛的标准。然而&#xff0c;由于日用陶瓷制品韧性较低&#xff0c;生产工艺比较特殊&#xff0c;成批生产时质量不易控制等特点&#xff0…

ESP32_ADC(Arduino)

ADC模数转换 ESP32集成了12位的逐次逼近式ADC&#xff0c;分别为ADC1模块ADC2模块&#xff0c;共支持18个模拟输入通道: ADC1模块&#xff1a;8个通道&#xff0c;32~39ADC2模块&#xff1a;10个通道&#xff0c;0&#xff0c;2&#xff0c;4&#xff0c;12 ~ 15&#xff0c;…

unity小程序websocket:nginx配置https (wss)转http (ws)及其他问题解决

目录 前言 实际运用场景 处理流程如下 nginx配置ssl和wss 配置过程中遇到的问题 1、无法连接服务器 2、通过IP可以访问&#xff0c;域名却不行 问题描述 解决 3、如何判断该域名是否备案了 前言 为了服务器网络的通用性&#xff0c;我们在实现移动端的游戏转微信小程序…

npm run dev,vite 配置 ip 访问

启动项目通过本地 ip 的方式访问 方式一.通过修改 package.json "scripts": {"dev": "vite --host 0.0.0.0",}, 方式二.通过修改 vite.config.ts export default defineConfig({plugins: [vue(), vueJsx()],server: { // 配置 host 与 port 方…

ChatGLM2-6B 大语言模型本地搭建

ChatGLM模型介绍&#xff1a; ChatGLM2-6B 是清华 NLP 团队于不久前发布的中英双语对话模型&#xff0c;它具备了强大的问答和对话功能。拥有最大32K上下文&#xff0c;并且在授权后可免费商用&#xff01; ChatGLM2-6B的6B代表了训练参数量为60亿&#xff0c;同时运用了模型…

2024年【R2移动式压力容器充装】考试资料及R2移动式压力容器充装理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试资料根据新R2移动式压力容器充装考试大纲要求&#xff0c;安全生产模拟考试一点通将R2移动式压力容器充装模拟考试试题进行汇编&#xff0c;组成一套R2移动式压力容器充装全真模拟考试试题&a…