MVC架构探究及其源码实现(2)-核心组件定义

 博学,切问,近思--詹子知 (https://jameszhan.github.io)

上文中,我们讨论了MVC的架构的基本原理,这里,我们就要开始着手实现一个简单的WEB MVC前端控制器模型。为了实现这个架构的原型,我们必须引入几个新的概念。

  1. DispatcherServlet:前端控制器,也是整个架构的核心,负责处理和分发请求。
  2. HandlerMapping:处理器映射,他主要包含的是控制器的列表,对于特定的请求,根据HandlerMapping的映射关系,可以找到特定的控制器。最简单的便是url到控制器的映射。
  3. HandlerAdapter:对于不同类型的控制器,该类负责把Handler请求处理的结果统一转换成ModelAndView。
  4. ModelAndView:包含数据和视图的信息,一般包含视图名,和这个视图需要用的数据,这里的Model大家不要误会为模型的概念,它只不过同时包含视图信息及这个视图需要显示的相关信息而已。
  5. ViewResolver:它View名称解析成View对象。
  6. 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简单地实现一个配置管理容器,用于管理我们的各种对象资源。

相关文章:

  1. MVC架构探究及其源码实现(1)-理论基础
  2. MVC架构探究及其源码实现(3)-WebApplicationContext
  3. MVC架构探究及其源码实现(4)-前端控制器
  4. MVC架构探究及其源码实现(5)-相关组件实现
  5. MVC架构探究及其源码实现(6)-简单示例
时间: 2025-01-01 09:12:06

MVC架构探究及其源码实现(2)-核心组件定义的相关文章

MVC架构探究及其源码实现(6)-简单示例

博学,切问,近思--詹子知 (https://jameszhan.github.io) 在前一系列的文章中,我们已经完成了MVC架构模式的简单实现,尽管有些粗糙,有些功能还不完善,但是,麻雀虽小,五脏俱全.我们现在就用这个小小的框架,来实现我们的几个简单的应用. 限于篇幅,我们不可能把应用的所有代码都贴上来,我们先来演示一个Hello World的简单应用. 实现控制器HelloController.javapackage com.google.mvc.web.sample; import ja

MVC架构探究及其源码实现(4)-前端控制器

博学,切问,近思--詹子知 (https://jameszhan.github.io) 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端.前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现.这里我们就采用后一种方式来实现我们的MVC框架.   1.配置web.xml,使得我们的前端控制器可以拦截所有符合要求的用户请求,这里我们的前端控制

MVC架构探究及其源码实现(3)-WebApplicationContext

博学,切问,近思--詹子知 (https://jameszhan.github.io) 直接利用web.xml去配置和定义我们的对象组件显然是不灵活和不方便扩展的,由于我们系统中将会需要配置很多个不同的对象资源,比如控制器,View对象,HandlerMapping对象等等,如何对它们进行管理,如何能让我们的前端控制器访问和利用到到它们便是我们不得不面对的问题.还好,现在有了Spring,现在很多流行的MVC框架都支持使用Spring对自己容器里的对象资源进行管理.尽管Spring千好万好,我们

MVC架构探究及其源码实现(5)-相关组件实现

博学,切问,近思--詹子知(http://blog.csdn.net/zhiqiangzhan) 本文将讨论HandlerMapping,HandlerAdapter,ViewResolver组件类的具体实现. URLHandlerMapping,利用request中包含的url信息,找到对应Handler对象,URLHandlerMapping是最典型的映射方式. package com.google.mvc.web.servlet.handler; import java.util.Map;

AngularJS入门教程之MVC架构实例分析_AngularJS

本文实例讲述了AngularJS的MVC架构.分享给大家供大家参考,具体如下: MVC应用程序架构最早于1970年起源于Smalltalk语言,后来在桌面应用程序开发中使用较为广泛,如今在WEB开发中也非常流行.MVC的核心思想是將数据的管理(Model).业务逻辑控制(Controller)和数据的展示(View)分离开来,使程序的逻辑性和可维护性更强. 对于AngularJS应用来说,视图(View)是DOM(文档对象模型),你可以理解为就是HTML页面.控制器(Controller)是一个

【深入Cocos2d-x】使用MVC架构搭建游戏Four

项目起源 项目Logo: 下面是该游戏的项目地址,各位想参考源代码的同学可以到我的GitHub上下载该项目的源码. 项目主页 GitHub地址 bug反馈及建议 我做这个项目的原始目的是实验MVC在游戏中的应用. Model-View-Controller(MVC)是一种组合设计模式,它体现了一种关注点分离(Separation of concerns,SoC)的思想.MVC主要把逻辑层和表现层进行了解耦,将一个问题划分成了不同的关注点.增强了应用的稳定性,易修改性和易复用性. MVC经常被使用

.NET平台MVC架构

问题描述 .NET平台与EXTJS或FLEX富客户端框架做开发时,MVC架构如何设计,如何才能提高后台代码复用率,不论用什么前端UI框架,后台代码都不怎么需要修改后台代码.有木有例子供参考.求助!!!!!!!!!!!!!!!!各位高手求思路. 解决方案 解决方案二:高内聚,低耦合解决方案三:编程对阵接口解决方案四:搞清楚,你重点问的问题是围绕写javascript代码,不是什么asp.netmvc.解决方案五:对于asp.net来说,除了在客户第一次访问时下载一个基本的html(其实只要有<di

Struts开发指南之MVC架构

模型-视图-控制器(MVC)是80年代Smalltalk-80出现的一种软件设计模式,现在已经被广泛的使用. 1.模型(Model) 模型是应用程序的主体部分.模型表示业务数据,或者业务逻辑. 2.视图(View) 视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面. 3.控制器(controller) 控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态. 开发指南之MVC架构-springmvc开发指南pdf"> MVC 式的出现不仅实现了功能模块和显

浅谈MVC架构模式

   MVC英文即Model-View-Controller,就是把一个应用分为三个层:视图层.模型层.控制层.    模型层(M)用于封装业务逻辑.    视图层(V)也叫表示层,就是与用户实现交互的界面,通常实现数据的输入和输出功能.    控制层(C)起到控制整个业务流程的作用.简单的说就是调用业务逻辑,然后把得到的数据转发给视图显示给用户. 为了熟悉MVC架构模式,特意将学生查询改成了MVC模式的. 1.首先建立客户端页面(student.jsp): 1 <%@ page languag