DispatcherServlet是Spring MVC的核心,作为前端控制器接收所有HTTP请求,根据HandlerMapping找到对应的Controller处理请求,Controller处理后返回ModelAndView,再由ViewResolver解析视图并渲染响应。
Spring MVC的核心在于它提供了一种清晰的架构来构建Web应用。它将请求处理过程分解为多个职责明确的组件,使得开发、测试和维护都更加容易。
DispatcherServlet(前端控制器) HandlerMapping(处理器映射器) Controller(处理器/控制器) ModelAndView(模型和视图) ViewResolver(视图解析器) View(视图)
DispatcherServlet是Spring MVC的核心,可以把它想象成整个MVC流程的“总指挥”。它接收所有的HTTP请求,然后根据配置的规则,将请求分发给合适的处理器(Controller)进行处理。
具体来说,DispatcherServlet的工作流程大致如下:
这个过程看似复杂,但Spring MVC已经将其高度自动化,开发者只需要关注Controller的编写即可。
Controller是Spring MVC中负责处理用户请求的核心组件。它的主要职责是接收请求参数,调用相应的业务逻辑,并将处理结果封装成ModelAndView对象返回给DispatcherServlet。
编写一个Controller通常需要以下步骤:
@Controller注解标记一个类,将其声明为一个Controller。
@RequestMapping注解将HTTP请求映射到Controller的方法上。这个注解可以指定请求的URL、HTTP方法(GET、POST等)以及其他参数。
例如:
@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的作用是将Controller返回的逻辑视图名称解析成真正的View对象。Spring MVC支持多种ViewResolver,例如InternalResourceViewResolver、FreeMarkerViewResolver、ThymeleafViewResolver等,每种ViewResolver负责解析不同类型的视图。
Spring MVC选择合适的View的过程大致如下:
resolveViewName方法。
如果所有的ViewResolver都无法解析逻辑视图名称,则Spring MVC会抛出一个异常。
例如,如果配置了InternalResourceViewResolver,并且Controller返回的逻辑视图名称是"userProfile",那么InternalResourceViewResolver会将"userProfile"解析成一个JSP页面,例如
/WEB-INF/views/userProfile.jsp。
HandlerMapping负责将HTTP请求映射到合适的Controller上。Spring MVC提供了多种HandlerMapping,例如RequestMappingHandlerMapping、BeanNameUrlHandlerMapping等。RequestMappingHandlerMapping是最常用的HandlerMapping,它根据
@RequestMapping注解的配置将请求映射到Controller的方法上。
Spring MVC将请求映射到Controller的过程大致如下:
getHandler方法。
RequestMappingHandlerMapping会扫描所有带有
@Controller注解的类,并根据
@RequestMapping注解的配置,构建一个请求URL到Controller方法之间的映射关系。当接收到一个HTTP请求时,RequestMappingHandlerMapping会根据请求的URL,查找对应的Controller方法,并将请求交给该方法处理。
ModelAndView对象是Controller返回给DispatcherServlet的对象,它包含了模型数据和视图信息。
ModelAndView对象主要包含以下信息:
DispatcherServlet会根据ModelAndView对象中的视图信息,找到对应的View,并将模型数据传递给View进行渲染。最终,View会生成HTTP响应,返回给客户端。
ModelAndView对象提供了一种灵活的方式,让Controller可以将数据传递给视图,并指定用于渲染数据的视图。
Spring MVC的各个组件之间通过DispatcherServlet进行协调,形成一个完整的工作流程。
通过DispatcherServlet的协调,各个组件协同工作,完成整个请求处理过程。每个组件都专注于自己的职责,使得Spring MVC的架构清晰、可维护性高。