快速瞭解Web MVC設計模式

MVC概述

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

  • Model:模型。負責執行實際的業務,包含數據操做,能夠向視圖推送數據
  • view:視圖。向用戶展現數據或效果並接收用戶的請求
  • Controller:控制器。接收視圖的請求、控制流程、選擇視圖展現數據

MVC適用範圍

MVC適合大型應用的開發。清晰的職責劃分,有利於複雜項目的開發,並提升代碼健壯性和可重用性。java


MVC設計模式開發Web

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

運做流程

  • 前端頁面接收用戶輸入並向服務器發送請求
  • 服務器接收請求和請求的數據並選擇適當的控制器執行服務
  • 控制根據須要調用模型完成業務
  • 控制器選擇視圖展現結果

😄 ​控制器能夠本身實現一些簡單的業務,但它主要仍是用於控制業務流程,清晰的職責劃分對於複雜的項目十分有益spring


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

後端有四個重要的部件:後端

  • DispatcherServlet:僅做爲接收前端請求的入口,不控制業務流程,具體流程交給專門的控制器完成。設計模式

  • Controller:控制流程調用模型,獲得結果後選擇相應的視圖展現給用戶spring-mvc

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

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

僞代碼

DispatcherServletapp

@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開發技術詳解》孫衛琴