什么是Spring MVC
Spring MVC是Spring Framework的一部分,是基於Java實現MVC的輕量級Web框架。
官方文檔:https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-reference/html/mvc.html
Spring MVC的特點:
-
輕量級,簡單、靈活、易用。
-
高效,基於請求響應的MVC框架(發送一個請求,就會響應一個視圖)
-
作為Spring的一部分,享受了Spring的所有便利。
-
約定大於配置。
-
功能強大:RESTful、數據驗證(手機號碼,郵箱格式驗證等)、格式化、本地化、主題等。
Spring MVC原理
官方原理圖如下:

中文版原理圖:

SpringMVC框架是圍繞DispatcherServlet設計的,對應原理圖中的前端控制器。
-
DispatcherServlet本質上是一個調度Servlet。
-
DispatcherServlet的作用是將請求分發到不同的處理器。
-
Spring2.5開始,基於注解形式開發,十分簡潔。

Spring MVC執行流程如下:

實線表示Spring MVC已經實現好的,只有虛線是需要自己實現的。
執行流程:
1、DispatcherServlet表示前端控制器
DispatcherServlet是整個Spring MVC的控制中心,用戶發出請求,DispatcherServlet接收並攔截請求。
-
請求url為:http://localhost:8080/springmvc_war/hello ,拆成三部分:
- http://localhost:8080:服務器域名
- springmvc_war:部署在web服務器上的工程站點。
- /hello:表示控制器Controller
-
如上url表示:請求位於服務器http://localhost:8080 上的 springmvc_war 站點的 hello控制器。
2、HandlerMapping為處理器映射
DispatcherServlet調用HandlerMapping,后者根據請求url查找Handler。
3、HandlerExecution是具體的Handler
- 主要作用是根據url查找控制器
- url:http://localhost:8080/springmvc_war/hello,查找的控制器是:/hello
- HandlerExecution將解析后的信息傳遞給DispatcherServlet。如解析后的控制器映射等。
4、HandlerAdapter為處理器適配器
- 按照特定的規則去執行Handler
- Handler讓具體的Controller執行。
- Controller將執行結果,包括數據和視圖信息,封裝到ModelAndView。並返回給HandlerAdapter。
- HandlerAdapter將ModelAndView傳遞給DispatcherServlet。
5、ViewResolver視圖解析器
- DispatcherServlet調用視圖解析器ViewResolver來解析ModelAndView中的視圖名
- 將解析后的視圖名傳遞給DispatcherServlet。
- DispatcherServlet根據視圖名,調用具體的視圖。
- 渲染視圖,返回呈現。
HelloSpringMVC
Spring2.5以后,使用注解開發SpringMVC功能十分強大。但是為了更清楚了解SpringMVC原理,最佳實踐是動手實現。
1、web.xml配置
- 在web.xml中配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注冊DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--關聯一個springmvc的配置文件,命名規則為:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的請求:不包括.jsp-->
<!--/* 匹配所有的請求:包括.jsp-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、DispatcherServlet對應sping bean文件配置
- 一個DispatcherServlet需要關聯一個spring bean配置文件。
- 根據官方命名規則:【servlet-name】-servlet.xml,此處為springmvc-servlet.xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--添加處理器映射-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--添加處理器適配-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--添加視圖解析器:解析DispatcherServlet給它的ModelAndView
1、獲得ModelAndView中的數據
2、解析ModelAndView中的視圖名字
3、拼接視圖完整文件名,找到視圖 /WEB-INF/jsp/XXX.jsp
4、將數據渲染到這個視圖上
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前綴-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后綴-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3、編寫Controller
Controller負責解析用戶請求,進行業務處理,並返回一個模型。
Controller通過實現接口和注解定義兩種方法實現。
實現了Controller接口的類就是控制器,這是較老的方法。
一個控制器類只能有一個方法。多個方法要寫多個controller。
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和視圖
ModelAndView mv=new ModelAndView();
//封裝對象,放在ModelAndView中
mv.addObject("msg", "Hello!SpringMVC!~~");
//封裝要跳轉的視圖,放在ModelAndView中。
mv.setViewName("hello"); //WEB-INF/jsp/hello.jsp
return mv;
}
}
4、把Controller注冊到Spring
由於處理器映射使用了BeanNameUrlHandlerMapping,必須要在Spring文件中注冊Controller。
- bean的id屬性值為:斜杠/+控制器Controller。此處為"/hello"。
- Controller的id與服務器域名http://localhost:8080,工程包/springmvc_war,一起組成完整的請求url。
- 在瀏覽器輸入url:http://localhost:8080/springmvc_war/hello
- 請求/hello,直接映射到"controller.MyController"控制器。
<!--id為斜杠/+控制器Controller,HandlerMapping根據url映射到controller-->
<bean id="/hello" class="controller.MyController" />
5、編寫要跳轉的.jsp頁面文件
此處跳轉到hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Zuka</title>
</head>
<body>
${msg}
</body>
</html>
6、啟動Tomcat測試
- 在 Tomcat部署工程
點擊運行后,默認頁面彈出,展示index.jsp內容。對應鏈接:http://localhost:8080/springmvc_war

在鏈接末尾加上hello,對應鏈接:http://localhost:8080/springmvc_war/hello 。
該URL映射到MyController處理。返回頁面展示hello.jsp內容。也就是MyController中 msg字段值。

