diff --git a/build-spring-framework/resources/changelog.txt b/build-spring-framework/resources/changelog.txt index e7e92dd5ddd..3124b3bee26 100644 --- a/build-spring-framework/resources/changelog.txt +++ b/build-spring-framework/resources/changelog.txt @@ -19,6 +19,7 @@ Changes in version 3.1 RC2 (2011-11-15) * Support target request with multiple parameter values in FlahMap matching logic * Fix issue in SimpleMappingExceptionResolver causing exception when setting "statusCodes" property * The Form input tag allows type values other than "text" such as HTML5-specific types. +* The Form hidden tag supports "disabled" attribute Changes in version 3.1 RC1 (2011-10-11) --------------------------------------- diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/HiddenInputTag.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/HiddenInputTag.java index c6c639b669c..1afec35d8a7 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/HiddenInputTag.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/HiddenInputTag.java @@ -35,6 +35,28 @@ import javax.servlet.jsp.JspException; @SuppressWarnings("serial") public class HiddenInputTag extends AbstractHtmlElementTag { + /** + * The name of the 'disabled' attribute. + */ + public static final String DISABLED_ATTRIBUTE = "disabled"; + + private String disabled; + + /** + * Get the value of the 'disabled' attribute. + */ + public String getDisabled() { + return this.disabled; + } + + /** + * Set the value of the 'disabled' attribute. + * May be a runtime expression. + */ + public void setDisabled(String disabled) { + this.disabled = disabled; + } + /** * Flags "type" as an illegal dynamic attribute. */ @@ -54,10 +76,20 @@ public class HiddenInputTag extends AbstractHtmlElementTag { tagWriter.startTag("input"); writeDefaultAttributes(tagWriter); tagWriter.writeAttribute("type", "hidden"); + if (isDisabled()) { + tagWriter.writeAttribute(DISABLED_ATTRIBUTE, "disabled"); + } String value = getDisplayString(getBoundValue(), getPropertyEditor()); tagWriter.writeAttribute("value", processFieldValue(getName(), value, "hidden")); tagWriter.endTag(); return SKIP_BODY; } - + + /** + * Is the current HTML tag disabled? + */ + protected boolean isDisabled() throws JspException { + return evaluateBoolean(DISABLED_ATTRIBUTE, getDisabled()); + } + } diff --git a/org.springframework.web.servlet/src/main/resources/META-INF/spring-form.tld b/org.springframework.web.servlet/src/main/resources/META-INF/spring-form.tld index ca61de04fd9..1520a686041 100644 --- a/org.springframework.web.servlet/src/main/resources/META-INF/spring-form.tld +++ b/org.springframework.web.servlet/src/main/resources/META-INF/spring-form.tld @@ -652,6 +652,12 @@ false true + + HTML Optional Attribute. Setting the value of this attribute to 'true' (without the quotes) will disable the HTML element. + disabled + false + true + HTML Event Attribute onclick diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/HiddenInputTagTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/HiddenInputTagTests.java index 6b842f2c5de..915be9e2b4a 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/HiddenInputTagTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/HiddenInputTagTests.java @@ -16,12 +16,12 @@ package org.springframework.web.servlet.tags.form; -import org.springframework.beans.TestBean; -import org.springframework.validation.BeanPropertyBindingResult; - import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.Tag; +import org.springframework.beans.TestBean; +import org.springframework.validation.BeanPropertyBindingResult; + /** * @author Rob Harrop */ @@ -31,6 +31,7 @@ public class HiddenInputTagTests extends AbstractFormTagTests { private TestBean bean; + @SuppressWarnings("serial") protected void onSetUp() { this.tag = new HiddenInputTag() { protected TagWriter createTagWriter() { @@ -52,6 +53,7 @@ public class HiddenInputTagTests extends AbstractFormTagTests { assertContainsAttribute(output, "type", "hidden"); assertContainsAttribute(output, "value", "Sally Greenwood"); + assertAttributeNotPresent(output, "disabled"); } public void testWithCustomBinder() throws Exception { @@ -82,6 +84,34 @@ public class HiddenInputTagTests extends AbstractFormTagTests { } } + public void testDisabledTrue() throws Exception { + this.tag.setDisabled("true"); + + this.tag.doStartTag(); + this.tag.doEndTag(); + + String output = getOutput(); + assertTagOpened(output); + assertTagClosed(output); + + assertContainsAttribute(output, "disabled", "disabled"); + } + + // SPR-8661 + + public void testDisabledFalse() throws Exception { + this.tag.setDisabled("false"); + + this.tag.doStartTag(); + this.tag.doEndTag(); + + String output = getOutput(); + assertTagOpened(output); + assertTagClosed(output); + + assertAttributeNotPresent(output, "disabled"); + } + private void assertTagClosed(String output) { assertTrue(output.endsWith("/>")); }