2016-06-07 81 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

相关问题