快速瞭解Web MVC設計模式

呆煒發表於2021-04-09

MVC概述

MVC即 Model-View-Controller 的縮寫,是按照職責劃分模組一種設計模式,其中Model是核心。

  • Model:模型。負責執行實際的業務,包含資料操作,可以向檢視推送資料
  • view:檢視。向使用者展示資料或效果並接收使用者的請求
  • Controller:控制器。接收檢視的請求、控制流程、選擇檢視展示資料

MVC適用範圍

MVC適合大型應用的開發。清晰的職責劃分,有利於複雜專案的開發,並提高程式碼健壯性和可重用性。


MVC設計模式開發Web

在請求/響應方式的Web應用中,模型無法向檢視推送訊息。MVC幫助Web開發實現了前後端分離,檢視就是前端的頁面,控制器和模型屬於後端,前後端之間的資料交流使用JSON格式。

運作流程

  • 前端頁面接收使用者輸入並向伺服器傳送請求
  • 伺服器接收請求和請求的資料並選擇適當的控制器執行服務
  • 控制根據需要呼叫模型完成業務
  • 控制器選擇檢視展示結果

? ​控制器可以自己實現一些簡單的業務,但它主要還是用於控制業務流程,清晰的職責劃分對於複雜的專案十分有益


模仿Spring MVC框架搭建一個簡單的模型

後端有四個重要的部件:

  • DispatcherServlet:僅作為接收前端請求的入口,不控制業務流程,具體流程交給專門的控制器完成。

  • Controller:控制流程呼叫模型,得到結果後選擇相應的檢視展示給使用者

  • JavaBean/EJB:模型,實現具體業務,例如CRUD...

  • RequestMapping:DispatcherServlet作為請求的統一入口,是如何選擇適當Controller執行業務流程呢?這就要建立URL請求和Controller之間的對映關係,使用Java註解和反射來建這個對映。

虛擬碼

DispatcherServlet

@WebServlet(urlPatterns = "*",loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        初始化RequestMapping中的對映資訊;
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取請求的uri
        String uri = req.getRequestURI();
        Object o = 呼叫RequestMapping的方法將uri對映到Controller ;
        Methon m = ... ;
        其他 others = ...;
        //呼叫Controller
        try {
            Object result = method.invoke(object, req, resp);
            switch (根據對映中的資訊選擇) {
                case 檢視: 從result中獲取檢視地址;
                case 資料: 維持請求使用的檢視,僅返回資料;                    
                ... ...
            }
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }

    private void responseView(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
        resp.sendRedirect(result);
    }

    private void responseText(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
        PrintWriter writer = resp.getWriter();
        writer.println(result);
    }
}

RequestMapping

public class RequestMapping {
    //儲存對映的集合
    private static Map map = new HashMap<>();

    //獲取對映服務
    public static MVCMapping get(String uri) {
        return map.get(uri);
    }

    //載入對映
    public static void load() {
        讀取配置檔案;
        類載入器載入獲取配置檔案中Controller物件的例項;
        for (迴圈條件) {
            if (Controller的方法包含的資訊) {
                放入map集合建立對映關係;
            }
        }
    }
}

Controller

public class DemoController {
    @註解(資訊:方法對應的url)
    public T methonName(HttpServletRequest req, HttpServletResponse resp) {
        控制業務流程,呼叫模型;
        return T;
    }
    
    @註解(資訊:方法對應的url)
    其他方法{
        
    }
}


文章參考書籍

  • 《Tomcat與Java Web開發技術詳解》孫衛琴

相關文章