1、回顧MVC
1.1、什么是MVC
- MVC是模型(Model)、視圖(View)、控制器(Controller)的簡寫,是一種軟件設計規范。
- 是將業務邏輯、數據、顯示分離的方法來組織代碼。
- MVC主要作用是降低了視圖與業務邏輯間的雙向偶合。
- MVC不是一種設計模式,MVC是一種架構模式。當然不同的MVC存在差異。
Model(模型):數據模型,提供要展示的數據,因此包含數據和行為,可以認為是領域模型或JavaBean組件(包含數據和行為),不過現在一般都分離開來:Value Object(數據Dao) 和 服務層(行為Service)。也就是模型提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。
View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。
Controller(控制器):接收用戶請求,委托給模型進行處理(狀態改變),處理完畢后把返回的模型數據返回給視圖,由視圖負責展示。 也就是說控制器做了個調度員的工作。
最典型的MVC就是JSP + servlet + javabean的模式。
1.2、Model1時代
-
在web早期的開發中,通常采用的都是Model1。
-
Model1中,主要分為兩層,視圖層和模型層。
Model1優點:架構簡單,比較適合小型項目開發;
Model1缺點:JSP職責不單一,職責過重,不便于維護;
1.3、Model2時代
Model2把一個項目分成三部分,包括視圖、控制、模型。
- 用戶發請求
- Servlet接收請求數據,并調用對應的業務邏輯方法
- 業務處理完畢,返回更新后的數據給servlet
- servlet轉向到JSP,由JSP來渲染頁面
- 響應給前端更新后的頁面
職責分析:
Controller:控制器
- 取得表單數據
- 調用業務邏輯
- 轉向指定的頁面
Model:模型
- 業務邏輯
- 保存數據的狀態
View:視圖
- 顯示頁面
Model2這樣不僅提高的代碼的復用率與項目的擴展性,且大大降低了項目的維護成本。Model 1模式的實現比較簡單,適用于快速開發小規模項目,Model1中JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一起,從而導致代碼的重用性非常低,增加了應用的擴展性和維護的難度。Model2消除了Model1的缺點。
1.4、回顧Servlet
-
新建一個Maven工程當做父工程! pom依賴!
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
</dependencies>
-
建立一個Moudle:springmvc-01-servlet , 添加Web app的支持!
-
導入servlet 和 jsp 的 jar 依賴
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version>
</dependency>
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version>
</dependency>
編寫一個Servlet類,用來處理用戶的請求
package com.kuang.servlet;
//實現Servlet接口
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//取得參數String method = req.getParameter("method");if (method.equals("add")){req.getSession().setAttribute("msg","執行了add方法");}if (method.equals("delete")){req.getSession().setAttribute("msg","執行了delete方法");}//業務邏輯//視圖跳轉req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
編寫Hello.jsp,在WEB-INF目錄下新建一個jsp的文件夾,新建hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Kuangshen</title>
</head>
<body>${msg}
</body>
</html>
在web.xml中注冊Servlet
<?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"><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.kuang.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/user</url-pattern></servlet-mapping>
</web-app>
-
配置Tomcat,并啟動測試
- localhost:8080/user?method=add
- localhost:8080/user?method=delete
MVC框架要做哪些事情
- 將url映射到java類或java類的方法 .
- 封裝用戶提交的數據 .
- 處理請求—調用相關的業務處理—封裝響應數據 .
- 將響應的數據進行渲染 . jsp / html 等表示層數據 .
說明:
? 常見的服務器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常見前端MVC框架:vue、angularjs、react、backbone;由MVC演化出了另外一些模式如:MVP、MVVM 等等….