2016-06-07 80 views
1

我一直在試圖創建一個自定義的用戶界面組件jsf來代替<f:selectItems />,它是在一個selectOneMenu包裝。所以我的facesComponent需要生成所有選項,而selectOneMenu提供<select></select>自定義jsf用戶界面組件替換<f:selectItems />

問題是這些選項不是在selectOneMenu內部呈現的,而是在其外部呈現的。

我facesComponent看起來是這樣的:

@FacesComponent(value = "be.mokuril.jsf.SelectItemsForEnum") 
public class SelectItemsForEnum extends UISelectItems { 

@Override 
public void encodeAll(FacesContext facesContext) throws IOException { 
    ResponseWriter responseWriter = ResponsefacesContext.getResponseWriter(); 
    responseWriter.startElement("option", null); 
    responseWriter.writeAttribute("value", 1, null); 
    responseWriter.write("option1"); 
    responseWriter.endElement("option"); 
    responseWriter.startElement("option", null); 
    responseWriter.writeAttribute("value", 2, null); 
    responseWriter.write("option2"); 
    responseWriter.endElement("option"); 
} 

,這是我的taglib:

<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
version="2.0" id="mw" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" 
> 
<namespace>http://www.mokuril.be/jsf/mw</namespace> 
<composite-library-name>mw</composite-library-name> 

<tag> 
    <tag-name>selectItemsForEnum</tag-name> 
    <component> 
     <component-type>be.mokuril.jsf.SelectItemsForEnum</component-type> 
    </component> 
</tag> 

而XHTML來重現問題:

<h:form> 
<h:selectOneMenu> 
    <mw:selectItemsForEnum /> 
</h:selectOneMenu> 
</h:form> 

我也一直在看組件樹:

<HtmlSelectOneMenu disabled="false" id="j_idt7" immediate="false" inView="true" localValueSet="false" readonly="false" rendered="true" required="false" transient="false" valid="true"> 
    <SelectItemsForEnum id="j_idt8" inView="true" rendered="true" transient="false"/> 
</HtmlSelectOneMenu> 

如果我用<f:selectItems />,而不是我的組件的我得到這個:

<UISelectItems id="j_idt9" inView="true" rendered="true" transient="false"/> 

這實際上是什麼,我希望它看起來像,但我清楚必須忽視的東西很重要。

回答

1

你的具體問題造成的,因爲UISelectOne/UISelectMany組件將掃描他們直接孩子UISelectItem(s) instences。當您使用複合組件時,其內容基本上會包含在UIPanel組件中,而不是UISelectItem(s)的實例,所以選擇組件將忽略它。從技術上講,你應該使用自定義組件而不是複合組件。另請參見When to use <ui:include>, tag files, composite components and/or custom components?

但是,你會在接下來的問題絆倒:在UISelectOne/UISelectMany將繼續完全靠自己來渲染選項,而忽略從你的渲染輸出。基本上,沒有人<f:xxx>組件自己渲染HTML。該責任由其父母<h:xxx>決定。從技術上講,如果你想操作<f:selectItem(s)>的輸出,你應該重寫<h:selectOneMenu>的渲染器。

這是你正在試圖解決這樣的問題,其unclear,但如果我是這樣做的猜測,這些問題應該最有可能回答和解決您的真正問題的正確方式:How to use enum values in f:selectItem(s)和/或How to add tooltip to f:selectItems

+0

目標是爲selectItems提供一個標籤,您只需指定一個ID。然後,組件將使用該ID來查找數據庫中的枚舉值,然後創建這些枚舉的選項。但是如果只有呈現html,那麼這種方法可能是不可能的。 – mokuril

+2

你最好在模型中完成那項工作,而不是視圖。 – BalusC

+0

這可能是真的,也許我應該堅持selectItems並創建一個我傳遞一個ID並返回SelectItem []的bean。感謝您的輸入! – mokuril

相關問題