MVC架構探究及其源碼實現(2)-核心組件定義
博學,切問,近思--詹子知 (https://jameszhan.github.io)
上文中,我們討論了MVC的架構的基本原理,這裏,我們就要開始著手實現一個簡單的WEB MVC前端控製器模型。為了實現這個架構的原型,我們必須引入幾個新的概念。
- DispatcherServlet:前端控製器,也是整個架構的核心,負責處理和分發請求。
- HandlerMapping:處理器映射,他主要包含的是控製器的列表,對於特定的請求,根據HandlerMapping的映射關係,可以找到特定的控製器。最簡單的便是url到控製器的映射。
- HandlerAdapter:對於不同類型的控製器,該類負責把Handler請求處理的結果統一轉換成ModelAndView。
- ModelAndView:包含數據和視圖的信息,一般包含視圖名,和這個視圖需要用的數據,這裏的Model大家不要誤會為模型的概念,它隻不過同時包含視圖信息及這個視圖需要顯示的相關信息而已。
- ViewResolver:它View名稱解析成View對象。
- View:定義response顯示的詳細內容。
HandlerMapping:package com.google.mvc.web.servlet; import javax.servlet.http.HttpServletRequest; public interface HandlerMapping { String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping"; Object getHandler(HttpServletRequest request) throws Exception; } HandlerAdapter:package com.google.mvc.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface HandlerAdapter { boolean supports(Object handler); ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; long getLastModified(HttpServletRequest request, Object handler); } ViewResolver:package com.google.mvc.web.servlet; public interface ViewResolver { View resolveViewName(String viewName) throws Exception; } View: package com.google.mvc.web.servlet; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface View { String getContentType(); void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception; } ModelAndView:package com.google.mvc.web.servlet; import java.util.HashMap; import java.util.Map; public class ModelAndView { private Object view; private Map<String, Object> model; private boolean cleared; public ModelAndView() { } public ModelAndView(String viewName) { this.view = viewName; } public ModelAndView(View view) { this.view = view; } public ModelAndView(String viewName, Map<String, Object> model) { this.view = viewName; if (model != null) { addAllObjects(model); } } public ModelAndView(View view, Map<String, Object> model) { this.view = view; if (model != null) { addAllObjects(model); } } public ModelAndView(String viewName, String modelName, Object modelObject) { this.view = viewName; addObject(modelName, modelObject); } public ModelAndView(View view, String modelName, Object modelObject) { this.view = view; addObject(modelName, modelObject); } public void setViewName(String viewName) { this.view = viewName; } public String getViewName() { return (this.view instanceof String ? (String) this.view : null); } public void setView(View view) { this.view = view; } public View getView() { return (this.view instanceof View ? (View) this.view : null); } public boolean hasView() { return (this.view != null); } public boolean isReference() { return (this.view instanceof String); } protected Map<String, Object> getModelInternal() { return this.model; } public Map<String, Object> getModelMap() { if (this.model == null) { this.model = new HashMap<String, Object>(); } return this.model; } public Map<String, Object> getModel() { return getModelMap(); } public ModelAndView addObject(String attributeName, Object attributeValue) { getModelMap().put(attributeName, attributeValue); return this; } public ModelAndView addObject(Object attributeValue) { getModelMap().put(attributeValue.toString(), attributeValue); return this; } public ModelAndView addAllObjects(Map<String, Object> modelMap) { getModelMap().putAll(modelMap); return this; } public void clear() { this.view = null; this.model = null; this.cleared = true; } public boolean isEmpty() { return (this.view == null && this.model == null); } public boolean wasCleared() { return (this.cleared && isEmpty()); } public String toString() { StringBuffer buf = new StringBuffer("ModelAndView: "); if (isReference()) { buf.append("reference to view with name '").append(this.view).append("'"); } else { buf.append("materialized View is [").append(this.view).append(']'); } buf.append("; model is ").append(this.model); return buf.toString(); } }
這幾個類由DispatcherServlet管理和控製,以下是它們的序列圖:
這些對象需要怎麼注入到係統中呢?這裏當然少不了配置文件的支持,現在比較流行的MVC框架大多可以使用Spring作為其IOC容器,為了簡單起見,我們自己決定模擬Spring簡單地實現一個配置管理容器,用於管理我們的各種對象資源。
相關文章:
- MVC架構探究及其源碼實現(1)-理論基礎
- MVC架構探究及其源碼實現(3)-WebApplicationContext
- MVC架構探究及其源碼實現(4)-前端控製器
- MVC架構探究及其源碼實現(5)-相關組件實現
- MVC架構探究及其源碼實現(6)-簡單示例
最後更新:2017-04-02 04:01:42