Perbedaan antara atribut modelAttribute dan commandName dalam tag formulir di musim semi?

92

Di Spring 3, saya telah melihat dua atribut berbeda dalam tag formulir di jsp

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

dalam atribut modelAttribute adalah nama objek formulir yang propertinya digunakan untuk mengisi formulir. Dan saya menggunakannya dalam memposting formulir dan dalam pengontrol saya telah digunakan @ModelAttributeuntuk menangkap nilai, memanggil validator, menerapkan logika bisnis. Semua baik-baik saja disini. Sekarang

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

Apa yang diharapkan dari atribut ini, apakah itu juga objek formulir yang propertinya akan kita isi?

Pulkit
sumber

Jawaban:

127

Jika Anda melihat kode sumber FormTag(4.3.x) yang mendukung <form>elemen Anda, Anda akan melihat ini

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

Keduanya mengacu pada bidang yang sama, sehingga memiliki efek yang sama.

Tapi, seperti yang ditunjukkan oleh nama bidang, modelAttributeharus lebih disukai, seperti yang juga ditunjukkan orang lain.

Sotirios Delimanolis
sumber
1
Baik! Bagaimana Anda mengetahui nama kelas yang terkait dengan tag from?
Sanghyun Lee
11
@Sangdol Secara konvensional, kelasnya disebut saja <tag-name>Tag. Untuk nama kelas yang sepenuhnya memenuhi syarat, buka library ( .jar) yang berisi tag, spring-webdalam kasus ini. Di bawah META-INF, Anda akan menemukan spring-form.tld. Ini akan memiliki <tag>entri untuk formdengan <tag-class>dari org.springframework.web.servlet.tags.form.FormTag.
Sotirios Delimanolis
18

LAMA CARA = commandName

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

CARA BARU = modelAttribute

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

Saya memiliki pertanyaan yang sama beberapa waktu yang lalu, saya tidak dapat mengingat perbedaan persisnya tetapi dari penelitian saya memastikan bahwa commandNameitu adalah cara lama untuk melakukannya dan dalam aplikasi baru yang harus Anda gunakanmodelAttribute

jax
sumber
1

commandName = nama variabel dalam cakupan permintaan atau cakupan sesi yang berisi informasi tentang formulir ini, atau ini adalah model untuk tampilan ini. Tt harus menjadi.

krishan kansal
sumber
-3

Dalam konfigurasi berbasis xml, kita akan menggunakan kelas perintah untuk melewatkan objek antara pengontrol dan tampilan. Sekarang dalam penjelasan yang kami gunakan modelattribute.

Thiyagu
sumber