快速了解Web MVC設計模式
- 2021 年 4 月 9 日
- 筆記
- JavaWEB開發, Java開發學習路線
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開發技術詳解》孫衛琴