web-dev-qa-db-fra.com

Différence entre les attributs modelAttribute et commandName dans une balise de formulaire au printemps?

Au printemps 3, j'ai vu deux attributs différents dans une balise de formulaire dans jsp

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

dans cet 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 poster un formulaire et dans le contrôleur, j'ai utilisé @ModelAttribute pour capturer une valeur, appeler un validateur, appliquer une logique métier. Tout va bien ici. Maintenant

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

Qu'attend cet attribut? S'agit-il également d'un objet de formulaire dont nous allons renseigner les propriétés?

89
Pulkit

Si vous regardez le code source de FormTag (4.3.x) qui sauvegarde 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 font tous les deux référence au même champ, ayant ainsi le même effet.

Mais, comme le nom du champ l'indique, il faut préférer modelAttribute, comme d'autres l'ont également souligné.

123

OLD WAY = nomCommande

...
<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>
..
16
diego matos - keke

J'avais la même question il y a quelque temps, je ne me souviens pas des différences exactes, mais d'après des recherches, j'ai constaté que commandName était l'ancienne manière de procéder. Dans les nouvelles applications, vous devriez utiliser modelAttribute

13
jax

commandName = nom d'une variable de la portée de la demande ou de la session contenant les informations relatives à ce formulaire ou modèle pour cette vue. Cela devrait être un été.

1
krishan kansal