2012-01-06 47 views
0

我需要創建一個帶有JSF 2.0(不是複合組件)的自定義組件,該組件與SelectManyCheckbox類似,但具有不同的UI。我嘗試通過繼承UISelectMany並創建一個新的自定義Renderer來實現此目的。繼承UISelectMany以創建自定義JSF組件

我不明白的是,客戶端上的輸入數據如何通過組件傳遞到Bean中。必須有一種方法可以從POST中收集http params,將它放入List中並將List設置在Bean中。

編輯

我已經嘗試過與此類似:

public void decode(FacesContext context, UIComponent component) { 
    if ((context == null) || (component == null)) { 
     throw new NullPointerException(); 
    } 
    MapComponent map = (MapComponent) component; 
    String key = getName(context, map); 
    String value = (String)context.getExternalContext(). 
     getRequestParameterMap().get(key); 
    if (value != null) 
     map.setCurrent(value); 
    } 
} 

我可以在調試器中看到的,我的HTTP-PARAMS正確獲取。我也可以看到,我的自定義轉換器將在此之後被調用。但是價值觀並沒有達到比恩。但是我可以在日誌中看到一個非特定的驗證錯誤。 在網上閱讀了一些教程後,我仍然不明白這是如何工作的。必須有一些膠水代碼,它將轉換後的值傳遞給Bean中的setter。有人知道這是如何工作的嗎?

感謝 月

回答

1

必須有收集來自POST的HTTP PARAMS的方式,把它放在一個列表,並設置在Bean的列表。

這通常要在Renderer類的decode()方法完成。在Mojarra的情況下,它是com.sun.faces.renderkit.html_basic.MenuRenderer類。只是download的來源和偷看在那裏如何做。

基本上,你只要抓住與組件的客戶端ID作爲參數名稱相關的請求參數值,然後將其設置爲通過UIInput#setSubmittedValue()提交的值。

public void decode(FacesContext context, UIComponent component) { 
    ((UIInput) component).setSubmittedValue(context.getExternalContext().getRequestParameterValuesMap().get(component.getClientId(context))); 
} 

(當然你需要事先做一些驗證;再次,檢查原始源代碼)

+0

感謝您的提示!我認爲驗證可能是問題。我實現了一個decode()和getConvertedValue(),我可以在調試模式中看到它們被調用。但在此之後,我在日誌中看到驗證錯誤。我沒有發現爲什麼會出現此錯誤...或驗證是如何工作的...... – treeno 2012-01-06 20:32:43

+0

驗證錯誤的消息是什麼?臭名昭着的「價值無效」? – BalusC 2012-01-06 20:35:42

+0

是的,確切地說......我正在做一些很好的認識錯誤? ;-)也許UISelectMany檢查是否所有選定的值都是從中選擇值的完整值列表的一部分。但目前我只有選定的值。我無法在jsf源文件中看到發生這種情況的原因。 – treeno 2012-01-07 20:57:27

0

創建延伸javax.faces.component.UISelectMany

class MySelectMany extends javax.faces.component.UISelectMany 
{ 

//over-ride methods of javax.faces.component.UISelectMany 


// this method is inherited from javax.faces.component.UIComponentBase. You can use this method to set the rendererType 

public void setRendererType(java.lang.String rendererType) 
{ 

// custom rendering 
} 

} 
自己的類