DispatcherServlet是spring mvc的核心,作为前端控制器接收所有http请求,根据HandlerMapping找到对应的Controller处理请求,Controller处理后返回ModelAndView,再由ViewResolver解析视图并渲染响应。
spring mvc的核心在于它提供了一种清晰的架构来构建Web应用。它将请求处理过程分解为多个职责明确的组件,使得开发、测试和维护都更加容易。
DispatcherServlet(前端控制器) HandlerMapping(处理器映射器) Controller(处理器/控制器) ModelAndView(模型和视图) ViewResolver(视图解析器) View(视图)
DispatcherServlet 的作用是什么?它是如何工作的?
DispatcherServlet是Spring MVC的核心,可以把它想象成整个MVC流程的“总指挥”。它接收所有的HTTP请求,然后根据配置的规则,将请求分发给合适的处理器(Controller)进行处理。
具体来说,DispatcherServlet的工作流程大致如下:
- 接收到HTTP请求。
- 根据Handlermapping的配置,找到处理该请求的Controller。
- 将请求交给找到的Controller处理。
- Controller处理完请求后,返回一个ModelAndView对象,其中包含了模型数据和视图名称。
- DispatcherServlet根据ViewResolver的配置,找到对应的View。
- View负责渲染模型数据,生成最终的HTTP响应。
- 将响应返回给客户端。
这个过程看似复杂,但Spring MVC已经将其高度自动化,开发者只需要关注Controller的编写即可。
Controller 在 Spring MVC 中扮演什么角色?如何编写一个 Controller?
Controller是Spring MVC中负责处理用户请求的核心组件。它的主要职责是接收请求参数,调用相应的业务逻辑,并将处理结果封装成ModelAndView对象返回给DispatcherServlet。
编写一个Controller通常需要以下步骤:
- 使用
@Controller
注解标记一个类,将其声明为一个Controller。
- 使用
@RequestMapping
注解将HTTP请求映射到Controller的方法上。这个注解可以指定请求的URL、HTTP方法(GET、POST等)以及其他参数。
- 在Controller方法中,处理请求参数,调用业务逻辑,并将结果封装到ModelAndView对象中。
- 返回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的过程大致如下:
- DispatcherServlet接收到Controller返回的ModelAndView对象。
- DispatcherServlet从ModelAndView对象中获取逻辑视图名称。
- DispatcherServlet遍历配置的ViewResolver列表,依次调用它们的
resolveViewName
方法。
- 每个ViewResolver尝试根据逻辑视图名称解析出一个View对象。如果解析成功,则返回该View对象;否则,返回NULL。
- 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的过程大致如下:
- DispatcherServlet接收到HTTP请求。
- DispatcherServlet遍历配置的HandlerMapping列表,依次调用它们的
getHandler
方法。
- 每个HandlerMapping尝试根据请求的URL和其他参数,找到处理该请求的Controller。如果找到,则返回一个HandlerExecutionChain对象,其中包含了Controller和一些拦截器;否则,返回null。
- 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进行协调,形成一个完整的工作流程。
- 请求到达: 客户端发送HTTP请求到DispatcherServlet。
- HandlerMapping 查找处理器: DispatcherServlet委托HandlerMapping查找能够处理该请求的Controller。
- Controller 处理请求: HandlerMapping找到Controller后,DispatcherServlet将请求交给Controller处理。
- Controller 返回 ModelAndView: Controller处理完请求后,将模型数据和视图信息封装到ModelAndView对象中返回给DispatcherServlet。
- ViewResolver 解析视图: DispatcherServlet委托ViewResolver根据ModelAndView对象中的视图信息,找到对应的View。
- View 渲染视图: DispatcherServlet将模型数据传递给View,View负责渲染模型数据,生成最终的HTTP响应。
- 响应返回: DispatcherServlet将HTTP响应返回给客户端。
通过DispatcherServlet的协调,各个组件协同工作,完成整个请求处理过程。每个组件都专注于自己的职责,使得Spring MVC的架构清晰、可维护性高。
评论(已关闭)
评论已关闭