2009-02-05 46 views
6

Hãy nói rằng tôi có đối tượng lệnh sau:mùa xuân - liên kết với một đối tượng chứ không phải là một String hoặc nguyên thủy

class BreakfastSelectCommand{ 
    List<Breakfast> possibleBreakfasts; 
    Breakfast selectedBreakfast; 
} 

Làm thế nào tôi có thể có mùa xuân populate "selectedBreakfast" với bữa sáng từ danh sách?

Tôi đã tìm tôi muốn làm điều gì đó như thế này trong jsp của tôi:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast" /> 

Nhưng điều này dường như không làm việc. Bất kỳ ý tưởng?

cảm ơn,

-Morgan

Trả lời

8

Chìa khóa để nó tất cả điều này là PropertyEditor.

Bạn cần xác định PropertyEditor cho lớp Bữa sáng và sau đó định cấu hình ServletDataBinder bằng cách sử dụng registerCustomEditor trong phương pháp initBinder của bộ điều khiển.

dụ:

public class BreakfastPropertyEditor extends PropertyEditorSupport{ 
    public void setAsText(String incomming){ 
     Breakfast b = yourDao.findById(Integer.parseInt(incomming)); 
     setValue(b); 
    } 
    public String getAsText(){ 
     return ((Breakfast)getValue()).getId(); 
    } 
} 

lưu ý bạn sẽ cần một số kiểm tra null vv, nhưng bạn sẽ có được ý tưởng. Trong điều khiển của bạn:

public BreakfastFooBarController extends SimpleFormController { 
    @Override 
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
     binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao)); 
    } 
} 

điều cần xem ra cho:

  • PropertyEditor của không phải là thread an toàn
  • nếu bạn cần đậu mùa xuân, hoặc bằng tay tiêm cho họ hoặc xác định chúng trong mùa xuân như phạm vi nguyên mẫu và sử dụng phương pháp tiêm vào bộ điều khiển của bạn
  • ném IllegalArgumentException nếu tham số đến không hợp lệ/không tìm thấy, spring sẽ chuyển đổi lỗi này thành lỗi ràng buộc chính xác

hy vọng điều này sẽ hữu ích.

Chỉnh sửa (để trả lời nhận xét): Có vẻ hơi lạ trong ví dụ cụ thể vì BreakfastSelectCommand không giống như một thực thể, tôi không chắc bạn đang có kịch bản thực tế nào. Giả sử nó là một thực thể, ví dụ như Person với thuộc tính breakfast thì phương thức formBackingObject() sẽ tải đối tượng Person từ PersonDao và trả về nó làm lệnh. Giai đoạn ràng buộc sau đó sẽ thay đổi thuộc tính bữa sáng tùy thuộc vào giá trị đã chọn, sao cho lệnh đến trong onSubmit có thuộc tính bữa sáng được thiết lập.

Tùy thuộc vào việc thực hiện các đối tượng DAO của bạn gọi hai lần hoặc cố tải cùng một thực thể hai lần không thực sự có nghĩa là bạn sẽ nhận được hai câu lệnh SQL đang chạy. Điều này áp dụng đặc biệt cho Hibernate, nơi nó đảm bảo rằng nó sẽ trả về cùng một đối tượng trong phiên làm việc của nó cho một định danh đã cho, do đó cho phép nỗ lực ràng buộc để nạp lựa chọn Breakfast ngay cả khi nó không thay đổi. chi phí quá cao.

+0

Cảm ơn gid. Tại điểm ràng buộc, không phải đối tượng lệnh của tôi đã được tạo ra (lần thứ hai) chưa? Nó có vẻ lạ mà tôi cần phải thực hiện một yêu cầu của bạnDao. – morgancodes

+0

@morgancodes xem ở trên chỉnh sửa ...cần thêm một chút không gian –

+2

tất cả những thứ đó và không phải là duy nhất upvote ... –

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