精选SpringMVC面试题

Spring MVC 框架有什么用?

Spring Web MVC框架提供“模型-视图-控制器(Model-View-Controller)”架构和随时可用的组件,用于开发灵活切松耦合的Web应用程序。

MVC模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和UI逻辑,同时在这些元素之间提供松散耦合。

介绍下Spring MVC的核心组件

  • MultipartResolver
  • LocaleResolver
  • ThemeResolver
  • HandlerMapping
  • HandlerAdapter
  • HandlerExceptionResolver
  • RequestToViewNameTranslator
  • ViewResolver
  • FlashMapManager

虽然很多,但是在前后端分离的架构中,最关键的只有HandlerMapping+HandlerAdapter+HandlerExceptionResolver。

描述下DispatcherServlet的工作流程

DispatcharServlet的工作流程可以用一张图来概括:

DispatcharServlet工作流程

  1. 发送请求

用户向服务器发送HTTP请求,请求被Spring MVC的调度控制器DispatcharServlet捕获。

  1. 映射处理器

DispatcharServlet根据请求的URL,调用HandlerMapping获得该Handler配置的所有相关信息(包括Handler对象和
对应的拦截器,也就是对应的接口处理方法),并返回给DispatcharServlet一个对应的处理器。

  1. 处理器适配

DispatcherServlet根据获得的Handler(平时叫做Controller控制器),选择一个合适的HandlerAdapter。提取请求Request中的模型数据,填充Handler入参,
开始执行Handler,在填充Handler的入参过程中会根据你的配置额外处理一些工作:

  • HttpMessageConverter:会将请求消息(如JSON、XML等数据)转换成一个对象。(SpringBoot常用@RequestBody入参JSON)
  • 数据转换:对请求消息进行数据转换(如String转为Intager、Double等数据格式)
  • 数据格式化:对请求消息进行数据格式化(如String转为Date)
  • 数据校验:验证数据有效性,校验结果存储到BindingResult的Error中。(开发中常用@NotBlank、@NotNull、@Length、@Pattern、@NotEmpty
    等注解)

Handler执行完成后,向DispatchServlet返回一个ModelAndView对象。

  1. 视图解析

根据返回的ModelAndView,选择一个合适的ViewResolver,解析出View,返回给DispatchServlet。

  1. 渲染视图

ViewResolver 结合 Model 和 View,来渲染视图,并写回给用户( 浏览器 )。

但是在前后端分离的架构中,SpringMVC只负责Model和Contoller,而将View移交给了前端,所以以上步骤4、5已经不需要了。
在步骤3 执行完成后会判断方法是否有@ResponseBody 注解,有的话直接将结果返回给用户(浏览器),交给前端去渲染视图,没有的话就执行步骤4。

@Controller注解有什么用?

@Controller注解,它将一个类标记为Spring Web MVC控制器Controller。

@RestController和@Controller注解的区别

@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API。

@RequestMapping 注解有什么用?

@RequestMapping 注解,用于将特定的HTTP请求方法映射到处理相应请求的控制器的特定处理类/方法。

  • 类级别:映射请求的URL
  • 方法级别:映射URL以及HTTP请求方法。

@RequestMapping 和 @GetMapping 注解的不同之处在哪里?

@GetMapping 注解在@RequestMapping注解的基础上添加了method = {RequestMethod.GET},表示由@GetMapping注解修饰的方法只能处理GET请求。
而@RequestMapping如果不指定method属性的话表示可以接受任何请求方式。

返回 JSON 格式使用什么注解?

可以使用 @ResponseBody 注解,或者使用包含 @ResponseBody 注解的 @RestController 注解。

当然,还是需要配合相应的支持 JSON 格式化的 HttpMessageConverter 实现类。例如,Spring MVC 默认使用 MappingJackson2HttpMessageConverter 。

Spring MVC 的异常处理?

SpringMVC提供了异常解析器HandlerExceptionResolver接口,将处理器执行时发生的异常,解析成对应的ModelAndView结果。

Spring MVC 有什么优点?

  • 使用方便,无论是添加HTTP请求方法映射的方法,还是不同数据格式的响应。
  • 提供拦截器机构,可以方便的对请求进行拦截处理。
  • 提供异常机制,可以方便的对异常进行统一处理。
  • 可以使用任意一种视图技术,而不仅仅局限于 JSP ,例如 Freemarker、Thymeleaf 等等。
  • 不依赖于 Servlet API (目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的,当然仅仅依赖 Servlet ,而不依赖 Filter、Listener )。

Spring MVC 的 Controller 是不是单例?

绝大部分情况下Controller都是单例的。Controller里一般不建议存在共享的变量。

Spring MVC 和 Struts2 的异同?

  1. 入口不同
    • SpringMVC是一个Servlet控制器。
    • Struts2是一个Filter拦截器
  2. 配置映射不同
    • SpringMVC是基于方法开发的,传递参数是通过方法形参,一般设置为单例。
    • Struts2是基于类开发的,传递参数是通过类的属性,只能设计为多例。
  3. 视图不同
    • SpringMVC通过参数解析器里将Request对象内容进行解析或形参,将响应数据的页面封装成ModelAndView对象,
      最后又将模型数据通过Request对象传输到页面。其中如果视图使用JSP时,默认使用JSTL
    • Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据

Spring MVC 的拦截器和 Filter 过滤器有什么差别?

  • 功能不同:拦截器和Filter都能实现相应的功能,谁也不比谁强。
  • 容器不同:拦截器构建在SpringMVC体系中,Filter构建在Servlet容器之上。
  • 使用便利性不同:拦截器提供了三个方法(#preHandle()方法,调用Controller方法之前执行,#postHandle()方法,调用Controller之后执行,#afterCompletion()方法,处理完Controller方法返回结果之后执行),
    分别在不同时机执行,过滤器仅仅提供一个方法,当然也可以实现拦截器的执行时机的效果。

REST 代表着什么?

REST代表着抽象状态转移,它是根据HTTP协议从客户端发送数据到服务端。

资源是什么?

资源是指数据在 REST 架构中如何显示的。将实体作为资源公开 ,它允许客户端通过 HTTP 方法如:GET, POST,PUT, DELETE 等读,写,修改和创建资源。

什么是安全的 REST 操作?

REST接口是通过HTTP方法完成操作。

  • 一些HTTP操作是安全的,如GET和HEAD,它不能在服务器端修改资源。
  • PUT、POST、DELETE是不安全的,因为它们能在服务器修改资源。

所以,是否安全的界限,在于是否修改服务器端的资源。

什么是幂等操作? 为什么幂等操作如此重要?

有一些HTTP方法,如:GET,不管你使用多少次它都能产生相同的结果,在没有任何一边影响的情况下,发送多个 GET 请求到相同的URI 将会产生相同的响应结果。因此,这就是所谓幂等操作。

POST方法不是幂等的,如果发送多个POST请求,它将在服务器创建不同的资源,但是,如果你用PUT更新资源,它将是幂等操作。

甚至多个PUT请求被用来更新资源,得到的都是相同的结果。

REST 用哪种 HTTP 方法呢?

REST 能用任何的 HTTP 方法,但是,最受欢迎的是:

  • 用 GET 来检索服务端资源
  • 用 POST 来创建服务端资源
  • 用 PUT 来更新服务端资源
  • 用 DELETE 来删除服务端资源。

恰好,这四个操作,对上我们日常逻辑的 CRUD 操作。

@PathVariable 注解,在 Spring MVC 做了什么? 为什么 REST 在 Spring 中如此有用?

@PathVariable注解,是SpringMVC中常用的注解之一,它允许从URL中读取值,比如查询参数,在REST中,资源标识符是URL的一部分。

个人博客:https://wei.itart.icu/