ความแตกต่างระหว่างแอตทริบิวต์ modelAttribute และ commandName ในแท็กฟอร์มในฤดูใบไม้ผลิ


92

ใน Spring 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
@ แสงดลอัตภาพชั้นเพิ่งเรียก<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

OLD WAY = 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 = ชื่อของตัวแปรในขอบเขตการร้องขอหรือขอบเขตเซสชันที่มีข้อมูลเกี่ยวกับฟอร์มนี้หรือนี่คือโมเดลสำหรับมุมมองนี้ Tt ควรจะเป็น


-3

ในการกำหนดค่าตาม xml เราจะใช้คลาสคำสั่งเพื่อส่งผ่านวัตถุระหว่างคอนโทรลเลอร์และมุมมอง modelattributeตอนนี้ในบันทึกย่อเราจะใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.