如何工作自动complite自定义组件?

时间:2013-07-30 10:54:08

标签: jsf-2

A已经在互联网上找到了样本(IBM网站http://www.ibm.com/developerworks/web/library/j-jsf2fu-0410/index.html#listing1),并且在一些书籍中,JSF可以创建自动完成下拉列表。喜欢在谷歌搜索页面。其重点在于使用复合组件页面。它看起来像:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"    
    xmlns:composite="http://java.sun.com/jsf/composite">

    <!-- INTERFACE -->
    <composite:interface>
      <composite:attribute name="value" required="true"/>
      <composite:attribute name="completionItems" required="true"/>
    </composite:interface> 

    <!-- IMPLEMENATION -->          
    <composite:implementation>
      <div id="#{cc.clientId}">
        <h:outputScript library="javascript" 
           name="prototype-1.6.0.2.js" target="head"/>

        <h:outputScript library="javascript" 
           name="autoComplete.js" target="head"/>

        <h:inputText id="input" value="#{cc.attrs.value}" 
           onkeyup="com.corejsf.updateCompletionItems(this, event)"
           onblur="com.corejsf.inputLostFocus(this)"
           valueChangeListener="#{autocompleteListener.valueChanged}"/>

        <h:selectOneListbox id="listbox" style="display: none"
           valueChangeListener="#{autocompleteListener.completionItemSelected}">

            <f:selectItems value="#{cc.attrs.completionItems}"/>
            <f:ajax render="input"/>

        </h:selectOneListbox>
      <div>
    </composite:implementation>    
</ui:composition>

我的问题是:

  1. 为什么我们使用ui:composition标签而没有任何参数。

  2. 我们在h:inputText中定义了valueChangeListener,通过后端类实现,该方法具有带有这两行的方法public void valueChanged(ValueChangeEvent e)

    UIInput input = (UIInput) e.getSource();
    UISelectOne listbox = (UISelectOne) input.findComponent("listbox");
    

    if(UIInput)e.get source返回组件inputText,其id =“name”。下一行怎么可能 UISelectOne listbox =(UISelectOne)input.findComponent(“listbox”);

1 个答案:

答案 0 :(得分:0)

对于第一个问题:<ui:composition template="...">将此标记的内容呈现到指定的模板中。由于此处没有模板,因此不需要该属性。

对于第二个问题:findComponent在封闭的NamingContainer中搜索给定的ID,这是您的复合组件(检查完整算法的the Javadoc)。它不像jQuery,只搜索给定组件的“下方”。