`
king_tt
  • 浏览: 2234040 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

springMVC源码分析--ModelAndViewContainer和ModelMap

 
阅读更多
ModelAndViewContainer主要是用来返回Model对象的,在ModelAndViewContainer中有defaultModel和redirectModel,

defaultModel是默认使用的Model,后者用于传递redirect时的参数,我们在处理中使用了Model或ModelMap时,ArgumentResolver会传入defaultModel,它是BindingAwareModelMap类型,既继承了ModelMap又实现了Model接口,所以在处理器中使用Model或者ModelMap其实使用的是同一个对象,Map参数传入的也是这个对象。处理器中RedirectAttributes类型的参数ArgumentResolver会传入redirectModel,它实际上是RedirectAttributeModelMap类型。

ModelAndViewContainer中其实就是一个ModelMap,一系列的操作都是基于ModelMap的。

public class ModelAndViewContainer {

	private boolean ignoreDefaultModelOnRedirect = false;
	
	//视图,可以是实际视图也可以是String类型的逻辑视图
	private Object view;

	//默认使用的Model
	private final ModelMap defaultModel = new BindingAwareModelMap();
	
	//redirect类型的Model
	private ModelMap redirectModel;

	private boolean redirectModelScenario = false;
	
	//用于设置SessionAttribute使用完的标志
	private final SessionStatus sessionStatus = new SimpleSessionStatus();

	//请求是否已经处理完成的标志
	private boolean requestHandled = false;


	
	public void setIgnoreDefaultModelOnRedirect(boolean ignoreDefaultModelOnRedirect) {
		this.ignoreDefaultModelOnRedirect = ignoreDefaultModelOnRedirect;
	}

	//设置视图名称
	public void setViewName(String viewName) {
		this.view = viewName;
	}

	
	public String getViewName() {
		return (this.view instanceof String ? (String) this.view : null);
	}

	
	public void setView(Object view) {
		this.view = view;
	}

	public Object getView() {
		return this.view;
	}

	public boolean isViewReference() {
		return (this.view instanceof String);
	}


	public ModelMap getModel() {
		if (useDefaultModel()) {
			return this.defaultModel;
		}
		else {
			return (this.redirectModel != null) ? this.redirectModel : new ModelMap();
		}
	}

	//和model相关的处理方法
     /*
       * 假设redirectModelScenario = R ,ignoreDefaultModelOnRedirect = I ,(redirectModel == null)= M
       * 那么(R, I, M)共有8中组合情况,useDefaultModel返回false(也就是使用redirectModel)只有三种情况:
       * (1,1,0)、(1,1,1)、(1,0,0)
       * a:如果同时设置了redirectModelScenario和ignoreDefaultModelOnRedirect为true,那么无论redirectModel
       *    是否为null,都会使用redirectModel;
       * b:如果设置了redirectModelScenario为true,而ignoreDefaultModelOnRedirect为false,同时redirectModel
       *    为null,那么也会使用redirectModel;
	*/
	private boolean useDefaultModel() {
		return (!this.redirectModelScenario || (this.redirectModel == null && !this.ignoreDefaultModelOnRedirect));
	}

	public ModelMap getDefaultModel() {
		return this.defaultModel;
	}

	public void setRedirectModel(ModelMap redirectModel) {
		this.redirectModel = redirectModel;
	}

	public void setRedirectModelScenario(boolean redirectModelScenario) {
		this.redirectModelScenario = redirectModelScenario;
	}

	public SessionStatus getSessionStatus() {
		return this.sessionStatus;
	}

	
	public void setRequestHandled(boolean requestHandled) {
		this.requestHandled = requestHandled;
	}

	
	public boolean isRequestHandled() {
		return this.requestHandled;
	}

	public ModelAndViewContainer addAttribute(String name, Object value) {
		getModel().addAttribute(name, value);
		return this;
	}


	public ModelAndViewContainer addAttribute(Object value) {
		getModel().addAttribute(value);
		return this;
	}

	public ModelAndViewContainer addAllAttributes(Map<String, ?> attributes) {
		getModel().addAllAttributes(attributes);
		return this;
	}

	public ModelAndViewContainer mergeAttributes(Map<String, ?> attributes) {
		getModel().mergeAttributes(attributes);
		return this;
	}

	public ModelAndViewContainer removeAttributes(Map<String, ?> attributes) {
		if (attributes != null) {
			for (String key : attributes.keySet()) {
				getModel().remove(key);
			}
		}
		return this;
	}

	
	public boolean containsAttribute(String name) {
		return getModel().containsAttribute(name);
	}

}
ModelMap其实就是一个HashMap而已,主要用于数据的存取而已。

@SuppressWarnings("serial")
public class ModelMap extends LinkedHashMap<String, Object> {

	
	public ModelMap() {
	}

	public ModelMap(String attributeName, Object attributeValue) {
		addAttribute(attributeName, attributeValue);
	}

	public ModelMap(Object attributeValue) {
		addAttribute(attributeValue);
	}


	public ModelMap addAttribute(String attributeName, Object attributeValue) {
		Assert.notNull(attributeName, "Model attribute name must not be null");
		put(attributeName, attributeValue);
		return this;
	}

	public ModelMap addAttribute(Object attributeValue) {
		Assert.notNull(attributeValue, "Model object must not be null");
		if (attributeValue instanceof Collection && ((Collection<?>) attributeValue).isEmpty()) {
			return this;
		}
		return addAttribute(Conventions.getVariableName(attributeValue), attributeValue);
	}

	public ModelMap addAllAttributes(Collection<?> attributeValues) {
		if (attributeValues != null) {
			for (Object attributeValue : attributeValues) {
				addAttribute(attributeValue);
			}
		}
		return this;
	}


	public ModelMap addAllAttributes(Map<String, ?> attributes) {
		if (attributes != null) {
			putAll(attributes);
		}
		return this;
	}


	public ModelMap mergeAttributes(Map<String, ?> attributes) {
		if (attributes != null) {
			for (Map.Entry<String, ?> entry : attributes.entrySet()) {
				String key = entry.getKey();
				if (!containsKey(key)) {
					put(key, entry.getValue());
				}
			}
		}
		return this;
	}

	
	public boolean containsAttribute(String attributeName) {
		return containsKey(attributeName);
	}

}



分享到:
评论

相关推荐

    SpringMVC ---- HelloWorld ---- 代码

    SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- Hello...

    SpringMVC-Mybatis-Shiro-redis

    在SpringMVC-Mybatis-Shiro-Redis体系中,Shiro负责用户登录验证、权限控制和会话管理。开发者可以方便地定义角色和权限,实现细粒度的访问控制,保障系统的安全性。 Redis则作为一个高性能的键值存储系统,常用于...

    SpringMVC-Mybatis-Shiro-redis-0.2-master

    基于SpringMVC Mybatis Shiro Redis 的权限管理系统,该系统已经部署到线上,线上访问地址:http://shiro.itboy.net,登录账号:admin 密码:sojson,,详细教程参考sojson.com/shiro

    SpringMVC-Mybatis-Shiro-redis-master

    【标题】"SpringMVC-Mybatis-Shiro-redis-master" 涉及的是一个集成框架项目,这个项目集成了四个关键的技术组件:SpringMVC、MyBatis、Shiro和Redis。这些技术在现代Java Web开发中扮演着重要角色。 **SpringMVC**...

    springMvc源码分析

    springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析

    SpringMVC精品资源--JAX-RS &amp; SpringMVC supported maven buil.zip

    SpringMVC和JAX-RS是两种在Java世界中广泛使用的Web开发框架,它们都用于构建RESTful服务,但有着不同的设计哲学和技术实现。这个压缩包"SpringMVC精品资源--JAX-RS & SpringMVC supported maven build.zip"显然是一...

    SpringMVC4教程-.pptx

    SpringMVC4教程-.pptx SpringMVC4教程-.pptx SpringMVC4教程-.pptx SpringMVC4教程-.pptx SpringMVC4教程-.pptx

    基于springboot+springmvc+mybatis-plus的微信小程序美容预约平台源码.zip

    基于springboot+springmvc+mybatis-plus的微信小程序美容预约平台源码.zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、...

    springmvc-base-input-02.rar

    在 "springmvc-base-input-02" 这个项目中,我们很可能会看到如何处理用户输入和请求的进阶知识。 在 Spring MVC 中,`pom.xml` 文件是 Maven 项目的配置文件,它定义了项目的依赖关系。在这个项目中,`pom.xml` ...

    SpringMVC-Mybatis-Shiro-redis-0.2_baichengzhou.tar.gz

    《SpringMVC-Mybatis-Shiro-Redis整合实践详解》 在现代Web开发中,...通过分析源码,开发者可以深入理解每个组件的功能以及它们如何协同工作,从而在自己的项目中更好地应用这些技术,提升项目的质量和效率。

    springmvc-base-quick.rar

    "springmvc-base-quick.rar" 包含了快速上手 Spring MVC 的基本项目结构和配置文件,是学习和理解 Spring MVC 的良好起点。 1. **项目结构解析:** - `springmvc-base-quick.iml`:这是 IntelliJ IDEA 项目的配置...

    SpringMVC精品资源--JAX-RS &amp; SpringMVC supported gradle bui.zip

    【标题】"SpringMVC精品资源--JAX-RS & SpringMVC supported gradle bui.zip" 提供的是一份关于使用Gradle构建支持JAX-RS和SpringMVC的项目资源。这涉及到两个关键的技术栈:SpringMVC,一个用于构建Web应用程序的...

    springmvc_exception-1.0-SNAPSHOT.war

    SpringMVC文件上传war包

    springmvc-maven-webapp-helloworld 源码

    通过分析这个"springmvc-maven-webapp-helloworld"项目,我们可以深入理解每个组件的作用,以及它们如何协同工作来构建一个完整的Web应用程序。同时,这也是一个很好的起点,可以帮助开发者逐步掌握SpringMVC、Maven...

    springmvc-high-other-05.rar

    本资料"springmvc-high-other-05.rar"着重探讨了SpringMVC的一些高级特性和用法,特别是那些不太常见但对提升应用性能和可维护性至关重要的特性。 1. **POM.xml配置解析**:在"pom.xml"文件中,我们可以看到项目...

    SpringMVC精品资源--SpringMVC+Mybatis 脚手架.zip

    SpringMVC和Mybatis是Java开发中非常流行的两个框架,它们在企业级Web应用开发中起着关键作用。SpringMVC作为Spring框架的一部分,主要负责处理HTTP请求和响应,而Mybatis则是一个轻量级的持久层框架,专注于数据库...

    SpringMvc和jquery-easyui项目

    SpringMvc和jquery-easyui项目,里边包含easyui的官方例子及中文文档

    maven-springmvc-mybatis-memcached

    【标题】"maven-springmvc-mybatis-memcached"是一个基于Maven、SpringMVC、MyBatis和Memcached的项目示例。这个项目整合了这些技术,为开发高效、可扩展的Web应用程序提供了基础架构。 【描述】"maven-springmvc-...

    springmvc-mongodb-maven结合

    在"springmvc-mongodb-maven结合"的项目中,Maven确保了SpringMVC、MongoDB驱动以及其他任何依赖的正确版本和配置。 **Spring与MongoDB的集成**: 集成SpringMVC和MongoDB时,首先需要在pom.xml中添加MongoDB的Java...

Global site tag (gtag.js) - Google Analytics