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