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