MVC 設計不僅限於 Java Web 應用,還包括許多應用,比如前端、PHP、.NET 等語言。之所以那么做的根本原因在於解耦各個模塊。
MVC 是 Model、View 和 Controller 的縮寫,分別代表 Web 應用程序中的 3 種職責。
- 模型:用於存儲數據以及處理用戶請求的業務邏輯。
- 視圖:向控制器提交數據,顯示模型中的數據。
- 控制器:根據視圖提出的請求判斷將請求和數據交給哪個模型處理,將處理后的有關結果交給哪個視圖更新顯示。
基於 Servlet 的 MVC 模式的具體實現如下。
- 模型:一個或多個 JavaBean 對象,用於存儲數據(實體模型,由 JavaBean 類創建)和處理業務邏輯(業務模型,由一般的 Java 類創建)。
- 視圖:一個或多個 JSP 頁面,向控制器提交數據和為模型提供數據顯示,JSP 頁面主要使用 HTML 標記和 JavaBean 標記來顯示數據。
- 控制器:一個或多個 Servlet 對象,根據視圖提交的請求進行控制,即將請求轉發給處理業務邏輯的 JavaBean,並將處理結果存放到實體模型 JavaBean 中,輸出給視圖顯示。
Spring MVC 工作流程
Spring MVC 框架主要由 DispatcherServlet、處理器映射、控制器、視圖解析器、視圖組成,其工作原理如圖 1 所示。

圖 1 Spring MVC 工作原理圖
從圖 1 可總結出 Spring MVC 的工作流程如下:
- 客戶端請求提交到 DispatcherServlet。
- 由 DispatcherServlet 控制器尋找一個或多個 HandlerMapping,找到處理請求的 Controller。
- DispatcherServlet 將請求提交到 Controller。
- Controller 調用業務邏輯處理后返回 ModelAndView。
- DispatcherServlet 尋找一個或多個 ViewResolver 視圖解析器,找到 ModelAndView 指定的視圖。
- 視圖負責將結果顯示到客戶端。
Spring MVC接口
在圖 1 中包含 4 個 Spring MVC 接口,即 DispatcherServlet、HandlerMapping、Controller 和 ViewResolver。
Spring MVC 所有的請求都經過 DispatcherServlet 來統一分發,在 DispatcherServlet 將請求分發給 Controller 之前需要借助 Spring MVC 提供的 HandlerMapping 定位到具體的 Controller。
HandlerMapping 接口負責完成客戶請求到 Controller 映射。
Controller 接口將處理用戶請求,這和 Java Servlet 扮演的角色是一致的。一旦 Controller 處理完用戶請求,將返回 ModelAndView 對象給 DispatcherServlet 前端控制器,ModelAndView 中包含了模型(Model)和視圖(View)。
從宏觀角度考慮,DispatcherServlet 是整個 Web 應用的控制器;從微觀考慮,Controller 是單個 Http 請求處理過程中的控制器,而 ModelAndView 是 Http 請求過程中返回的模型(Model)和視圖(View)。
ViewResolver 接口(視圖解析器)在 Web 應用中負責查找 View 對象,從而將相應結果渲染給客戶。
五、Spring MVC使用
1.導入依賴
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> </dependency>
2.創建配置文件
配置版:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean id="/first" class="com.mvc.controller.FirstController"></bean> <!--視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
注解版:
<!--視圖解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!--包掃描儀--> <context:component-scan base-package="com.mvc"></context:component-scan> <!--開啟mvc配置--> <mvc:annotation-driven></mvc:annotation-driven>
3.配置web
<!--配置前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--初始化配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml</param-value> </init-param> <!--初始化時機--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
4.創建控制器
配置版:
public class FirstController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv=new ModelAndView(); mv.addObject("user","hehe"); mv.setViewName("index"); return mv; } }
注解版:
@Controller @RequestMapping("/second") public class SecondController { @RequestMapping("/method1") public ModelAndView method1(){ ModelAndView mv=new ModelAndView(); mv.addObject("user","hehe"); mv.setViewName("index"); return mv; } @RequestMapping("/method2") public ModelAndView method2(){ ModelAndView mv=new ModelAndView(); mv.addObject("user","haha"); mv.setViewName("index"); return mv; } }
5.測試
<%@page language="java" pageEncoding="UTF-8" contentType="text/html; UTF-8" isELIgnored="false" %> <html> <body> <img src="/img/pro.jpg"> <h2>Hello World!</h2> ${user} </body> </html>