Różnica między atrybutami modelAttribute i commandName w tagu formularza na wiosnę?

92

Wiosną 3 widziałem dwa różne atrybuty w tagu formularza w jsp

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

w tym przypadku atrybut modelAttribute jest nazwą obiektu formularza, którego właściwości są używane do wypełniania formularza. I użyłem go do wysłania formularza i kontrolera, którego używałem @ModelAttributedo przechwytywania wartości, wywoływania walidatora, stosowania logiki biznesowej. Tutaj wszystko wporządku. Teraz

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

Czego oczekuje ten atrybut, czy jest to również obiekt formularza, którego właściwości zamierzamy wypełnić?

Pulkit
źródło

Odpowiedzi:

127

Jeśli spojrzysz na kod źródłowy FormTag(4.3.x), który wspiera twój <form>element, zauważysz to

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

Oba odnoszą się do tej samej dziedziny, a zatem mają ten sam efekt.

Ale, jak wskazuje nazwa pola, modelAttributepowinno być preferowane, jak zauważyli inni.

Sotirios Delimanolis
źródło
1
Dobry! Jak poznałeś nazwę klasy związanej z tagiem from?
Sanghyun Lee
11
@Sangdol Tradycyjnie klasa jest po prostu wywoływana <tag-name>Tag. Aby uzyskać w pełni kwalifikowaną nazwę klasy, otwórz bibliotekę ( .jar) zawierającą znacznik, spring-webw tym przypadku. Poniżej META-INFznajdziesz spring-form.tld. Będzie mieć <tag>wpis formz <tag-class>o org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis
18

OLD WAY = nazwa_polecenia

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

NOWY SPOSÓB = modelAttribute

..
<spring:url value="/manage/add.do" var="action" />
    <form:form action="${action}" modelAttribute="employee">
        <div>
            <table>
..
diego matos - keke
źródło
13

Miałem to samo pytanie jakiś czas temu, nie pamiętam dokładnych różnic, ale z badań ustaliłem, że commandNamebył to stary sposób robienia tego i w nowych aplikacjach powinieneś używaćmodelAttribute

jax
źródło
1

nazwa_polecenia = nazwa zmiennej w zakresie żądania lub zasięgu sesji, która zawiera informacje o tym formularzu lub jest to model dla tego widoku. Powinien być.

krishan kansal
źródło
-3

W konfiguracji opartej na XML użyjemy klasy poleceń do przekazania obiektu między kontrolerem a widokami. Teraz w adnotacji używamy modelattribute.

Thiyagu
źródło