Search code examples
formsspring-mvcmodelattribute

Difference between modelAttribute and commandName attributes in form tag in spring?


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?


Solution

  • 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.