SpringMVC執行原理:

- 當發起請求時被前置的控制器攔截到請求,
- 根據請求引數生成代理請求,
- 找到對應的實際控制器,
- 控制器處理請求,創建資料模型,訪問資料庫,將模型回應給中心控制器,
- 控制器使用模型與視圖渲染視圖結果,
- 將結果回傳給中心控制器,再將結果回傳給請求者,
用Java中的實際模塊來表示流程:

? 圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發者實作,虛線部分則是我們在開發中根據業務實作的內容;
具體分析執行流程:
-
DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心,用戶發出請求,DispatcherServlet接收請求并攔截請求,
- 我們假設為請求的url為:http://localhost:8080/SpringMVC/hello ,拆分為三部分
- http://localhost:8080 服務器域名
- SpringMVC 部署在服務器上的web站點
- hello 表示控制器
- 通過分析,如上url表示為:請求位于服務器http://localhost:8080上的SpringMVC站點的hello控制器,
-
HandlerMapping為處理器映射,DispatcherServlet呼叫HandlerMapping,HandlerMapping決議url得到對應的handler(controller的映射)
-
HandlerExecution將決議后的資訊傳遞給DispatcherServlet,如決議控制器映射等;
-
DispatcherServlet再呼叫HandlerAdapter(處理器配接器),根據Mapping回傳的handler映射去找到對應的Controller并執行;
-
執行后一般會回傳一個ModelAndView到DispatcherServlet
- Model:封裝執行后的資料
- View:需要渲染的視圖
-
得到的ModelAndView會走ViewResolver(視圖決議器),視圖決議器會決議ModelAndView中的資料找到對應的視圖名進行拼接,然后再將Model中的資料渲染到這個視圖;
-
視圖決議器將決議后的邏輯視圖名傳給DispatcherServlet;
-
DispatcherServlet根據得到的決議后的視圖結果,呼叫具體的視圖呈現給用戶,
核心配置內容:
- SpringMVC.xml組態檔
- Web.xml組態檔
- Controller控制器
1、web.xml配置
這里使用spring框架中寫好的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:這是SpringMVC的核心:請求分發器,前端控制器-->
<servlet>
<servlet-name>dpcServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要系結Spring的組態檔-->
<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>
<!--
在SpringMVC中, / /*區別
/: 只匹配所有的請求,不匹配jsp頁面
/*: 匹配所有的請求,包括jsp頁面
-->
<servlet-mapping>
<servlet-name>dpcServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、SpringMVC組態檔
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--處理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--處理器配接器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--視圖決議器:
1.獲取到ModelAndView的資料
2.決議ModelAndView中的視圖名字
3.拼接視圖名字,找到對應的視圖 /WEB-INF/jsp/hello.jsp
4.將資料渲染到這個視圖
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前綴-->
<property name="prefix" value=https://www.cnblogs.com/spang/p/"/WEB-INF/jsp/"/>
3、MyController實作Controller
org.springframework.web.servlet.mvc.Controller
public class MyController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//這里模擬業務執行后回傳的資料
String result = "HelloSpringMVC";
//封裝資料
mv.addObject("msg",result);
//設定將跳轉的視圖名
mv.setViewName("test");
return mv;
}
}
4、test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--這里的msg取得就是model中封裝的資料--%>
${msg}
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80763.html
標籤:Java
下一篇:微信小程式對接通聯支付
