100

In Spring 3, I have seen two different attribute in form tag in jsp

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

in this the attribute modelAttribute is the name of the form object whose properties are used to populate the form. And I used it in posting a form and in controller I have used @ModelAttribute to capture value, calling validator, applying business logic. Everything is fine here. Now

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

What is expected by this attribute, is it also a form object whose properties we are going to populate?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Pulkit
  • 3,953
  • 6
  • 31
  • 55

5 Answers5

133

If you look at the source code of FormTag (4.3.x) which backs your <form> element, you'll notice this

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

They are both referring to the same field, thus having same effect.

But, as the field name indicates, modelAttribute should be preferred, as others have also pointed out.

Sotirios Delimanolis
  • 274,122
  • 60
  • 696
  • 724
  • 2
    Good! How did you find out the name the class related to the from tag? – Sanghyun Lee Oct 01 '14 at 07:02
  • 12
    @Sangdol Conventionally, the class is just called `Tag`. For the fully qualified class name, open the library (`.jar`) containing the tag, `spring-web` in this case. Under `META-INF`, you'll find `spring-form.tld`. It'll have a `` entry for `form` with a `` of `org.springframework.web.servlet.tags.form.FormTag`. – Sotirios Delimanolis Oct 01 '14 at 14:22
25

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
  • 2,099
  • 1
  • 20
  • 11
14

I had the same question a while ago, I can't remember the exact differences but from research I ascertained that commandName was the old way of doing it and in new applications you should be using modelAttribute

jax
  • 37,735
  • 57
  • 182
  • 278
1

commandName = name of a variable in the request scope or session scope that contains the information about this form,or this is model for this view. Tt should be a been.

-3

In xml based config, we will use command class to pass an object between controller and views. Now in annotation we are using modelattribute.

Bartłomiej Semańczyk
  • 59,234
  • 49
  • 233
  • 358