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>
我的问题是:
为什么我们使用ui:composition标签而没有任何参数。
我们在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”);
答案 0 :(得分:0)
对于第一个问题:<ui:composition template="...">
将此标记的内容呈现到指定的模板中。由于此处没有模板,因此不需要该属性。
对于第二个问题:findComponent
在封闭的NamingContainer
中搜索给定的ID,这是您的复合组件(检查完整算法的the Javadoc)。它不像jQuery,只搜索给定组件的“下方”。