Я сделал нечто похожее на это:
Составной компонент для вашей кнопки: inpbutton.x html
<composite:interface componentType="inpbutton">
<composite:attribute name="value" type="java.lang.Object"/>
...
<composite:implementation>
<h:commandButton value="..." actionListener="#{cc.action()}"/>
Соответствующий класс: Inpbutton. java
@FacesComponent("inpbutton")
public class Inpbutton extends UIInput implements NamingContainer {
public void action() {
ValueExpression vx = getValueExpression("value");
getBean(InpDialog.class).openDialog(vx);
}
}
// static utilities from elsewhere
@SuppressWarnings({"unchecked"})
public static <T> T uncheckedCast(Object obj) {
return (T) obj;
}
public static <T> T getBean(Class<T> cls) {
BeanManager bm = CDI.current().getBeanManager();
Bean<T> bean = uncheckedCast(bm.getBeans(cls).iterator().next());
CreationalContext<T> ctx = bm.createCreationalContext(bean);
return uncheckedCast(bm.getReference(bean, cls, ctx));
}
x html:
<h:inputText value="databean.entry1"/>
<X:inpbutton value="databean.entry1"/>
может быть, вы объедините поле ввода и кнопку в составном компоненте.
И компонент для диалога поиска : InpDialog. java
ValueExpression vx = null;
public void openDialog(ValueExpression val) {
vx = val;
// open the modal dialog with button -> dialogWorker()
}
public void dialogWorker() {
// do the stuff
// set the field X value
if(vx!=null)
vx.setValue(theResult);
}