Spring MVC(Model-View-Controller)是 Spring 框架中用于构建 Web 应用程序的模块。它提供了一种清晰的分层结构,帮助开发者将业务逻辑、表示层和控制层分开。Spring MVC 的运行流程如下:
-
客户端请求(Client Request):
- 用户通过浏览器向服务器发送 HTTP 请求。
-
前端控制器(DispatcherServlet):
- 请求首先到达前端控制器
DispatcherServlet
。它是 Spring MVC 的核心组件,负责将请求分发到合适的处理器。 DispatcherServlet
在 web.xml 文件中配置。
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
- 请求首先到达前端控制器
-
处理器映射(Handler Mapping):
DispatcherServlet
使用处理器映射器(Handler Mapping)来确定哪个处理器(Controller)将处理该请求。- 处理器映射器从配置中查找请求 URL 对应的控制器。
-
处理器(Handler):
- 一旦找到合适的处理器,
DispatcherServlet
将请求发送给该处理器。处理器通常是一个控制器(Controller)。 - 控制器中的处理方法使用
@RequestMapping
注解来映射请求 URL。
@Controller public class MyController { @RequestMapping("/hello") public String handleRequest(Model model) { model.addAttribute("message", "Hello, World!"); return "helloView"; } }
- 一旦找到合适的处理器,
-
处理器适配器(Handler Adapter):
- 处理器适配器负责执行处理器方法。Spring MVC 提供了多种处理器适配器,例如
SimpleControllerHandlerAdapter
、RequestMappingHandlerAdapter
。 - 处理器适配器调用控制器方法并处理返回值。
- 处理器适配器负责执行处理器方法。Spring MVC 提供了多种处理器适配器,例如
-
模型和视图(ModelAndView):
- 控制器方法执行后返回一个
ModelAndView
对象,其中包含模型数据和视图名。 - 模型数据用于在视图中显示,视图名用于确定使用哪个视图解析器。
- 控制器方法执行后返回一个
-
视图解析器(View Resolver):
DispatcherServlet
使用视图解析器将逻辑视图名解析为实际的视图对象(如 JSP 文件)。- 视图解析器在 Spring 配置文件中配置。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
-
视图渲染(View Rendering):
- 视图对象负责将模型数据渲染到客户端,生成最终的 HTML 响应。
- 视图对象通常是 JSP、Thymeleaf、FreeMarker 等模板引擎的实现。
-
响应发送(Response Sending):
- 最终的 HTML 响应通过
DispatcherServlet
发送回客户端,用户在浏览器中看到渲染后的页面。
- 最终的 HTML 响应通过
简化流程图:
Client Request -> DispatcherServlet -> Handler Mapping -> Controller -> Handler Adapter -> ModelAndView -> View Resolver -> View -> Response
通过以上步骤,Spring MVC 实现了从接收请求到生成响应的完整流程。这个流程帮助开发者将 Web 应用程序的各个部分解耦,使得代码更易于维护和扩展。