当前位置: 首页 > news >正文

Spring面试(六)WebMVC

文章目录

  • Spring WebMVC 底层原理
    • Spring WebMVC 处理请求的流程
      • 核心架构的具体流程步骤
      • 对上述流程的补充
    • SpringMVC实现原理之DispatcherServlet的初始化过程
    • Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
    • MVC是什么?MVC设计模式的好处有哪些
  • Spring WebMVC相关注解
    • 1. 常用注解
      • 1. 请求映射相关注解
      • 2. 请求参数相关的注解
    • 3. @Controller注解的作用
    • 4. @RequestMapping注解的作用
    • 5. @ResponseBody注解的作用

Spring WebMVC 底层原理

Spring WebMVC 处理请求的流程

核心架构的具体流程步骤

在这里插入图片描述
核心架构的具体流程步骤如下

  1. 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  4. HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
  5. ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
  6. View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此很容易支持其他视图技术;
  7. 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。

对上述流程的补充

上述流程只是核心流程,这里我们再补充一些其它组件:

  1. Filter(ServletFilter):进入Servlet前可以有preFilter, Servlet处理之后还可有postFilter
    在这里插入图片描述
  2. LocaleResolver:在视图解析/渲染时,还需要考虑国际化(Local),显然这里需要有LocaleResolver.
    在这里插入图片描述
  3. ThemeResolver:如何控制视图样式呢?SpringMVC中还设计了ThemeSource接口和ThemeResolver,包含一些静态资源的集合(样式及图片等),用来控制应用的视觉风格。
    在这里插入图片描述
  4. 对于文件的上传请求?:对于常规请求上述流程是合理的,但是如果是文件的上传请求,那么就不太一样了;所以这里便出现了MultipartResolver。
    在这里插入图片描述

SpringMVC实现原理之DispatcherServlet的初始化过程

Spring进阶 - SpringMVC实现原理之DispatcherServlet的初始化过程

Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程

Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程

MVC是什么?MVC设计模式的好处有哪些

  • mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结)。模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。

  • mvc设计模式的好处
    a. 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
    b.有利于系统的并行开发,提升开发效率。

Spring WebMVC相关注解

1. 常用注解

1. 请求映射相关注解

  1. @RequestMapping (包含所有类型)
  2. @GetMapping
  3. @PostMapping
  4. @PutMapping
  5. @DeleteMapping
  6. @PatchMapping

注意:由于form表单不支持put和delete方式提交,所以需要一些方法去解决;

2. 请求参数相关的注解

@Pathvariable、@RequestHeader、@RequestParam、@CookieValue、@RequestBody、@RequestAttribute、@MatrixVariable 矩阵变量

  1. @Pathvariable
    获取路径中的参数,用于rest风格
    在这里插入图片描述
    @PathVariable的文档:
If the method parameter is Map<String, String> 
then the map is populated with all path variable 
names and values.(map可以取到所有的参数。)
  1. @RequestHeader
    可以获得所有请求头的信息
    在这里插入图片描述
    可以一次取一个信息:
    在这里插入图片描述

文档:

If the method parameter is Map<String, String>, MultiValueMap<String, String>, or HttpHeaders then the map is populated with all header names and values.

map可以取到所有的参数
在这里插入图片描述

  1. @RequestParam
    获取参数,用于非rest风格 ,可以指定默认值
    在这里插入图片描述
    也可以使用map取到所有参数。

  2. @CookieValue
    获取cookie

  3. @RequestBody
    获取请求体 (只有post才有请求体)

  4. @RequestAttribute
    获取request域属性。 可用于转发的时候,携带参数

在这里插入图片描述

  1. @MatrixVariable 矩阵变量
    注意:矩阵变量应该绑定在路径变量中!Springboot默认禁用了矩阵变量功能!!!
    在这里插入图片描述
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        //开启矩阵变量功能
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

在这里插入图片描述
url路径:

http://localhost:8080/cars/sell;low=34;brand=byd;brand=haha

结果:

{"path":"sell","low":34,"brand":["byd","haha"]}

测试二

@GetMapping("/boss/{bossId}/{empId}")
    @ResponseBody
    public Map boss(@MatrixVariable(value = "age", pathVar = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age", pathVar = "empId") Integer empAge) {
        Map<String, Object> map = new HashMap<>();
        map.put("bossAge", bossAge);
        map.put("empAge", empAge);
        return map;
    }

url路径:

http://localhost:8080/boss/1;age=20/2;age=10

结果:

{"bossAge":20,"empAge":10}

3. @Controller注解的作用

  • 在Spring MVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在Spring MVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
  • @Controller 用于标记在一个类上,使用它标记的类就是一个Spring MVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是Spring MVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。

4. @RequestMapping注解的作用

  • RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性
value指定请求的实际地址,指定的地址可以是URI Template 模式
method指定请求的method类型, GET、POST、PUT、DELETE等;
consumes指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;
produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params指定request中必须包含某些参数值是,才让该方法处理。
headers指定request中必须包含某些指定的header值,才能让该方法处理请求。

5. @ResponseBody注解的作用

  • 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

  • 使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

相关文章:

  • 如何使用域名访问到特定IP地址的服务器
  • Java面试题 JVM 篇 Redis篇 Spring篇
  • 服务器部署 CentOS、VeraCrypt、Docker、主从MySQL、Redis、备份等
  • 【Python深度学习】Python全栈体系(三十三)
  • 电脑重装系统后Win11扬声器无插座信息如何解决?
  • 在Ubuntu 16.04中安装RStudio Server
  • 微服务统一认证方案
  • PMP知识的应用思考
  • 详谈js之面向对象
  • 深度学习笔记其三:多层感知机和PYTORCH
  • iOS小技能:截获分析网络数据包( tcpdump 、Wireshark的原理和基本使用 、使用Charles联调测试)
  • 阿里 Java 程序员进阶笔记!计算机基础 +OS+ 算法数据结构
  • Revit MEP中连接件的巧妙定位?及管线快速连接?
  • SP94-PEG-DSPE,DSPE-PEG-SP94,磷脂-聚乙二醇-靶向肽SP94
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [deviceone开发]-do_Webview的基本示例
  • 【知识碎片】第三方登录弹窗效果
  • Mocha测试初探
  • pdf文件如何在线转换为jpg图片
  • SAP云平台里Global Account和Sub Account的关系
  • spring security oauth2 password授权模式
  • STAR法则
  • Vue 重置组件到初始状态
  • Vue.js源码(2):初探List Rendering
  • webgl (原生)基础入门指南【一】
  • 二维平面内的碰撞检测【一】
  • 技术发展面试
  • 坑!为什么View.startAnimation不起作用?
  • 三分钟教你同步 Visual Studio Code 设置
  • 详解NodeJs流之一
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 怎样选择前端框架
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #define,static,const,三种常量的区别
  • #图像处理
  • $.ajax()方法详解
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • .apk 成为历史!
  • .NET 反射的使用
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET企业级应用架构设计系列之应用服务器
  • /run/containerd/containerd.sock connect: connection refused
  • [\u4e00-\u9fa5] //匹配中文字符
  • [Asp.net mvc]国际化
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [C#] 如何调用Python脚本程序
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试