All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.web.servlet.tags.form.CheckboxTag Maven / Gradle / Ivy

There is a newer version: 5.3.34
Show newest version
/*
 * Copyright 2002-2007 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.web.servlet.tags.form;

import java.util.Collection;

import javax.servlet.jsp.JspException;

import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.WebDataBinder;

/**
 * Databinding-aware JSP tag for rendering an HTML 'input'
 * element with a 'type' of 'checkbox'.
 *
 * 

May be used in one of three different approaches depending on the * type of the {@link #getValue bound value}. * *

Approach One

* When the bound value is of type {@link Boolean} then the 'input(checkbox)' * is marked as 'checked' if the bound value is true. The 'value' * attribute corresponds to the resolved value of the {@link #setValue(Object) value} property. *

Approach Two

* When the bound value is of type {@link Collection} then the 'input(checkbox)' * is marked as 'checked' if the configured {@link #setValue(Object) value} is present in * the bound {@link Collection}. *

Approach Three

* For any other bound value type, the 'input(checkbox)' is marked as 'checked' * if the the configured {@link #setValue(Object) value} is equal to the bound value. * * @author Rob Harrop * @author Juergen Hoeller * @since 2.0 */ public class CheckboxTag extends AbstractHtmlInputElementTag { private Object value; /** * Set the value of the 'value' attribute. * May be a runtime expression. */ public void setValue(Object value) { Assert.notNull(value, "'value' must not be null"); this.value = value; } /** * Get the value of the 'value' attribute. * May be a runtime expression. */ protected Object getValue() { return this.value; } /** * Writes the 'input(checkbox)' to the supplied {@link TagWriter}, * marking it as 'checked' if appropriate. */ protected int writeTagContent(TagWriter tagWriter) throws JspException { tagWriter.startTag("input"); writeDefaultAttributes(tagWriter); tagWriter.writeAttribute("type", "checkbox"); Object boundValue = getBoundValue(); Class valueType = getBindStatus().getValueType(); if (Boolean.class.equals(valueType) || boolean.class.equals(valueType)) { // the concrete type may not be a Boolean - can be String if (boundValue instanceof String) { boundValue = Boolean.valueOf((String) boundValue); } Boolean booleanValue = (boundValue != null ? (Boolean) boundValue : Boolean.FALSE); renderFromBoolean(booleanValue, tagWriter); } else { Object value = getValue(); if (value == null) { throw new IllegalArgumentException("Attribute 'value' is required when binding to non-boolean values"); } Object resolvedValue = (value instanceof String ? evaluate("value", (String) value) : value); if (boundValue != null && boundValue.getClass().isArray()) { renderFromCollection(resolvedValue, CollectionUtils.arrayToList(boundValue), tagWriter); } else if (boundValue instanceof Collection) { renderFromCollection(resolvedValue, (Collection) boundValue, tagWriter); } else { renderSingleValue(resolvedValue, tagWriter); } } tagWriter.endTag(); if (!isDisabled()) { // Write out the 'field was present' marker. tagWriter.startTag("input"); tagWriter.writeAttribute("type", "hidden"); tagWriter.writeAttribute("name", WebDataBinder.DEFAULT_FIELD_MARKER_PREFIX + getName()); tagWriter.writeAttribute("value", "on"); tagWriter.endTag(); } return EVAL_PAGE; } /** * Render the 'input(checkbox)' with the supplied value, marking the * 'input' element as 'checked' if the supplied value matches the * bound value. */ private void renderSingleValue(Object resolvedValue, TagWriter tagWriter) throws JspException { tagWriter.writeAttribute("value", getDisplayString(resolvedValue)); if (SelectedValueComparator.isSelected(getBindStatus(), resolvedValue)) { tagWriter.writeAttribute("checked", "checked"); } } /** * Render the 'input(checkbox)' with the supplied value, marking * the 'input' element as 'checked' if the supplied value is * present in the bound Collection value. */ private void renderFromCollection(Object resolvedValue, Collection boundValue, TagWriter tagWriter) throws JspException { tagWriter.writeAttribute("value", getDisplayString(resolvedValue)); if (SelectedValueComparator.isSelected(getBindStatus(), resolvedValue)) { tagWriter.writeAttribute("checked", "checked"); } } /** * Render the 'input(checkbox)' with the supplied value, marking * the 'input' element as 'checked' if the supplied Boolean is * true. */ private void renderFromBoolean(Boolean boundValue, TagWriter tagWriter) throws JspException { tagWriter.writeAttribute("value", "true"); if (boundValue.booleanValue()) { tagWriter.writeAttribute("checked", "checked"); } } /** * Return a unique ID for the bound name within the current PageContext. */ protected String autogenerateId() throws JspException { return TagIdGenerator.nextId(getName(), this.pageContext); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy