Різниця між атрибутами modelAttribute та commandName у тезі форми навесні?


92

Навесні 3 я побачив два різні атрибути у тезі форми в jsp

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

у цьому атрибут modelAttribute - це ім'я об'єкта форми, властивості якого використовуються для заповнення форми. І я використовував його при розміщенні форми та в контролері, який використовував @ModelAttributeдля фіксації значення, виклику валідатора, застосування бізнес-логіки. Тут все гаразд. Зараз

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

Що очікується від цього атрибуту, це також об’єкт форми, властивості якого ми збираємось заповнити?

Відповіді:


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?
Sanghyun Lee

11
@Sangdol Звичайно клас просто називається <tag-name>Tag. Для повного імені класу відкрийте бібліотеку ( .jar), що містить тег, spring-webу цьому випадку. Знизу META-INFти знайдеш spring-form.tld. Це буде мати <tag>запис formз <tag-class>з org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis

18

СТАРИЙ ШЛЯХ = commandName

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

НОВИЙ ШЛЯХ = modelAttribute

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

13

У мене було те саме питання деякий час тому, я не пам'ятаю точних відмінностей, але під час досліджень я переконався, що це commandNameбув старий спосіб зробити це, і в нових додатках, які ви повинні використовуватиmodelAttribute


1

commandName = ім'я змінної в області запиту або області сеансу, яка містить інформацію про цю форму, або це модель для цього подання. Тт повинно бути.


-3

У конфігурації на основі xml ми будемо використовувати командний клас для передачі об'єкта між контролером та поданнями. Зараз в анотації ми використовуємо modelattribute.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.