blo0p3r
blo0p3r

Reputation: 6850

JSF 2.0 URL parameter needed on larger scope

I have found a few good replies to similar content so far, but never something that solves my issue. I am trying to accomplish this in the best manner possible.

Within my application (JSF 2.0 running on Glasshfish), I have a list of events (let's call this the EventPage). It is possible to click on each event to then show a page of "results" (ResultPage), showing a list of people who have attended this event.

On the EventPage, the link is made as such :

 <h:link value="#{event.eventName}" outcome="displayResults">
     <f:param name="eventCode" value="#{event.eventCode}"/>
 </h:link>

Then, on the outcome - displayResult, I have code such as this in my backing bean (inspiried by a similar):

@ManagedBean
@RequestScoped
public class DisplayResults {
    @ManagedProperty(value="#{param.eventCode}")
...

This works well. The results are displayed in a Datatable. Now I want the ability to sort them. So I've followed this example : http://www.mkyong.com/jsf2/jsf-2-datatable-sorting-example/.

But, once I change the scope of my backing bean to be something else the "request", I can't use the ManagedProperty anymore. And thus am thinking I have to refer to something less elegant such as :

public String getPassedParameter() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    this.passedParameter = (String) facesContext.getExternalContext().
        getRequestParameterMap().get("id");
    return this.passedParameter;
}

Aslo reading on this forum I share the opinion that if you have to dig down into the FacesContext, you are probably doing it wrong.

SO: 1. Is it possible to sort a Datatable without refreshing the view? Only the datatable in question? 2. Is there another good solution to get the url parameter (or use diffrent means)?

Thanks!

Upvotes: 1

Views: 1326

Answers (1)

BalusC
BalusC

Reputation: 1109072

Use <f:viewParam> (and <f:event>) in the target view instead of @ManagedProperty (and @PostConstruct).

<f:metadata>
    <f:viewParam name="eventCode" value="#{displayResults.eventCode}" />
    <f:event type="preRenderView" listener="#{displayResults.init}" />
</f:metadata>

As a bonus, this also allows for more declarative conversion and validation without the need to do it in the @PostConstruct.

See also:

Upvotes: 2

Related Questions