Différence entre les attributs modelAttribute et commandName dans la balise form au printemps?

92

Au printemps 3, j'ai vu deux attributs différents dans la balise form dans jsp

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

dans ce cas, l'attribut modelAttribute est le nom de l'objet de formulaire dont les propriétés sont utilisées pour remplir le formulaire. Et je l'ai utilisé pour publier un formulaire et dans le contrôleur, j'ai utilisé @ModelAttributepour capturer la valeur, appeler validateur, appliquer la logique métier. Tout va bien ici. Maintenant

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

Qu'attend cet attribut, est-ce aussi un objet de formulaire dont nous allons renseigner les propriétés?

Pulkit
la source

Réponses:

127

Si vous regardez le code source de FormTag(4.3.x) qui soutient votre <form>élément, vous remarquerez ceci

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

Ils se réfèrent tous deux au même domaine, ayant ainsi le même effet.

Mais, comme le nom du champ l'indique, modelAttributedevrait être préféré, comme d'autres l'ont également souligné.

Sotirios Delimanolis
la source
1
Bien! Comment avez-vous trouvé le nom de la classe lié à la balise from?
Sanghyun Lee
11
@Sangdol Par convention, la classe est simplement appelée <tag-name>Tag. Pour le nom de classe complet, ouvrez la bibliothèque ( .jar) contenant la balise, spring-webdans ce cas. Sous META-INF, vous trouverez spring-form.tld. Il aura une <tag>entrée pour formavec un <tag-class>de org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis
18

OLD WAY = 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>
..
diego matos - keke
la source
13

J'ai eu la même question il y a quelque temps, je ne me souviens pas des différences exactes, mais à partir de recherches, j'ai constaté que commandNamec'était l'ancienne façon de le faire et que dans les nouvelles applications, vous devriez utilisermodelAttribute

jax
la source
1

commandName = nom d'une variable dans l'étendue de la demande ou l'étendue de session qui contient les informations sur ce formulaire, ou c'est le modèle pour cette vue. Ça devrait être un été.

krishan kansal
la source
-3

Dans la configuration basée sur xml, nous utiliserons la classe de commande pour passer un objet entre le contrôleur et les vues. Maintenant en annotation, nous utilisons modelattribute.

Thiyagu
la source