Open Source 的好處,翻 Source Code 去。
先看 spring-webmvc-3.1.2.RELEASE.jar\META-INF\spring-form.tld。
<attribute> <description>Name of the model attribute under which the form object is exposed. Defaults to 'command'.</description> <name>modelAttribute</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description>Name of the model attribute under which the form object is exposed. Defaults to 'command'.</description> <name>commandName</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute>這是唱雙簧嗎?除了名字不一樣,其他都一樣,再看看 org.springframework.web.servlet.tags.form.FormTag.java。
/**
* Set the name of the form attribute in the model.
* <p>May be a runtime expression.
*/
public void setModelAttribute(String modelAttribute) {
this.modelAttribute = modelAttribute;
}
/**
* Set the name of the form attribute in the model.
* <p>May be a runtime expression.
* @see #setModelAttribute
*/
public void setCommandName(String commandName) {
this.modelAttribute = commandName;
}
賓果,是一樣的東西,用 modelAttribue 就可以了。再多看一些 source code 確認一下。
public class FormTag extends AbstractHtmlElementTag {
/** The default HTTP method using which form values are sent to the server: "post" */
private static final String DEFAULT_METHOD = "post";
/** The default attribute name: "command" */
public static final String DEFAULT_COMMAND_NAME = "command";
/** The name of the '<code>modelAttribute</code>' setting */
private static final String MODEL_ATTRIBUTE = "modelAttribute";
/**
* The name of the {@link javax.servlet.jsp.PageContext} attribute under which the
* form object name is exposed.
*/
public static final String MODEL_ATTRIBUTE_VARIABLE_NAME =
Conventions.getQualifiedAttributeName(AbstractFormTag.class, MODEL_ATTRIBUTE);
// ...
private String modelAttribute = DEFAULT_COMMAND_NAME;
// ...
/**
* Writes the opening part of the block '<code>form</code>' tag and exposes
* the form object name in the {@link javax.servlet.jsp.PageContext}.
* @param tagWriter the {@link TagWriter} to which the form content is to be written
* @return {@link javax.servlet.jsp.tagext.Tag#EVAL_BODY_INCLUDE}
*/
@Override
protected int writeTagContent(TagWriter tagWriter) throws JspException {
// ...
// Expose the form object name for nested tags...
String modelAttribute = resolveModelAttribute();
this.pageContext.setAttribute(MODEL_ATTRIBUTE_VARIABLE_NAME, modelAttribute, PageContext.REQUEST_SCOPE);
this.pageContext.setAttribute(COMMAND_NAME_VARIABLE_NAME, modelAttribute, PageContext.REQUEST_SCOPE);
// ...
}
/**
* Clears the stored {@link TagWriter}.
*/
@Override
public void doFinally() {
// ...
this.pageContext.removeAttribute(MODEL_ATTRIBUTE_VARIABLE_NAME, PageContext.REQUEST_SCOPE);
this.pageContext.removeAttribute(COMMAND_NAME_VARIABLE_NAME, PageContext.REQUEST_SCOPE);
// ...
}
}
幾乎可以確認是完全一樣的東西。最後再看看 org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.java。
/**
* The name of the {@link javax.servlet.jsp.PageContext} attribute under which the
* command object name is exposed.
* @deprecated as of Spring 2.5, in favor of {@link FormTag#MODEL_ATTRIBUTE_VARIABLE_NAME}
*/
@Deprecated
public static final String COMMAND_NAME_VARIABLE_NAME =
Conventions.getQualifiedAttributeName(AbstractFormTag.class, "commandName");
已經 Deprecated 了,證明無誤。---
---
---
沒有留言:
張貼留言