¿Diferencia entre los atributos modelAttribute y commandName en la etiqueta de formulario en primavera?

92

En Spring 3, he visto dos atributos diferentes en la etiqueta de formulario en jsp

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

en este, el atributo modelAttribute es el nombre del objeto de formulario cuyas propiedades se utilizan para completar el formulario. Y lo usé para publicar un formulario y en el controlador que he usado @ModelAttributepara capturar valor, llamar al validador, aplicar la lógica comercial. Todo está bien aquí. Ahora

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

¿Qué se espera de este atributo, es también un objeto de formulario cuyas propiedades vamos a poblar?

Pulkit
fuente

Respuestas:

127

Si observa el código fuente de FormTag(4.3.x) que respalda su <form>elemento, notará esto

/**
 * 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 refieren al mismo campo, por lo que tienen el mismo efecto.

Pero, como indica el nombre del campo, modelAttributedebería preferirse, como también han señalado otros.

Sotirios Delimanolis
fuente
1
¡Bueno! ¿Cómo averiguaste el nombre de la clase relacionada con la etiqueta from?
Sanghyun Lee
11
@Sangdol Convencionalmente, la clase simplemente se llama <tag-name>Tag. Para obtener el nombre de clase completo, abra la biblioteca ( .jar) que contiene la etiqueta, spring-weben este caso. Debajo META-INF, encontrarás spring-form.tld. Tendrá una <tag>entrada para formcon una <tag-class>de org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis
18

VIEJA MANERA = 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
fuente
13

Hace un tiempo tuve la misma pregunta, no puedo recordar las diferencias exactas, pero de la investigación descubrí que esa commandNameera la forma antigua de hacerlo y en las nuevas aplicaciones que deberías usarmodelAttribute

jax
fuente
1

commandName = nombre de una variable en el alcance de la solicitud o el alcance de la sesión que contiene la información sobre este formulario, o este es el modelo para esta vista. Debería ser un estado.

krishan kansal
fuente
-3

En la configuración basada en xml, usaremos la clase de comando para pasar un objeto entre el controlador y las vistas. Ahora en la anotación estamos usando modelattribute.

Thiyagu
fuente