Разница между атрибутами modelAttribute и commandName в теге формы весной?

92

В Spring 3 я видел два разных атрибута в теге формы в jsp

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

в этом атрибуте modelAttribute - это имя объекта формы, свойства которого используются для заполнения формы. И я использовал его при публикации формы и в контроллере, который я использовал @ModelAttributeдля захвата значения, вызова валидатора, применения бизнес-логики. Здесь все хорошо. Сейчас же

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

Что ожидается от этого атрибута, является ли он также объектом формы, свойства которого мы собираемся заполнить?

Pulkit
источник

Ответы:

127

Если вы посмотрите исходный код FormTag(4.3.x), который поддерживает ваш <form>элемент, вы заметите это

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

Они оба относятся к одному и тому же полю, поэтому имеют одинаковый эффект.

Но, как указывает название поля, modelAttributeследует предпочесть, как также указывали другие.

Сотириос Делиманолис
источник
1
Хороший! Как вы узнали название класса, связанного с тегом from?
Санхён Ли 01
11
@Sangdol Обычно класс просто вызывается <tag-name>Tag. В этом случае для получения полного имени класса откройте библиотеку ( .jar), содержащую тег spring-web. Под META-INFвы найдете spring-form.tld. Это будет иметь <tag>запись formс <tag-class>из org.springframework.web.servlet.tags.form.FormTag.
Сотириос Делиманолис 01
18

СТАРЫЙ СПОСОБ = имя команды

...
<spring:url value="/manage/add.do" var="action" />
    <form:form action="${action}" commandName="employee">
        <div>
            <table>
....

НОВЫЙ ПУТЬ = атрибут модели

..
<spring:url value="/manage/add.do" var="action" />
    <form:form action="${action}" modelAttribute="employee">
        <div>
            <table>
..
Диего Матос - Кеке
источник
13

Некоторое время назад у меня был тот же вопрос, я не могу вспомнить точных различий, но из исследования я установил, что это commandNameбыл старый способ сделать это, и в новых приложениях вы должны использоватьmodelAttribute

Джакс
источник
1

commandName = имя переменной в области запроса или области сеанса, которая содержит информацию об этой форме, или это модель для этого представления. Это должно быть так.

Кришан Кансал
источник
-3

В конфигурации на основе xml мы будем использовать класс команды для передачи объекта между контроллером и представлениями. Теперь в аннотации мы используем modelattribute.

Тиягу
источник