2010-08-28 15 views
9

Tôi mới vào Spring Framework và cố gắng hiểu chức năng của formBackingObject và so sánh nó với các phương thức referenceData, cả hai đối tượng này lẫn lộn tôi khi cố gắng liên kết chúng với HTTP Request Cycle từ điểm Spring MVC.Làm thế nào để đối tượng formbackingobject và referencedata hoạt động trong Spring Web MVC Cycle?

Tôi thực sự đánh giá cao nếu ai đó có thể giải thích hai đối tượng này với tham chiếu đến một ví dụ.

Q: Sự khác biệt giữa formbacking objectreference Data Đối tượng là gì?

+0

Tôi đã thu thập rằng phương pháp tham chiếu nên được sử dụng để điền dữ liệu biểu mẫu, trong trường hợp của tôi là một danh sách thả xuống đơn giản. Đối tượng sao lưu biểu mẫu được sử dụng bởi biểu mẫu để điền dữ liệu vào – Rachel

Trả lời

23

Khi bạn tải một trang web, bạn sẽ muốn chuyển dữ liệu đến trang đó để nó có thể hiển thị.

Một số dữ liệu này sẽ hoàn toàn mang tính thông tin, chỉ đọc; dữ liệu mà trang cần để hiển thị, nhưng đó không phải là một phần của giao dịch hiện tại.Ví dụ: danh sách các quốc gia cư trú thả xuống, danh sách các sản phẩm có thể mà người dùng có thể mua.

Dữ liệu khác sẽ được sử dụng để đọc và viết: nội dung của biểu mẫu, phải được điền bằng dữ liệu hiện tại, nhưng cũng có thể được người dùng cập nhật. Tập dữ liệu này sẽ bị ràng buộc vào biểu mẫu; dữ liệu được gửi đến trang sẽ hiển thị, dữ liệu được gửi từ trang (bởi người dùng) sẽ gây ra một bản cập nhật. Ví dụ: tên và địa chỉ của người dùng; thứ tự hiện tại.

Tất cả dữ liệu này thường sẽ được lưu trữ trong một hoặc nhiều đối tượng mà trang cần truy cập.

Đối tượng chứa dữ liệu thông tin phải được đặt trong bản đồ được cung cấp bởi phương pháp referenceData(). Có thể có nhiều đối tượng như bạn muốn.

Dữ liệu được ràng buộc với biểu mẫu, dữ liệu đọc/ghi, phải được chứa trong một đối tượng duy nhất. Đối tượng này phải được trả về theo phương thức formBackingObject().

Tôi sẽ thêm điều đó trong các phiên bản Spring mới hơn, chú thích được sử dụng thay cho các phương pháp "tích hợp sẵn" này.

+0

Đây là điều tôi đang tìm kiếm ... cảm ơn Jacob vì lời giải thích đơn giản. – Rachel

+0

Và chúng tôi có thể gửi dữ liệu thông tin cho rằng phương thức 'request.setAttribute (String name, Object value)' ?. Và sau đó lấy nó trong khung nhìn bằng cách sử dụng cú pháp đánh giá expresion như '$ {name}'? Điều gì là appropiate hơn, gửi nó tham khảo suy nghĩData bản đồ hoặc yêu cầu? – Victor

+2

bạn có thể sử dụng 'yêu cầu.setAttribute', chắc chắn. Nhưng điều đó buộc bạn khá chặt chẽ với đối tượng HTTPRequest, vì vậy tôi thích ý tưởng referenceData, hoặc sử dụng 'addAttribute' khác trên đối tượng' ModelAndView' (kết thúc bằng 'request.setAttribute' nhưng là một trừu tượng tốt hơn). –

4

Ở đây đi formBackingObject API

lấy một đối tượng ủng hộ đối với hình thức hiện tại từ yêu cầu nhất định

Một số kịch bản

  • Tránh NullPointerException khi đi qua con đường lồng

...

public class Command { 

    private NestedClass nestedPath; 

    // getter's and setter's 

} 

Thông báo trên nestedPath lĩnh vực chưa được khởi tạo. Vì vậy, nếu bạn cố gắng để lấy giá trị của nó về hình thức như

<spring:form path="nestedPath.someProperty"/> 

Vì nestedPath chưa được khởi tạo, Bạn sẽ nhận được NullPointerException khi đi qua một số tài sản nestedPath. Để tránh NullPointException, ghi đè formBackingObject

public Object formBackingObject(HttpServletRequest request) throws Exception { 
    Command command = new Command(); 
    command.setNestedPath(new NestedClass()); 

    return command; 
} 
  • Tìm-To-Cập nhật kịch bản

Bạn nộp nhận dạng của một số lệnh (thường là bằng cách sử dụng phương thức GET) để cho phép người dùng cập nhật nó sau

public Object formBackingObject(HttpServletRequest request) throws Exception { 
    if(request.getMethod().equalsIgnoreCase("GET")) { 
     return commandRepository.findById(Integer.valueOf(request.getParameter("id"))); 
    } 
} 

referenceData API

tạo ra một bản đồ dữ liệu tham khảo cho các yêu cầu nhất định

Bạn sử dụng referenceData để tạo ra dữ liệu được sử dụng bởi hình thức của bạn, ví dụ, một danh sách các loại

protected Map referenceData(HttpServletRequest request) throws Exception { 
    return new ModelMap().addAttribute(categoryRepository.findAll()); 
} 

Về hình thức

<label>Select category</label> 
<form:select path="category"> 
    <form:option label="Select category" value=""/> 
    <form:options items="${categoryList}" 
        itemLabel="WHICH_PROPERTY_OF_CATEGORY_SHOULD_BE_USED_AS_LABEL" 
        itemValue="WHICH_PROPERTY_OF_CATEGORY_SHOULD_BE_USED_AS_VALUE"/> 
</form:select> 
+1

Bạn có thể giải thích đối tượng sao lưu biểu mẫu và tham chiếuData bằng ngôn ngữ đơn giản hơn không ... giả sử bạn phải giải thích cho người nào đó vừa nhập vào Spring World hoặc nói ai đó không phải bất cứ điều gì về mùa xuân? – Rachel

+0

@Rachel ** Tôi thực sự khuyên bạn nên thực hiện theo Hướng dẫn Spring MVC hoặc http://static.springsource.org/docs/Spring-MVC-step-by-step/index.html trước đây. đọc cẩn thận. Một ngày cho mỗi chương = sáu ngày làm việc Hoặc http://maestric.com/doc/java/spring Hãy thoải mái. Chuc bạn may măn! –

0

Khi bạn tải một trang web, bạn sẽ muốn chuyển dữ liệu đến trang đó để nó có thể hiển thị.

Một số dữ liệu này sẽ hoàn toàn là thông tin, chỉ đọc; dữ liệu mà trang cần để hiển thị, nhưng đó không phải là một phần của giao dịch hiện tại. Ví dụ: danh sách các quốc gia cư trú thả xuống, danh sách các sản phẩm có thể mà người dùng có thể mua.

Dữ liệu khác sẽ được sử dụng để đọc và ghi: nội dung của biểu mẫu, phải được điền bằng dữ liệu hiện tại nhưng cũng có thể được người dùng cập nhật. Tập dữ liệu này sẽ bị ràng buộc vào biểu mẫu; dữ liệu được gửi đến trang sẽ hiển thị, dữ liệu được gửi từ trang (bởi người dùng) sẽ gây ra một bản cập nhật. Ví dụ: tên và địa chỉ của người dùng; thứ tự hiện tại.

Tất cả dữ liệu này thường sẽ được lưu trữ trong một hoặc nhiều đối tượng mà trang cần truy cập.

Đối tượng chứa dữ liệu thông tin phải được đặt trong bản đồ được cung cấp bởi phương thức referenceData(). Có thể có nhiều đối tượng như bạn muốn.

Dữ liệu được ràng buộc với biểu mẫu, dữ liệu đọc/ghi, phải được chứa trong một đối tượng duy nhất. Đối tượng này phải được trả về bởi phương thức formBackingObject().

Các vấn đề liên quan