JSF converter for f:param
Asked Answered
P

2

9

I'm using dynamically created links:

          <h:link outcome="/page" value="#{name}">
            <f:param name="name" value="#{name}"/>
          </h:link>

I would like to attach custom converter for f:param to remove spaces from #{name} etc. But there is no converter property in f:param.

Pizzicato answered 14/10, 2011 at 11:27 Comment(0)
A
16

A Converter is intented to convert from submitted String request parameter values to complex objects and vice versa in input fields. However, the <f:param> is pure output only and it will always call toString() on the value. It doesn't support a Converter.

Your cleanest and best bet is to create a custom EL function, so that you ultimately end up like:

<f:param name="name" value="#{util:prettyUrl(name)}"/>

Update: the JSF utility library OmniFaces has since version 1.4 (March 2013) a <o:param> component which extends the <f:param> with support for a fullworthy JSF converter, exactly like as you'd use in <h:outputText converter>.

<h:link outcome="/page" value="#{name}">
    <o:param name="name" value="#{name}" converter="somePrettyURLConverter" />
</h:link>

See also the showcase.

Alpers answered 14/10, 2011 at 14:31 Comment(2)
I had the same question and I am not really satisfied with such a solution. On the receiving site f:viewParam is used to retrieve the Object using a converter. So it would be straight forward to use a converter with f:param too. Since that logic is already implemented in the converter. Now that logic is also present in the view and if i change the param maybe from name to id I have to change the converter and the site. The custom el function would be a workaround, at least if the initial converter would also use it.Papandreou
added the o:param tag to his omnifaces library and it works very well.Papandreou
N
1

what if you do something like this?

<f:param name="name" value="#{name.replace(' ', '')}" />

Isn't this working?

Or you want for all < f:param ... ??

Regards

Nuzzi answered 14/10, 2011 at 12:46 Comment(2)
Actually, the conversion is more complex, so I need java function. For now I use managed bean functions <f:param name="name" value="#{util.myfunction(name)}" />Pizzicato
@mm1: I don't think you have another solution.. It doesn't make sense... what you want is to replace the return of #{name} when is accessed by <f:param ... and I don't think you'll ever do this only for this kind of parameter...Nuzzi

© 2022 - 2024 — McMap. All rights reserved.