Question

I have a <h:inputText> with an event listener like following:

<h:inputText valueChangeListener="#{myBean.handle}"/>

I would like to put it in a tag file which is to be used as follows:

<my:itext changeListener="#{myBean.handle}" />

With inside the tag file:

<h:inputText valueChangeListener="#{changeListener}" />

However it's evaluating it as a property instead of as a listener method. How can I pass the listener method into a tag file?

Was it helpful?

Solution

You can by design not pass method expressions as a tag file attribute. You basically need to convert the ValueExpression to a MethodExpression inside the tag file.

For JSF 2.x Facelets, this can be solved using OmniFaces <o:methodParam>.

<o:methodParam name="changeListenerMethod" value="#{changeListener}" />
<h:inputText valueChangeListener="#{changeListenerMethod}" />

However, for old and deprecated Facelets 1.x or JSP 2.x there is no existing solution. The OmniFaces <o:methodParam> is however open source, you should be able to copy and alter it for Facelets 1.x or JSP if necessary.

Note that when you're actually already using JSF 2.x, you could also use a composite component instead. This supports passing method expressions as <cc:attribute method-signature>. For JSF 1.x you can alternatively also create a real custom component, but that's a bit more work than just some XML.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top