boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

spring mvc 有哪些组件?


avatar
作者 2025年9月4日 9

DispatcherServlet是spring mvc的核心,作为前端控制器接收所有http请求,根据HandlerMapping找到对应的Controller处理请求,Controller处理后返回ModelAndView,再由ViewResolver解析视图并渲染响应。

spring mvc 有哪些组件?

spring mvc的核心在于它提供了一种清晰的架构来构建Web应用。它将请求处理过程分解为多个职责明确的组件,使得开发、测试和维护都更加容易。

DispatcherServlet(前端控制器) HandlerMapping(处理器映射器) Controller(处理器/控制器) ModelAndView(模型和视图) ViewResolver(视图解析器) View(视图)

DispatcherServlet 的作用是什么?它是如何工作的?

DispatcherServlet是Spring MVC的核心,可以把它想象成整个MVC流程的“总指挥”。它接收所有的HTTP请求,然后根据配置的规则,将请求分发给合适的处理器(Controller)进行处理。

具体来说,DispatcherServlet的工作流程大致如下:

  1. 接收到HTTP请求。
  2. 根据Handlermapping的配置,找到处理该请求的Controller。
  3. 将请求交给找到的Controller处理。
  4. Controller处理完请求后,返回一个ModelAndView对象,其中包含了模型数据和视图名称。
  5. DispatcherServlet根据ViewResolver的配置,找到对应的View。
  6. View负责渲染模型数据,生成最终的HTTP响应。
  7. 将响应返回给客户端。

这个过程看似复杂,但Spring MVC已经将其高度自动化,开发者只需要关注Controller的编写即可。

Controller 在 Spring MVC 中扮演什么角色?如何编写一个 Controller?

Controller是Spring MVC中负责处理用户请求的核心组件。它的主要职责是接收请求参数,调用相应的业务逻辑,并将处理结果封装成ModelAndView对象返回给DispatcherServlet。

编写一个Controller通常需要以下步骤:

  1. 使用
    @Controller

    注解标记一个类,将其声明为一个Controller。

  2. 使用
    @RequestMapping

    注解将HTTP请求映射到Controller的方法上。这个注解可以指定请求的URL、HTTP方法(GET、POST等)以及其他参数。

  3. 在Controller方法中,处理请求参数,调用业务逻辑,并将结果封装到ModelAndView对象中。
  4. 返回ModelAndView对象。

例如:

@Controller @RequestMapping("/user") public class UserController {      @Autowired     private UserService userService;      @RequestMapping("/profile")     public ModelAndView getUserProfile(@RequestParam("userId") Long userId) {         User user = userService.getUserById(userId);         ModelAndView modelAndView = new ModelAndView("userProfile");         modelAndView.addObject("user", user);         return modelAndView;     } }

这个例子中,

@Controller

注解将

UserController

声明为一个Controller。

@RequestMapping("/user")

注解将所有以

/user

开头的请求映射到这个Controller。

@RequestMapping("/profile")

注解将

/user/profile

请求映射到

getUserProfile

方法。

@RequestParam("userId")

注解从请求参数中获取

userId

ModelAndView

对象用于封装模型数据(

user

)和视图名称(

userProfile

)。

ViewResolver 的作用是什么?Spring MVC 如何选择合适的 View?

ViewResolver的作用是将Controller返回的逻辑视图名称解析成真正的View对象。Spring MVC支持多种ViewResolver,例如InternalResourceViewResolver、FreeMarkerViewResolver、ThymeleafViewResolver等,每种ViewResolver负责解析不同类型的视图。

Spring MVC选择合适的View的过程大致如下:

  1. DispatcherServlet接收到Controller返回的ModelAndView对象。
  2. DispatcherServlet从ModelAndView对象中获取逻辑视图名称。
  3. DispatcherServlet遍历配置的ViewResolver列表,依次调用它们的
    resolveViewName

    方法。

  4. 每个ViewResolver尝试根据逻辑视图名称解析出一个View对象。如果解析成功,则返回该View对象;否则,返回NULL
  5. DispatcherServlet使用第一个成功解析出View对象的ViewResolver返回的View对象。

如果所有的ViewResolver都无法解析逻辑视图名称,则Spring MVC会抛出一个异常。

例如,如果配置了InternalResourceViewResolver,并且Controller返回的逻辑视图名称是”userProfile”,那么InternalResourceViewResolver会将”userProfile”解析成一个JSP页面,例如

/WEB-INF/views/userProfile.jsp

HandlerMapping 的作用是什么?Spring MVC 如何将请求映射到 Controller?

HandlerMapping负责将HTTP请求映射到合适的Controller上。Spring MVC提供了多种HandlerMapping,例如RequestMappingHandlerMapping、BeanNameUrlHandlerMapping等。RequestMappingHandlerMapping是最常用的HandlerMapping,它根据

@RequestMapping

注解的配置将请求映射到Controller的方法上。

Spring MVC将请求映射到Controller的过程大致如下:

  1. DispatcherServlet接收到HTTP请求。
  2. DispatcherServlet遍历配置的HandlerMapping列表,依次调用它们的
    getHandler

    方法。

  3. 每个HandlerMapping尝试根据请求的URL和其他参数,找到处理该请求的Controller。如果找到,则返回一个HandlerExecutionChain对象,其中包含了Controller和一些拦截器;否则,返回null。
  4. DispatcherServlet使用第一个成功找到Controller的HandlerMapping返回的HandlerExecutionChain对象。

RequestMappingHandlerMapping会扫描所有带有

@Controller

注解的类,并根据

@RequestMapping

注解的配置,构建一个请求URL到Controller方法之间的映射关系。当接收到一个HTTP请求时,RequestMappingHandlerMapping会根据请求的URL,查找对应的Controller方法,并将请求交给该方法处理。

ModelAndView 对象的作用是什么?它包含哪些信息?

ModelAndView对象是Controller返回给DispatcherServlet的对象,它包含了模型数据和视图信息。

ModelAndView对象主要包含以下信息:

  • 模型数据(Model): 模型数据是Controller需要传递给视图的数据。它可以是一个Map对象,也可以是任何Java对象。
  • 视图信息(View): 视图信息指定了用于渲染模型数据的视图。它可以是一个逻辑视图名称,也可以是一个View对象。

DispatcherServlet会根据ModelAndView对象中的视图信息,找到对应的View,并将模型数据传递给View进行渲染。最终,View会生成HTTP响应,返回给客户端。

ModelAndView对象提供了一种灵活的方式,让Controller可以将数据传递给视图,并指定用于渲染数据的视图。

Spring MVC 的组件之间是如何协作的?

Spring MVC的各个组件之间通过DispatcherServlet进行协调,形成一个完整的工作流程。

  1. 请求到达: 客户端发送HTTP请求到DispatcherServlet。
  2. HandlerMapping 查找处理器: DispatcherServlet委托HandlerMapping查找能够处理该请求的Controller。
  3. Controller 处理请求: HandlerMapping找到Controller后,DispatcherServlet将请求交给Controller处理。
  4. Controller 返回 ModelAndView: Controller处理完请求后,将模型数据和视图信息封装到ModelAndView对象中返回给DispatcherServlet。
  5. ViewResolver 解析视图: DispatcherServlet委托ViewResolver根据ModelAndView对象中的视图信息,找到对应的View。
  6. View 渲染视图: DispatcherServlet将模型数据传递给View,View负责渲染模型数据,生成最终的HTTP响应。
  7. 响应返回: DispatcherServlet将HTTP响应返回给客户端。

通过DispatcherServlet的协调,各个组件协同工作,完成整个请求处理过程。每个组件都专注于自己的职责,使得Spring MVC的架构清晰、可维护性高。



评论(已关闭)

评论已关闭