Differenza tra gli attributi modelAttribute e commandName nel tag del modulo in primavera?


92

Nella primavera 3, ho visto due diversi attributi nel tag form in jsp

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

in questo l'attributo modelAttribute è il nome dell'oggetto form le cui proprietà vengono utilizzate per popolare il form. E l'ho usato nella pubblicazione di un modulo e nel controller che ho usato @ModelAttributeper acquisire valore, chiamare il validatore, applicare la logica aziendale. Va tutto bene qui. Adesso

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

Cosa ci si aspetta da questo attributo, è anche un oggetto modulo le cui proprietà andremo a popolare?

Risposte:


127

Se guardi il codice sorgente di FormTag(4.3.x) che supporta il tuo <form>elemento, noterai questo

/**
 * 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;
}

Si riferiscono entrambi allo stesso campo, quindi hanno lo stesso effetto.

Ma, come indica il nome del campo, modelAttributedovrebbe essere preferito, come anche altri hanno sottolineato.


1
Buona! Come hai scoperto il nome della classe relativa al tag from?
Sanghyun Lee

11
@Sangdol Convenzionalmente, la classe viene semplicemente chiamata <tag-name>Tag. Per il nome completo della classe .jar, spring-webin questo caso apri la libreria ( ) contenente il tag . Sotto META-INF, troverai spring-form.tld. Avrà una <tag>voce per formcon un <tag-class>di org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis

18

VECCHIO MODO = commandName

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

NEW WAY = modelAttribute

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

13

Ho avuto la stessa domanda qualche tempo fa, non ricordo le differenze esatte ma dalla ricerca ho accertato che commandNameera il vecchio modo di farlo e nelle nuove applicazioni dovresti usaremodelAttribute


1

commandName = nome di una variabile nell'ambito della richiesta o nell'ambito della sessione che contiene le informazioni su questo modulo o questo è il modello per questa vista. Dovrebbe essere stato.


-3

Nella configurazione basata su xml, useremo la classe di comando per passare un oggetto tra il controller e le viste. Ora nell'annotazione che stiamo usando modelattribute.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.