Unterschied zwischen den Attributen modelAttribute und commandName im Formular-Tag im Frühjahr?


92

In Spring 3 habe ich zwei verschiedene Attribute im Formular-Tag in jsp gesehen

<form:form method="post" modelAttribute="login">

In diesem Fall ist das Attribut modelAttribute der Name des Formularobjekts, dessen Eigenschaften zum Auffüllen des Formulars verwendet werden. Und ich habe es beim Posten eines Formulars und im Controller verwendet @ModelAttribute, um Werte zu erfassen, Validator aufzurufen und Geschäftslogik anzuwenden. Alles ist gut hier. Jetzt

<form:form method="post" commandName="login">

Was wird von diesem Attribut erwartet? Ist es auch ein Formularobjekt, dessen Eigenschaften wir füllen werden?

Antworten:


127

Wenn Sie sich den Quellcode von FormTag(4.3.x) ansehen, der Ihr <form>Element unterstützt, werden Sie dies bemerken

/**
 * Set the name of the form attribute in the model.
 * <p>May be a runtime expression.
 */
public void setModelAttribute(String modelAttribute) {
    this.modelAttribute = modelAttribute;
}

/**
 * Get the name of the form attribute in the model.
 */
protected String getModelAttribute() {
    return this.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;
}

/**
 * Get the name of the form attribute in the model.
 * @see #getModelAttribute
 */
protected String getCommandName() {
    return this.modelAttribute;
}

Sie beziehen sich beide auf dasselbe Feld und haben somit dieselbe Wirkung.

Wie der Feldname schon sagt, modelAttributesollte dies jedoch bevorzugt werden, wie auch andere betont haben.


1
Gut! Wie haben Sie den Namen der Klasse herausgefunden, der sich auf das from-Tag bezieht?
Sanghyun Lee

11
@ Sangdol Herkömmlicherweise wird die Klasse nur aufgerufen <tag-name>Tag. Öffnen Sie für den vollständig qualifizierten Klassennamen in diesem Fall die Bibliothek ( .jar), die das Tag enthält spring-web. Unter META-INFfinden Sie spring-form.tld. Es wird einen <tag>Eintrag für formmit einem <tag-class>von haben org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis

18

OLD WAY = Befehlsname

...
<spring:url value="/manage/add.do" var="action" />
    <form:form action="${action}" commandName="employee">
        <div>
            <table>
....

NEUER WEG = modelAttribute

..
<spring:url value="/manage/add.do" var="action" />
    <form:form action="${action}" modelAttribute="employee">
        <div>
            <table>
..

13

Ich hatte vor einiger Zeit die gleiche Frage, ich kann mich nicht an die genauen Unterschiede erinnern, aber aus der Forschung habe ich herausgefunden, dass dies commandNamedie alte Methode war und in neuen Anwendungen, die Sie verwenden solltenmodelAttribute


1

Befehlsname = Name einer Variablen im Anforderungs- oder Sitzungsbereich, die die Informationen zu diesem Formular enthält, oder dies ist ein Modell für diese Ansicht. Es sollte ein gewesen sein.


-3

In der XML-basierten Konfiguration verwenden wir die Befehlsklasse, um ein Objekt zwischen Controller und Ansichten zu übergeben. Jetzt in Annotation verwenden wir modelattribute.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.