diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java index 2b745e8c097612c1126ea55252c9e327f3a0a52b..271def7c575e7fd4b4a0b5bcd0f7e1140ad09d8e 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/tags/form/FormTag.java @@ -423,6 +423,15 @@ public class FormTag extends AbstractHtmlElementTag { @Override public int doEndTag() throws JspException { this.tagWriter.endTag(); + return EVAL_PAGE; + } + + /** + * Clears the stored {@link TagWriter}. + */ + @Override + public void doFinally() { + super.doFinally(); this.pageContext.removeAttribute(MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE); this.pageContext.removeAttribute(COMMAND_NAME_VARIABLE_NAME, PageContext.REQUEST_SCOPE); if (this.previousNestedPath != null) { @@ -433,15 +442,6 @@ public class FormTag extends AbstractHtmlElementTag { // Remove exposed nestedPath value. this.pageContext.removeAttribute(NESTED_PATH_VARIABLE_NAME, PageContext.REQUEST_SCOPE); } - return EVAL_PAGE; - } - - /** - * Clears the stored {@link TagWriter}. - */ - @Override - public void doFinally() { - super.doFinally(); this.tagWriter = null; this.previousNestedPath = null; } diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java index 892dd373e55040748432bc1b4ad118af61724f0f..54175918a3876db3762c4d9056518daefe7c1034 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java @@ -253,6 +253,16 @@ public class FormTagTests extends AbstractHtmlElementTagTests { assertContainsAttribute(inputOutput, "type", "hidden"); } + public void testClearAttributesOnFinally() throws Exception { + this.tag.setModelAttribute("model"); + getPageContext().setAttribute("model", "foo bar"); + assertNull(getPageContext().getAttribute(FormTag.MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE)); + this.tag.doStartTag(); + assertNotNull(getPageContext().getAttribute(FormTag.MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE)); + this.tag.doFinally(); + assertNull(getPageContext().getAttribute(FormTag.MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE)); + } + private String getFormTag(String output) { int inputStart = output.indexOf("<", 1); int inputEnd = output.lastIndexOf(">", output.length() - 2);