Spring MVC:深入理解与春招面试要点
在前文中,我们深入探讨了 Spring 框架的核心基础 ——IOC 和 AOP,这二者为 Spring 生态的强大功能奠定了基石。而在实际的 Web 应用开发中,Spring MVC 作为 Spring 家族中负责 Web 层开发的框架,同样发挥着举足轻重的作用。对于春招面试而言,掌握 Spring MVC 的相关知识,能够让你在众多求职者中脱颖而出,下面我们就来全面了解 Spring MVC。
一、Spring MVC 架构模式
Spring MVC 基于经典的 MVC(Model - View - Controller)架构模式。MVC 模式将应用程序分为三个主要部分:
- 模型(Model):主要负责业务逻辑的处理和数据的存储。在 Spring MVC 中,模型通常由 JavaBean 和服务层组件组成,用于封装业务数据和处理业务逻辑。例如,在一个电商系统中,商品信息、订单信息等数据以及相关的业务操作(如商品查询、订单创建等)都属于模型部分。
- 视图(View):负责将模型中的数据呈现给用户。常见的视图技术有 JSP、Thymeleaf、FreeMarker 等。视图从模型中获取数据,并将其以特定的格式展示给用户,如 HTML 页面、JSON 数据等。比如在一个 Web 应用中,用户看到的商品列表页面、订单详情页面等都是视图。
- 控制器(Controller):作为模型和视图之间的桥梁,负责接收用户的请求,调用模型中的业务逻辑进行处理,并根据处理结果选择合适的视图返回给用户。在 Spring MVC 中,控制器通常是一个被@Controller注解标记的 Java 类,其中的方法用于处理不同的请求。例如,处理用户登录请求的方法、处理商品添加到购物车请求的方法等都在控制器中。
这种架构模式使得代码的职责分工明确,提高了代码的可维护性和可扩展性。不同的开发人员可以专注于不同的部分,如前端开发人员负责视图部分,后端开发人员负责模型和控制器部分,从而提高开发效率。
二、Spring MVC 工作流程
- 客户端发送请求:用户在浏览器中输入 URL 或通过其他客户端工具发送 HTTP 请求到服务器。例如,用户在浏览器中访问http://localhost:8080/user/list,这个请求会被发送到 Spring MVC 的前端控制器DispatcherServlet。
- DispatcherServlet 接收请求:DispatcherServlet是 Spring MVC 的核心组件,它负责接收所有的 HTTP 请求,并将请求分发给合适的处理器进行处理。DispatcherServlet在 Spring 配置文件中进行配置,它会在 Web 应用启动时被初始化。
- HandlerMapping 查找处理器:DispatcherServlet接收到请求后,会根据请求的 URL 调用HandlerMapping来查找对应的处理器(Handler)。HandlerMapping是一个接口,常见的实现类有RequestMappingHandlerMapping,它会根据定义的请求映射规则,找到能够处理该请求的控制器方法。例如,如果请求的 URL 是/user/list,RequestMappingHandlerMapping会查找所有被@RequestMapping("/user/list")注解标记的控制器方法。
- HandlerAdapter 调用处理器:找到处理器后,DispatcherServlet会通过HandlerAdapter来调用处理器。HandlerAdapter也是一个接口,它负责调用处理器方法,并将请求参数传递给处理器。不同类型的处理器可能需要不同的HandlerAdapter,常见的HandlerAdapter有RequestMappingHandlerAdapter,它用于调用被@RequestMapping注解标记的控制器方法。
- 处理器处理请求:处理器方法接收到请求后,调用模型中的业务逻辑进行处理。例如,在处理/user/list请求的控制器方法中,会调用用户服务层的方法获取用户列表数据。
- 返回 ModelAndView:处理器方法处理完请求后,会返回一个ModelAndView对象,其中包含了模型数据和视图信息。模型数据可以是处理结果,如用户列表数据;视图信息则指定了要返回的视图名称,如userList.jsp。
- ViewResolver 解析视图:DispatcherServlet接收到ModelAndView后,会调用ViewResolver来解析视图。ViewResolver是一个接口,常见的实现类有InternalResourceViewResolver,它会根据视图名称找到对应的实际视图资源。例如,InternalResourceViewResolver会将userList.jsp解析为实际的 JSP 文件路径。
- 视图渲染:找到实际的视图资源后,视图会根据模型数据进行渲染,将数据填充到视图模板中。例如,JSP 视图会将用户列表数据填充到userList.jsp模板中,生成最终的 HTML 页面。
- 返回响应:渲染后的视图将生成的 HTML 页面或其他格式的数据返回给客户端,用户在浏览器中就可以看到最终的结果。
三、Spring MVC 核心组件
- DispatcherServlet:作为 Spring MVC 的前端控制器,负责接收所有的 HTTP 请求,并协调其他组件完成请求的处理和响应。它在 Spring MVC 的配置文件中进行配置,通常在 Web 应用的web.xml文件中注册。
- HandlerMapping:负责根据请求的 URL 查找对应的处理器。常见的HandlerMapping实现类有RequestMappingHandlerMapping,它支持使用@RequestMapping注解来定义请求映射规则。
- HandlerAdapter:负责调用处理器方法,并将请求参数传递给处理器。RequestMappingHandlerAdapter是常用的实现类,用于处理被@RequestMapping注解标记的控制器方法。
- ViewResolver:用于解析视图名称,找到对应的实际视图资源。InternalResourceViewResolver是常见的实现类,它可以将视图名称解析为 JSP 文件路径。
四、面试题
面试题 1:Spring MVC 的工作流程是什么?
答案:
- 客户端发送请求到DispatcherServlet。
- DispatcherServlet接收请求后,调用HandlerMapping查找对应的处理器。
- HandlerMapping根据请求 URL 找到处理器后,DispatcherServlet通过HandlerAdapter调用处理器。
- 处理器处理请求,调用模型中的业务逻辑,并返回ModelAndView。
- DispatcherServlet接收到ModelAndView后,调用ViewResolver解析视图。
- ViewResolver解析视图后,视图根据模型数据进行渲染。
- 渲染后的视图将结果返回给客户端。
面试题 2:@RequestMapping 注解的作用是什么?
答案:@RequestMapping注解用于映射请求 URL 到控制器的方法。它可以标注在类和方法上:
- 标注在类上时,表示该类中的所有方法都以该类上的@RequestMapping注解的路径为基础路径。例如,@RequestMapping("/user")标注在类上,那么该类中的方法的请求路径都以/user开头。
- 标注在方法上时,表示该方法处理特定的请求 URL。例如,@RequestMapping("/list")标注在方法上,结合类上的@RequestMapping("/user"),则该方法处理的请求 URL 为/user/list。通过@RequestMapping注解,可以灵活地定义请求映射规则,实现不同请求的处理。
深入理解 Spring MVC 的架构模式、工作流程和核心组件,是掌握 Spring MVC 的关键。下一篇,我们将探索 Spring Boot 相关知识,继续为你的春招面试备考助力。