/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.ui;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.core.Conventions;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

Implementation of Map for use when building model data for use with UI tools. Supports chained calls and generation of model attribute names.

This class serves as generic model holder for Servlet MVC but is not tied to it. Check out the Model interface for an interface variant.

Author:Rob Harrop, Juergen Hoeller
See Also:
Since:2.0
/** * Implementation of {@link java.util.Map} for use when building model data for use * with UI tools. Supports chained calls and generation of model attribute names. * * <p>This class serves as generic model holder for Servlet MVC but is not tied to it. * Check out the {@link Model} interface for an interface variant. * * @author Rob Harrop * @author Juergen Hoeller * @since 2.0 * @see Conventions#getVariableName * @see org.springframework.web.servlet.ModelAndView */
@SuppressWarnings("serial") public class ModelMap extends LinkedHashMap<String, Object> {
Construct a new, empty ModelMap.
/** * Construct a new, empty {@code ModelMap}. */
public ModelMap() { }
Construct a new ModelMap containing the supplied attribute under the supplied name.
See Also:
/** * Construct a new {@code ModelMap} containing the supplied attribute * under the supplied name. * @see #addAttribute(String, Object) */
public ModelMap(String attributeName, @Nullable Object attributeValue) { addAttribute(attributeName, attributeValue); }
Construct a new ModelMap containing the supplied attribute. Uses attribute name generation to generate the key for the supplied model object.
See Also:
/** * Construct a new {@code ModelMap} containing the supplied attribute. * Uses attribute name generation to generate the key for the supplied model * object. * @see #addAttribute(Object) */
public ModelMap(Object attributeValue) { addAttribute(attributeValue); }
Add the supplied attribute under the supplied name.
Params:
  • attributeName – the name of the model attribute (never null)
  • attributeValue – the model attribute value (can be null)
/** * Add the supplied attribute under the supplied name. * @param attributeName the name of the model attribute (never {@code null}) * @param attributeValue the model attribute value (can be {@code null}) */
public ModelMap addAttribute(String attributeName, @Nullable Object attributeValue) { Assert.notNull(attributeName, "Model attribute name must not be null"); put(attributeName, attributeValue); return this; }
Add the supplied attribute to this Map using a generated name.

Note: Empty Collections are not added to the model when using this method because we cannot correctly determine the true convention name. View code should check for null rather than for empty collections as is already done by JSTL tags.

Params:
  • attributeValue – the model attribute value (never null)
/** * Add the supplied attribute to this {@code Map} using a * {@link org.springframework.core.Conventions#getVariableName generated name}. * <p><i>Note: Empty {@link Collection Collections} are not added to * the model when using this method because we cannot correctly determine * the true convention name. View code should check for {@code null} rather * than for empty collections as is already done by JSTL tags.</i> * @param attributeValue the model attribute value (never {@code null}) */
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); }
Copy all attributes in the supplied Collection into this Map, using attribute name generation for each element.
See Also:
/** * Copy all attributes in the supplied {@code Collection} into this * {@code Map}, using attribute name generation for each element. * @see #addAttribute(Object) */
public ModelMap addAllAttributes(@Nullable Collection<?> attributeValues) { if (attributeValues != null) { for (Object attributeValue : attributeValues) { addAttribute(attributeValue); } } return this; }
Copy all attributes in the supplied Map into this Map.
See Also:
/** * Copy all attributes in the supplied {@code Map} into this {@code Map}. * @see #addAttribute(String, Object) */
public ModelMap addAllAttributes(@Nullable Map<String, ?> attributes) { if (attributes != null) { putAll(attributes); } return this; }
Copy all attributes in the supplied Map into this Map, with existing objects of the same name taking precedence (i.e. not getting replaced).
/** * Copy all attributes in the supplied {@code Map} into this {@code Map}, * with existing objects of the same name taking precedence (i.e. not getting * replaced). */
public ModelMap mergeAttributes(@Nullable Map<String, ?> attributes) { if (attributes != null) { attributes.forEach((key, value) -> { if (!containsKey(key)) { put(key, value); } }); } return this; }
Does this model contain an attribute of the given name?
Params:
  • attributeName – the name of the model attribute (never null)
Returns:whether this model contains a corresponding attribute
/** * Does this model contain an attribute of the given name? * @param attributeName the name of the model attribute (never {@code null}) * @return whether this model contains a corresponding attribute */
public boolean containsAttribute(String attributeName) { return containsKey(attributeName); } }