Diferença entre os atributos modelAttribute e commandName na tag de formulário na primavera?

92

No Spring 3, eu vi dois atributos diferentes na tag form em jsp

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

neste, o atributo modelAttribute é o nome do objeto de formulário cujas propriedades são usadas para preencher o formulário. E eu usei para postar um formulário e no controlador eu usei @ModelAttributepara capturar valor, chamando validador, aplicando lógica de negócios. Está tudo bem aqui. Agora

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

O que é esperado por este atributo, é também um objeto de formulário cujas propriedades iremos preencher?

Pulkit
fonte

Respostas:

127

Se você olhar para o código-fonte de FormTag(4.3.x), que dá suporte ao seu <form>elemento, você notará isso

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

Ambos se referem ao mesmo campo, tendo assim o mesmo efeito.

Mas, como indica o nome do campo, modelAttributedeve-se dar preferência, como outros também apontaram.

Sotirios Delimanolis
fonte
1
Boa! Como você descobriu o nome da classe relacionada à tag from?
Sanghyun Lee,
11
@Sangdol Convencionalmente, a classe é apenas chamada <tag-name>Tag. Para o nome de classe totalmente qualificado, abra a biblioteca ( .jar) que contém a tag, spring-webneste caso. Abaixo META-INF, você encontrará spring-form.tld. Ele terá uma <tag>entrada para formcom um <tag-class>de org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis 01 de
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
fonte
13

Eu tive a mesma pergunta há um tempo atrás, não consigo me lembrar das diferenças exatas, mas pela pesquisa eu verifiquei que commandNameera a maneira antiga de fazer isso e em novos aplicativos você deve usarmodelAttribute

Jax
fonte
1

commandName = nome de uma variável no escopo da solicitação ou escopo da sessão que contém as informações sobre este formulário, ou este é o modelo para esta visão. Tt deveria ser um estado.

Krishan Kansal
fonte
-3

Na configuração baseada em xml, usaremos a classe de comando para passar um objeto entre o controlador e as visualizações. Agora, na anotação que estamos usando modelattribute.

Thiyagu
fonte