首页 > 其他分享 >[Spring]SpringMVC

[Spring]SpringMVC

时间:2024-08-02 17:39:26浏览次数:10  
标签:请求 SpringMVC Spring 视图 Handler DispatcherServlet View

SpringMVC 工作原理

Spring MVC 的核心组件有哪些?

记住了下面这些组件,也就记住了 SpringMVC 的工作原理。

  • DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping:处理器映射器,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;
  • Handler:请求处理器,处理实际请求的处理器。
  • ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

SpringMVC 工作原理了解吗?

Spring MVC 原理如下图所示:

SpringMVC 工作原理的图解我没有自己画,直接图省事在网上找了一个非常清晰直观的,原出处不明。

image

image

流程说明(重要):

  • 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
  • DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • DispatcherServlet 调用 HandlerAdapter适配器执行 Handler 。
  • Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
  • ViewResolver 会根据逻辑 View 查找实际的 View。
  • DispaterServlet 把返回的 Model 传给 View(视图渲染)。
  • 把 View 返回给请求者(浏览器)

统一异常处理怎么做?

这个技术的需求是,希望像返回正常结果一样返回异常

实现思路是,
首先当在代码中需要抛出异常的时候,不要使用普通的exception,而要是用自己定义的异常类,把result枚举放入自定义的异常类中进行抛出
另外,负责异常处理的类一旦检测到有自定义的异常抛出就会截获这个异常,并且拆包,把枚举类放入result进行返回

@Data
public class MyException extends RuntimeException{
    private ResultCodeEnum resultCodeEnum;
    public MyException(ResultCodeEnum resultCodeEnum) {
        this.resultCodeEnum = resultCodeEnum;
    }
}

@Data
@ControllerAdvice//controller增强器
public class CommonExceptionHandler extends RuntimeException {
    @ResponseBody
    @ExceptionHandler(MyException.class)//当MyException被抛出就自动截获
    public Result error(MyException e) {
        return Result.build(null, e.getResultCodeEnum());
    }
}

自定义注解

标签:请求,SpringMVC,Spring,视图,Handler,DispatcherServlet,View
From: https://www.cnblogs.com/DCFV/p/18339251

相关文章

  • Spring Boot 实现动态修改定时任务的执行时间
    SpringBoot实现动态修改定时任务的执行时间前提大家通过SpringBoot跑定时任务,用的最多的是@Scheduled,通过指定cron来定时的执行任务,cron可以使用SPEL表达式来通过配置文件配置,但是项目一旦启动,执行时间便无法修改,不够方便,本文基于此来优化项目启动之后不能动态修改cron的问题......
  • SpringCloud入门学习笔记(四)
    Sentinel篇 SpringCloud入门学习笔记(一)-CSDN博客SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(三)-CSDN博客前言 在互联网应用过程中,有很多的高并发访问场景,类似于双十一这种活动,特点是访问量剧增,访问量超出系统所能处理的最大并发数。 如果没有保护机......
  • SpringCloud入门学习笔记(三)
    Nacos篇SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(一)-CSDN博客前言  上篇中提到服务消费者要去调用多个服务提供者构成的集群,此时需要一个三方软件来同步更新提供者的地址信息,同时供服务消费者来此处访问地址,为了解决这类问题,就需要引入服务注册组件(功......
  • 微服务集成springsecurity:功能授权与数据授权
    前言:最近怎么学习真没状态~~~~懒狗模式启动,听说好多在校考研的同学最近也学不下去了。哎呀,最近面了一下鲸浩科技的实习,到现在已经一天没回了,虽然我觉得面得还不错不过应该是挂了吧。功能授权:基于注解preAuthorize,实现RBAC模型提供的权限授权数据授权:这个就比较简单了,通俗的讲就......
  • springboot+vue前后端分离项目-项目搭建15-集成JWT token权限验证
    1.对之前的代码改造,之前将user存储到sessionStorage,改成存储到localStorage,全局搜索修改 之前Result.code等于0代表success,改成200代表success,vue文件全局搜索修改一、前端部分1.改造request.js,登录时将user已经存储到localStorage里,这里将user获取到,将user里的token放到......
  • SpringCloud EasyConfig介绍与使用
    maven引入方式<dependency><groupId>icu.liufuqiang</groupId><artifactId>spring-cloud-easy-config-starer</artifactId><version>0.1.0</version></dependency>仓库地址https://gitee.com/LiuFqiang/spring-c......
  • SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化
    Sentinel官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html下载Sentinel:https://github.com/alibaba/Sentinel/releasessentinel控制台文档:https://sentinelguard.io/zh-cn/docs/dashboard.html参考:https://www.cnblogs.com/ralgo/p/14152390.html启动Sentinel命令:j......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • SpringBoot入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专
    场景作为一名Java开发者,SpringBoot已经成为日常开发所必须。势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。作为一名终身学习的信奉者,秉承Java体系需持续学习、持续优......
  • Springboot Docker Redis Mysql集成
    尽管网上关于SpringbootDockerRedisMysql集成的文档很多,但是很多都是老文档,问题不少,所以我专门整理了这份文档。我家里的笔记本是mac,所以我就在mac上详细说明下我的搭建过程。首先我们需要安装docker,mac上本来就有docker的安装包,因此对于mac来说,安装docker就是一件比较轻松的......