3

The use case is calling a method on a JSF 2.x Backing Bean directly from a hyperlink (Non-Faces-Request). What is the best way to do this?

I imagine to do something like this:

The Link:

http://localhost/show.xhtml?id=30&backingbeanname=loaddata&method=load

The Backing Bean:

@Named (value = "loaddata")
public class DataLoader {

     public void load(int id){ ... }
}
4

1 に答える 1

5

Use <f:viewParam> in the target view to set GET parameters as bean properties and use <f:event type="preRenderView"> to invoke an action on them.

In show.xhtml:

<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" required="true" />
    <f:event type="preRenderView" listener="#{bean.load}" />
</f:metadata>
<h:message for="id" />

In managed bean:

private Integer id;
private Data data;

public void load() {
    data = service.find(id);
}

Note that in the above example the URL http://localhost/show.xhtml?id=30 is sufficient. You can always set more parameters as bean properties and have one "God" bean which delegates everything, but that's after all likely clumsy.

Also note that you can just attach a Converter to the <f:viewParam> (like as you could do in <h:inputText>). The load() method is then most likely entirely superfluous.

<f:metadata>
    <f:viewParam name="id" value="#{bean.data}" 
        converter="dataConverter" converterMessage="Bad request. Unknown data."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>
<h:message for="id" />

See also:

于 2012-11-30T17:45:18.667 に答える