• SpringMVC面试


    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
    • 2
    • 3
    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.
    
    • 1

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    结果:

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

    测试二

    @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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    url路径:

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

    结果:

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

    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等)使用;

  • 相关阅读:
    尼莫地平纳米脂质体包载小干扰RNA(siRNA)|低分子肝素纳米脂质体包载信使RNA(mRNA)|齐岳生物
    elmentui el-select下拉输入不清空已选值
    适配移动端,菜单采用底部固定形式(1+X Web前端开发初级 例题)
    ThreadLocal为什么会出现内存泄漏,你真的知道吗?
    Building Systems with the ChatGPT API
    极客日报:《英雄联盟》回应服务器崩了:官方直接回退了旧版本;Deno 1.19 发布|极客头条
    不用Swagger,那我用啥?
    时钟树综合(一)
    java正则校验金额
    【 OpenGauss源码学习 —— 列存储(CU)(三)】
  • 原文地址:https://blog.csdn.net/weixin_45773632/article/details/117085765