MVC簡(jiǎn)介
MVC是一種軟件設(shè)計(jì)規(guī)范,模型(Model)、視圖(View)、控制器(Controller)的縮寫(xiě).
MVC是一種常見(jiàn)的架構(gòu)模式,其目的是為了解耦!
Model(模型):數(shù)據(jù)模型提供頁(yè)面要展示的數(shù)據(jù),也叫業(yè)務(wù)邏輯層。模型層是一個(gè)廣泛的概述,模型層包括Service層、Dao層。
View(視圖):負(fù)責(zé)進(jìn)行數(shù)據(jù)模型 + 視圖框架的展示,也就是我們看到的網(wǎng)頁(yè)!
Controller(控制器):接收用戶(hù)請(qǐng)求,委托給模型進(jìn)行處理,處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。
在MVC架構(gòu)提出之前,Web頁(yè)面的開(kāi)發(fā)是只有模型、視圖兩層;也就是說(shuō)沒(méi)有Controller控制層,下面先來(lái)看看為什么MVC會(huì)成功取代傳統(tǒng)的兩層架構(gòu)
在這里個(gè)人整理了一些資料,有需要的朋友可以直接點(diǎn)擊領(lǐng)取。
從0到1Java學(xué)習(xí)路線(xiàn)和資料
優(yōu)點(diǎn):
架構(gòu)簡(jiǎn)單,容易實(shí)現(xiàn)。
缺點(diǎn):
視圖層的職責(zé)不單一;不僅需要對(duì)數(shù)據(jù)進(jìn)行封裝,還需要編寫(xiě)邏輯代碼調(diào)用模型層也就是說(shuō)這里的視圖層充當(dāng)了視圖 + 控制兩個(gè)職責(zé);視圖層直接與模型層打交道頁(yè)面及其的混亂、不利于維護(hù)
MVC架構(gòu)提出是為了將視圖與模型層分開(kāi),二者不直接打交道;而是通過(guò)控制層來(lái)從當(dāng)二者交互的橋梁;
視圖層只需要專(zhuān)注于數(shù)據(jù)封裝與展示
模型層專(zhuān)注于業(yè)務(wù)邏輯
控制層負(fù)責(zé)處理用戶(hù)遞交的請(qǐng)求,并且協(xié)調(diào)視圖與模型層

SpringMVC執(zhí)行流程
SpringMVC框架的核心圍繞著DispatcherServlet前端控制器進(jìn)行展開(kāi),它用于協(xié)調(diào)所有的Servlet對(duì)用戶(hù)的請(qǐng)求進(jìn)行解析、查找對(duì)應(yīng)的Servlet進(jìn)行處理、最后給出響應(yīng)!可以將DispatcherServlet功能類(lèi)似于CPU處理器、人類(lèi)的大腦…

- 用戶(hù)通過(guò)視圖頁(yè)面或者是url地址路徑發(fā)起請(qǐng)求,前端控制DispatcherServlet接收用戶(hù)的請(qǐng)求開(kāi)始運(yùn)作!
- DispatcherServlet調(diào)用HandlerMapping找到最終用于執(zhí)行的Handler
- HandlerExecution中包括具體的執(zhí)行器Handler、HandlerInterceptor處理器攔截器。將其返回交給前端控制器DispatcherServlet。
- 將獲取到的HandlerExecution對(duì)象匹配對(duì)應(yīng)的處理器適配器HandlerAdapter,將其進(jìn)行解析。
- 處理器適配器HandlerAdapter最終成功匹配到程序員寫(xiě)的Controller層的Servlet類(lèi)。
- Controller層職責(zé)分明,調(diào)用模型層進(jìn)行數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),并且獲取到最后需要響應(yīng)給用戶(hù)的數(shù)據(jù)、視圖。
- Controller層中將數(shù)據(jù)、視圖封裝在ModelAndView對(duì)象中,然后將其返回給處理器適配器HandlerAdapter。
- 處理器適配器HandlerAdapter接收到Controller返回結(jié)果進(jìn)行處理,然后移交給前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet調(diào)用視圖解析器ViewResolver;ViewResolver解析ModelAndView中的數(shù)據(jù)、解析響應(yīng)的視圖名、找到對(duì)應(yīng)的視圖、最后將數(shù)據(jù)封裝到視圖中!
- 視圖解析器ViewResolver將視圖名字返回給前端控制器DispatcherServlet,最后前端控制器DispatcherServlet調(diào)用響應(yīng)的視圖展示給用戶(hù)!
第一個(gè)SpringMVC程序
JSP頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
編寫(xiě)對(duì)應(yīng)的Servlet(Controller)
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 1. 創(chuàng)建模型-視圖
ModelAndView mv = new ModelAndView();
//調(diào)用業(yè)務(wù)層
// 2. 封裝數(shù)據(jù)對(duì)象
mv.addObject("message","Hello, SpringMVC!");
// 3. 封裝要跳轉(zhuǎn)的視圖,放在ModelAndView中
mv.setViewName("hellomvc");
return mv;
}
}
配置SpringMVC核心文件
核心配置文件中,配置映射器、適配器、解析器;最后將請(qǐng)求的路徑以及對(duì)應(yīng)的Servlet類(lèi)交給IOC容器托管。
<?xml version="1.0" encoding="UTF8"?>
<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">
<!-- 1. 配置處理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 2. 配置處理器適配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 3. 配置視圖解析器 -->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前綴 -->
<property name="prefix" value="/WEB-INF/page/"/>
<!-- 后綴 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 4. 將servlet交給IOC容器管理 -->
<bean id="/hellomvc" class="com.controller.HelloController"/>
</beans>
配置映射路徑處理
由于所有的Sevlet不在走各自的映射路徑,而是統(tǒng)一由前端控制器DispatcherServlet調(diào)度,所以只需要在項(xiàng)目的web.xml中配置DispatcherServlet即可。然后將SpringMVC核心配置文件交給前端控制器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">
<!--1.注冊(cè)DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 關(guān)聯(lián)Spring的核心配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC-Servlet.xml</param-value>
</init-param>
<!-- 啟動(dòng)級(jí)別1 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
測(cè)試結(jié)果

分析與總結(jié)
web.xml中無(wú)需要在配置單獨(dú)Servlet的映射路徑,而是直接配DispatcherServlet。這是因?yàn)榍岸丝刂破鲿?huì)自行根據(jù)HandlerMapping進(jìn)行查找。
Servlet無(wú)需在繼承HttpServlet類(lèi),是因?yàn)镈ispatcherServlet是繼承了HttpServlet。而現(xiàn)在編寫(xiě)的Servlet實(shí)現(xiàn)了Controller接口會(huì)在經(jīng)過(guò)適配器HandlerAdapter進(jìn)行找到!

最后
都看到這里,覺(jué)得文章對(duì)你有幫助記得給個(gè)點(diǎn)贊。