Sorry, really really basic question…
I’ve got a list of ‘messageboard threads’ that I display on a page. I want to be able to click on one of them and redirect to a page which displays the details for that thread. I’m struggling despite googling it for a while…
(I’m using PrimeFaces by the way)
Here’s the relevant code from my ‘list’ page:
<p:commandLink value="#{thread.title}" action="#{messageboardBean.showThread()}">
<f:param name="threadId" value="#{thread.id}" />
</p:commandLink>
(it’s in an h:form element)
This is part of my named bean (other methods work fine)
...
@ManagedProperty(value="#{param.threadId}")
private Long threadId;
...
public String showThread() {
System.out.println("id is " + getThreadId());
return "messageboard/list";
}
...
As you can see my method isn’t implemented yet, but it’s not even being called. Please can someone tell me why?
I tried with an h:link too by the way, same (or similar) problem.
Thanks!
UPDATE – Solved
Thanks to the help below, here is my solution (I’ve renamed ‘messageboard’ to ‘discussion’).
The link is generated using this code
value: what to display on the page, in my case the title of my discussion
outcome: refers to edit.xhtml, the faces file I want to go to
…and the [request] param is going to be called ‘threadId’ and has a value of the id attribute in my ‘thread’ object.
In the edit.xhtml page, I’ve got this
<f:metadata>
<f:viewParam name="threadId" value="#{viewDiscussionBean.threadId}" />
<f:event type="preRenderView" listener="#{viewDiscussionBean.loadDiscussion}" />
</f:metadata>
Note that ‘threadId’ is the same as the param name in the first page, and it is bound to my viewDiscussionBean’s threadId property.
Then once the params are all set on my bean, I call the loadDiscussion method of my viewDiscussionBean. Since it now has the threadId property, it’s able to do this (see below)
My viewDiscussionBean has the following managed property (I think the viewParam tag sets this, rather than the other way around).
@ManagedProperty(value="#{param.threadId}")
private Long threadId;
private Discussion thread;
So once that’s set, this method is able to run (because it now has an ID)
public String loadDiscussion() {
thread = mbDao.find(threadId);
return "edit";
}
This just uses a DAO (using Hibernate) to look up the discussion thread with that ID, and set it in the bean. And then…
In my edit.xhtml page, I can access values in the discussion thread using things like
<h:outputText value="#{viewDiscussionBean.thread.message}" />
Voila! Thanks.
There are many possible caused for an
UICommandaction not being invoked. You can find them all here: commandButton/commandLink/ajax action/listener method not invoked or input value not updated Among others a missing form, a nested form, or a conversion/validation error elsewhere in the form, being in a datatable whose datamodel is not properly preserved, etcetera.As to your particular functional requirement, better is to use a
<h:link>. A command link issues a POST request which does in your particular case not end up with a bookmarkable URL with the thread ID in the URL. A<h:link>creates a fullworthy link which is bookmarkable and searchbot-indexable.E.g.
This doesn’t require a form nor an action method. You only need to move that
@ManagedPropertyto the bean associated withmessageboard/list, or maybe replace it by<f:viewParam>in themessageboard/listview which allows for finer-grained validation/conversion.See also: