什么是 Spring MVC
Spring MVC 是 Spring 框架的一个模块,它是基于 Java 实现的一个遵循 MVC(Model-View-Controller,即模型 - 视图 - 控制器)设计模式的 Web 开发框架。它的主要目的是帮助开发者更高效地构建 Web 应用程序,提供了一种清晰的架构来分离业务逻辑、数据和用户界面,使得代码更易于维护、测试和扩展。
Spring MVC 具有以下特点:
- 灵活性:可以与 Spring 框架的其他模块(如 Spring IoC、Spring AOP 等)无缝集成,也能与其他第三方库和框架配合使用。
- 强大的注解支持:通过注解可以方便地进行控制器、请求映射、参数绑定等操作,减少了大量的配置代码。
- 支持多种视图技术:可以使用 JSP、Thymeleaf、Freemarker 等多种视图技术来渲染页面。
- 国际化和本地化支持:方便实现多语言的 Web 应用。
Spring MVC 的工作流程
Spring MVC 的工作流程可以概括为以下几个主要步骤:
1. 用户发送请求
用户在浏览器中输入 URL 或者点击链接,向服务器发送 HTTP 请求。
2. 请求到达前端控制器(DispatcherServlet)
前端控制器 DispatcherServlet
是 Spring MVC 的核心,它负责接收所有的 HTTP 请求,是整个请求处理的入口点。在 web.xml
或者 Java 配置类中需要对 DispatcherServlet
进行配置,使其能够处理特定的请求。
以下是一个简单的 web.xml
配置示例:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3. 处理器映射器(HandlerMapping)查找处理器
DispatcherServlet
接收到请求后,会调用处理器映射器 HandlerMapping
来查找能够处理该请求的处理器(通常是一个控制器方法)。处理器映射器会根据请求的 URL 等信息,在配置的映射关系中进行匹配,找到对应的处理器。
Spring MVC 提供了多种类型的处理器映射器,如 BeanNameUrlHandlerMapping
、RequestMappingHandlerMapping
等,其中 RequestMappingHandlerMapping
是最常用的,它支持使用注解来定义请求映射。
4. 返回处理器执行链(HandlerExecutionChain)
处理器映射器找到处理器后,会返回一个 HandlerExecutionChain
对象,该对象包含了处理器(通常是一个控制器方法)和相关的拦截器。
5. 处理器适配器(HandlerAdapter)调用处理器
DispatcherServlet
会使用处理器适配器 HandlerAdapter
来调用处理器。处理器适配器的作用是将 DispatcherServlet
与具体的处理器进行适配,因为不同类型的处理器可能有不同的调用方式。
Spring MVC 提供了多种处理器适配器,如 SimpleControllerHandlerAdapter
、RequestMappingHandlerAdapter
等,其中 RequestMappingHandlerAdapter
用于处理使用注解定义的控制器方法。
6. 处理器(Controller)处理请求
处理器(通常是一个控制器类中的方法)接收到请求后,会执行相应的业务逻辑,可能会访问数据库、调用其他服务等,最后返回一个 ModelAndView
对象,该对象包含了模型数据和视图名称。
以下是一个简单的控制器示例:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
7. 返回 ModelAndView
处理器处理完请求后,将 ModelAndView
对象返回给 DispatcherServlet
。
8. 视图解析器(ViewResolver)解析视图
DispatcherServlet
接收到 ModelAndView
对象后,会调用视图解析器 ViewResolver
来解析视图名称,将视图名称转换为具体的视图对象。
Spring MVC 提供了多种视图解析器,如 InternalResourceViewResolver
、ThymeleafViewResolver
等,不同的视图解析器适用于不同的视图技术。
9. 视图渲染
视图解析器解析出视图对象后,DispatcherServlet
会将模型数据传递给视图对象,视图对象根据模型数据进行渲染,生成最终的 HTML 页面。
10. 返回响应给用户
视图渲染完成后,DispatcherServlet
将生成的 HTML 页面作为 HTTP 响应返回给用户的浏览器,用户在浏览器中看到最终的页面。
综上所述,Spring MVC 通过前端控制器、处理器映射器、处理器适配器、视图解析器等组件的协同工作,实现了请求的处理和响应的返回,使得 Web 应用的开发更加高效和灵活。