Spring MVC執行流程(原理理解)
阿新 • • 發佈:2022-05-18
用最原始的方式建立一個Spring MVC案例,重在理解Spring MVC的執行流程。
1、建立一個Maven工程
建立好了以後匯入以下依賴:<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.18</version> </dependency> <!--Servlet相關依賴--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!--jsp相關依賴--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> <scope>provided</scope> </dependency> </dependencies>
2、在web.xml檔案中配置前端控制器DispatcherServlet
web.xml檔案的內容為:
<?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> <init-param> <param-name>contextConfigLocation</param-name> <!--對映到SpringMVC的配置檔案--> <param-value>classpath:spring-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> </web-app>
3、建立SpringMVC的配置檔案spring-mvc.xml
spring-mvc.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" 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 https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--處理器對映器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--處理器介面卡--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 註冊檢視解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置字首 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 配置字尾 --> <property name="suffix" value=".jsp"/> </bean> <!--自己寫的Controller--> <bean id="/hello" class="com.thr.controller.HelloController"/> </beans>
4、建立Controller類
這個HelloController就是我們具體要做的工作,根據要完成的功能編寫:
package com.thr.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "Hello SpringMVC!");
mv.setViewName("hello");
return mv;
}
}
功能完成後會將結果傳遞給具體的頁面展示,通過ModelAndView物件的setViewName方法指定要跳轉的頁面。
5、編寫檢視檔案hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
所有檔案建立完畢,專案的整體目錄結構為:
6、啟動Tomcat測試
7、總結-原理
下圖為一個較完整的SpringMVC工作執行流程圖(圖片來自:https://www.cnblogs.com/tanghaorong/p/14495016.html):
具體的執行流程為:
- 前端控制器DispatcherServlet接收使用者發起的請求;
- DispatcherServlet將請求轉給處理器對映器HandlerMapping;
- 處理器對映器根據請求的url查詢處理器Handler並將處理器返回給前端控制器;
- 前端控制器呼叫處理器介面卡HandlerAdapter去執行Handler;
- 處理器介面卡呼叫相應的處理器Handler,即我們寫的具體的Controller方法;
- Controller處理完後返回ModelAndView物件給處理器介面卡;
- 處理器介面卡將Controller執行結果ModelAndView返回給前端控制器;
- 前端控制器呼叫檢視解析器ViewReslover處理ModelAndView;
- 檢視解析器根據邏輯檢視名解析成物理檢視名(即將"hello"轉換成"/WEB-INF/jsp/hello.jsp",也就是加上字首和字尾),生成並返回具體View物件;
- 前端控制器根據物件View進行檢視渲染(即將模型資料model填充至檢視中),最後給使用者返回響應。