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.rhkb.cn/news/238738.html

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

相关文章

实践学习PaddleScience飞桨科学工具包

实践学习PaddleScience飞桨科学工具包 动手实践&#xff0c;在实践中学习&#xff01;本项目可以在AIStudio平台一键运行&#xff01;地址&#xff1a;https://aistudio.baidu.com/projectdetail/4278591 本项目第一次执行会报错&#xff0c;再执行一次即可。若碰到莫名其妙的…

C++ | 四、指针、链表

指针 指针用来储存地址定义方式&#xff0c;int *ptr;&#xff0c;使用*来表示所定义的变量是指针取地址符&#xff0c;ptr &a;&#xff0c;通过&来取得一个普通变量的地址&#xff0c;并储存到指针中取值&#xff08;解引用&#xff09;&#xff0c;想要取得一个指针…

15.鸿蒙HarmonyOS App(JAVA)进度条与圆形进度条

15.鸿蒙HarmonyOS App(JAVA)进度条与圆形进度条 progressBar2.setIndeterminate(true);//设置无限模式,运行查看动态效果 //创建并设置无限模式元素 ShapeElement element new ShapeElement(); element.setBounds(0,0,50,50); element.setRgbColor(new RgbColor(255,0,0)); …

排序——计数排序

文章目录 概念思路绝对映射&#xff1a;相对映射 代码实现特性结果演示 概念 计数排序是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时&#xff0c;它的复杂度为Ο(nk)&#xff08;其中k是整数的范围…

typora导出html添加目录

typora导出html添加目录 使用方法 首先要从typora导出html文件&#xff0c;之后用记事本编辑器html文件 找到文档最后面&#xff0c;如图&#xff1a; 用文字编辑类工具打开sideBar.txt&#xff0c;复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…

【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)

HashMap工作原理全揭秘 — 核心源码解析 知识盲点概念介绍数据结构数组链表数组VS链表哈希表不同JVM版本HashMap的展现形式 HashMap VS HashTable特性区别对比 hashcodehashCode的作用equals方法和hashcode的关系key为null怎么办执行步骤 核心参数容量探讨负载因子探讨加载因子…

usb个人总结

一、usb工具分析 1、不同的usb抓包工具抓包分析 2、USB抓包分析方式 外接usb分析仪分析 &#xff08;1&#xff09;力科usb分析仪 &#xff08;2&#xff09;HD-USB12 协议分析仪 &#xff08;3&#xff09;沁恒CH552 usb分析仪&#xff0c;软件工具USB2.0 Monitor (4)等等…

PHP留言板实现

完整教程PHP留言板 登陆界面 一个初学者的留言板&#xff08;登录和注册&#xff09;_php留言板登录注册-CSDN博客 留言板功能介绍 百度网盘 请输入提取码 进入百度网盘后&#xff0c;输入提取码&#xff1a;knxt&#xff0c;即可下载项目素材和游客访问页面的模板文件。 &…

基于springboot书籍学习平台源码和论文

首先,论文一开始便是清楚的论述了平台的研究内容。其次,剖析平台需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确平台的需求。然后在明白了平台的需求基础上需要进一步地设计平台,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

数学建模-Matlab R2022a安装步骤

软件介绍 MATLAB是一款商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境&#xff0c;主要包括MATLAB和Simulink两大部分&#xff0c;可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程…

行云部署成长之路 -- 慢 SQL 优化之旅 | 京东云技术团队

当项目的SQL查询慢得像蜗牛爬行时&#xff0c;用户的耐心也在一点点被消耗&#xff0c;作为研发&#xff0c;我们可不想看到这样的事。这篇文章将结合行云部署项目的实践经验&#xff0c;带你走进SQL优化的奇妙世界&#xff0c;一起探索如何让那些龟速的查询飞起来&#xff01;…

【C++干货铺】会旋转的二叉树——AVLTree

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言 AVL树 AVL树的概念 AVL树结点的定义 AVL树的插入 寻找插入结点的位置 修改平衡因子 AVL树的旋转 右单旋 左单旋 先右旋再左旋 先左旋再右旋 AVL树…

SpringBoot多环境配置Maven Profile组

Maven profile组 注意切换配置时 mvn clean下 或者 clean 加install 或者compile 编译 clean之后 install下 或者compile 编译 nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar demo.jar --spring.profiles.activeprod > system.log 2>&1 &

数据交付变革:研发到产运自助化的转型之路

作者 | Chris 导读 本文讲述为了提升产运侧数据观察、分析、决策的效率&#xff0c;支持业务的快速迭代&#xff0c;移动生态数据研发部对数仓建模与BI工具完成升级&#xff0c;采用宽表建模与TDA平台相结合的方案&#xff0c;一站式自助解决数据应用需求。在此过程中&#xff…

软件测试|如何使用selenium操作窗口滚动条

简介 我们在进行自动化测试工作的时候&#xff0c;如果页面内容过多&#xff0c;一次性加载耗时太长的话&#xff0c;会使用分段加载来加载页面内容&#xff0c;比如开始只加载页面顶端的内容&#xff0c;而如果要加载更多的数据&#xff0c;就需要我们向下滑动&#xff0c;让…

跳跃游戏,经典算法实战。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Go 优雅判断 interface 是否为 nil

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 背景 很久之前发过一篇文章&#xff1a;《10个令人惊叹的Go语言技巧&#xff0c;让你的代码更加优雅》&#xff0c;这篇文章中第…

Dockerfile: CMD与ENTRYPOINT区别

CMD和ENTRYPOINT的作用 CMD和ENTRYPOINT这两个命令&#xff0c;我接触到的是用在了Dockerfile中用于构建容器。 CMD&#xff1a;The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容…

如何用ArcGIS制作城市用地适应性评价

01概述 “城市用地适宜性评价是城市总体规划的一项重要前期工作&#xff0c;它首先对工程地质、社会经济和生态环境等要素进行单项用地适宜性评价&#xff0c;然后用地图叠加技术根据每个因子所占权重生成综合的用地适宜性评价结果&#xff0c;俗称“千层饼模式”。 做用地适…

外包干了4年,废了···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0…