2009-02-05 18 views
6

比方說,我有以下命令對象:春天 - 綁定到一個對象,而不是字符串或原始

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

我怎麼能有春天填入「selectedBreakfast」從列表中的早餐?

我盤算我會做這樣的事情在我的jsp:

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

但這似乎並沒有工作。有任何想法嗎?

感謝,

-Morgan

回答

8

它所有這一切的關鍵是屬性編輯器。

您需要爲您的Breakfast類定義PropertyEditor,然後在控制器的initBinder方法中使用registerCustomEditor配置ServletDataBinder。

例如:

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(); 
    } 
} 

筆記,知道你們需要一些空檢查等,但你的想法。在你的控制器:

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

事情需要提防:

  • 屬性編輯器的不是線程安全的
  • ,如果你需要的Spring bean,可以手動將它們注入或在春季將它們定義爲原型範圍和使用方法注入您的控制器
  • throw IllegalArgumentException如果入站參數無效/未找到,spring會將其正確轉換爲綁定錯誤

希望這有助於。

編輯(回覆此評論): 在給出的例子中,它看起來有點奇怪,因爲BreakfastSelectCommand看起來不像一個實體,我不確定你的實際場景是什麼。假設它是一個實體,例如Person帶有breakfast屬性,那麼formBackingObject()方法將從PersonDao加載Person對象並將其作爲命令返回。然後,綁定階段將根據所選值改變早餐屬性,使得到達onSubmit的命令具有所有設置的早餐屬性。

根據DAO對象的實現調用它們兩次或試圖加載同一個實體兩次實際上並不意味着您將得到兩個正在運行的SQL語句。這特別適用於Hibernate,它保證它會返回給定標識符的會話中相同的對象,因此運行讓綁定嘗試加載選項,即使它沒有改變也不應該導致任何結果不必要的開銷。

+0

謝謝gid。在綁定的時候,我的命令對象是不是已經創建(第二次)?這似乎很奇怪,我應該需要再提出一個請求。 – morgancodes 2009-02-11 23:35:30

相關問題