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("/>"));
}