上文中,我们讨论了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简单地实现一个配置管理容器,用于管理我们的各种对象资源。
原文地址:http://blog.csdn.net/zhiqiangzhan/article/details/4762600
相关推荐
通过对比这两个版本的源码,开发者可以深入了解Struts 2框架的设计理念,学习如何实现Action、Interceptor、Result等核心组件,以及如何利用OGNL进行数据绑定。同时,分析版本间的差异有助于理解框架的发展趋势和...
下面我们将详细探讨Spring Framework的核心组件、设计理念以及源码学习的重点。 Spring Framework的核心组件包括: 1. **IoC(Inversion of Control)容器**:这是Spring最核心的部分,它负责管理应用程序中的对象...
Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用程序。它的核心组件包括Ognl(Object-Graph Navigation Language)、XWork以及Struts2 Core。这些组件相互协作,为...
官方原版源码spring-framework-5.1.13.RELEASE.zip为我们提供了深入了解这一框架的机会,让我们能够探究其内部工作机制,提升开发技能。 1. **Spring Framework概述** Spring Framework是Java应用程序开发的一个...
特别地,Spring MVC是Spring用于构建Web应用的重要组件,它通过DispatcherServlet、HandlerMapping、ViewResolver等机制实现了请求的路由和视图的渲染。 四、模块扩展 - Spring Framework 5.0引入了Reactive编程...
《深入剖析Spring Framework 5.1.14源码》 Spring Framework作为Java开发领域中的基石,其核心...通过阅读和学习源码,我们可以深入探究DI、AOP、Web MVC、数据访问等核心概念,提升我们的编程技巧和解决问题的能力。
4. **Web MVC**:关注`org.springframework.web.servlet`包,探究DispatcherServlet的工作原理,以及视图解析、控制器映射等关键组件。 五、源码学习价值 学习Spring源码能够帮助开发者: - **理解设计模式**:...
Spring 框架是 Java 开发中的一个核心组件,它为构建可维护、模块化和松耦合的应用程序提供了一种强大的方式。Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译...
Vue.js 是一款流行的前端框架,Vue Router 是 Vue.js 生态中的官方路由库,它负责管理单页应用(SPA,...随着对 Vue Router 源码的深入探究,我们也将对前端架构有更深刻的认识,为未来的项目开发打下坚实的基础。
通过阅读Struts2的源码,开发者可以深入理解其内部工作流程,包括Action、Interceptor、Result、Freemarker模板等核心组件的实现。例如,Action是业务逻辑的载体,Interceptor提供了拦截请求并执行额外操作的能力,...
这个压缩包"spring-framework-2.5.4源码.rar"包含了Spring框架的核心组件和相关源代码,特别是"src"目录下的文件,这将使我们有机会探究Spring如何处理IoC(Inversion of Control)、AOP(Aspect Oriented ...
AngularJS通过MVC(模型-视图-控制器)架构模式,实现了数据绑定和依赖注入,极大地提高了Web应用的开发效率。在dist-flatboard-v1.2中,AngularJS被用来管理应用的状态,实现动态数据渲染和交互功能。通过双向数据...
- **MVC(Model-View-Controller)**:Spring MVC是Web开发的重要部分,源码中涉及DispatcherServlet、HandlerMapping、ViewResolver等组件,理解它们的工作原理对于Web应用的开发至关重要。 - **事务管理**:...
学习Backbone.js,开发者需要理解MVC架构的原理,掌握事件驱动编程和数据绑定的概念。同时,对JavaScript原型链、闭包以及异步操作的理解也是必不可少的。通过阅读源码和API文档,开发者可以学习到如何有效地组织...
Spring的核心组件包括IoC(Inversion of Control,控制反转)容器、AOP代理、数据访问/集成层以及Web应用程序上下文。IoC容器是Spring的基石,它负责管理对象的生命周期和对象之间的依赖关系。通过XML配置或注解方式...
2. **AOP的实现**:查看AOP代理(JDK动态代理和CGLIB)的实现,理解切面如何织入目标对象。 3. **MVC组件**:深入DispatcherServlet、HandlerMapping、HandlerAdapter、ModelAndView等类,学习请求的处理流程。 4....
在源码剖析中,开发者通常会关注Spring Boot的核心组件以及其生命周期管理。例如,Spring Boot应用的启动是由SpringApplication类来完成的,该类封装了运行Spring应用所需的所有启动逻辑。SpringApplication类的run...
在描述中提到的"xwiki源码",意味着我们要深入探究XWiki的内部结构,理解其设计原则和实现机制。这对于开发者来说是非常有价值的,因为通过研究源码,可以学习到优秀的编程实践、框架使用,以及如何构建大规模的Web...
【苹果在线源码】是一个与iOS开发相关的主题,特别是针对iPhoneQQ应用的源代码分析。在iOS开发领域,源码的分析和...同时,这也是一个很好的机会去探究大型项目如何组织架构,以及在实际场景下如何解决各种复杂问题。
在这个文档和源码集合中,我们可以深入探究Spring 2.0的核心概念和技术细节。 首先,`.chm`文件是Windows的帮助文件格式,这里包含的是Spring 2.0的官方文档。文档通常会详细介绍框架的架构、配置、API以及如何在...