Sự khác biệt giữa các thuộc tính modelAttribute và commandName trong thẻ biểu mẫu vào mùa xuân?


92

Trong Spring 3, tôi đã thấy hai thuộc tính khác nhau trong thẻ biểu mẫu trong jsp

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

trong đó thuộc tính modelAttribute là tên của đối tượng biểu mẫu có các thuộc tính được sử dụng để điền biểu mẫu. Và tôi đã sử dụng nó trong việc đăng một biểu mẫu và trong bộ điều khiển, tôi đã sử dụng @ModelAttributeđể nắm bắt giá trị, gọi trình xác nhận, áp dụng logic kinh doanh. Mọi thứ đều ổn ở đây. Hiện nay

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

Điều gì được mong đợi bởi thuộc tính này, nó cũng là một đối tượng biểu mẫu có các thuộc tính mà chúng ta sẽ điền vào?

Câu trả lời:


127

Nếu bạn nhìn vào mã nguồn của FormTag(4.3.x) hỗ trợ <form>phần tử của bạn , bạn sẽ nhận thấy điều này

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

Cả hai đều đề cập đến cùng một trường, do đó có cùng tác dụng.

Tuy nhiên, như tên trường chỉ ra, modelAttributenên được ưu tiên hơn, như những người khác cũng đã chỉ ra.


1
Tốt! Làm thế nào bạn tìm ra tên lớp liên quan đến thẻ from?
Sanghyun Lee

11
@Sangdol Thông thường, lớp chỉ được gọi <tag-name>Tag. Đối với tên lớp đủ điều kiện, hãy mở thư viện ( .jar) có chứa thẻ, spring-webtrong trường hợp này. Dưới đây META-INF, bạn sẽ tìm thấy spring-form.tld. Nó sẽ có một <tag>mục nhập cho formvới một <tag-class>số 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>
....

CÁCH MỚI = modelAttribute

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

13

Tôi đã có câu hỏi tương tự cách đây một lúc, tôi không thể nhớ chính xác sự khác biệt nhưng từ nghiên cứu, tôi chắc chắn rằng đó commandNamelà cách làm cũ và trong các ứng dụng mới bạn nên sử dụngmodelAttribute


1

commandName = tên của một biến trong phạm vi yêu cầu hoặc phạm vi phiên chứa thông tin về biểu mẫu này, hoặc đây là mô hình cho dạng xem này. Tt nên được.


-3

Trong cấu hình dựa trên xml, chúng ta sẽ sử dụng lớp lệnh để truyền một đối tượng giữa bộ điều khiển và các khung nhìn. Bây giờ trong chú thích chúng tôi đang sử dụng modelattribute.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.