对不起,真的很基本的问题......
我有一个显示在页面上的“留言板线程”列表。我希望能够单击其中一个并重定向到显示该线程详细信息的页面。尽管谷歌搜索了一段时间,但我仍在挣扎......
(顺便说一下,我正在使用 PrimeFaces)
这是我的“列表”页面中的相关代码:
<p:commandLink value="#{thread.title}" action="#{messageboardBean.showThread()}">
<f:param name="threadId" value="#{thread.id}" />
</p:commandLink>
(它在一个 h:form 元素中)
这是我命名 bean 的一部分(其他方法工作正常)
...
@ManagedProperty(value="#{param.threadId}")
private Long threadId;
...
public String showThread() {
System.out.println("id is " + getThreadId());
return "messageboard/list";
}
...
正如你所看到的,我的方法还没有实现,但它甚至没有被调用。请问有人能告诉我为什么吗?
顺便说一句,我也尝试过使用 h:link,同样(或类似)的问题。
谢谢!
更新 - 已解决
感谢下面的帮助,这是我的解决方案(我已将“留言板”重命名为“讨论”)。
该链接是使用此代码生成的
值:在页面上显示什么,在我的例子中,我的讨论结果的标题:指的是 edit.xhtml,我想去的 faces 文件......并且 [request] 参数将被称为“threadId”并且在我的“线程”对象中具有 id 属性的值。
在 edit.xhtml 页面中,我有这个
<f:metadata>
<f:viewParam name="threadId" value="#{viewDiscussionBean.threadId}" />
<f:event type="preRenderView" listener="#{viewDiscussionBean.loadDiscussion}" />
</f:metadata>
请注意,'threadId' 与第一页中的参数名称相同,并且绑定到我的 viewDiscussionBean 的 threadId 属性。
然后,一旦在我的 bean 上设置了所有参数,我就会调用 viewDiscussionBean 的 loadDiscussion 方法。由于它现在具有 threadId 属性,因此它能够做到这一点(见下文)
我的 viewDiscussionBean 具有以下托管属性(我认为 viewParam 标记设置了这个,而不是相反)。
@ManagedProperty(value="#{param.threadId}")
private Long threadId;
private Discussion thread;
所以一旦设置好了,这个方法就可以运行(因为它现在有一个 ID)
public String loadDiscussion() {
thread = mbDao.find(threadId);
return "edit";
}
这只是使用 DAO(使用 Hibernate)来查找具有该 ID 的讨论线程,并将其设置在 bean 中。进而...
在我的 edit.xhtml 页面中,我可以使用类似的东西访问讨论线程中的值
<h:outputText value="#{viewDiscussionBean.thread.message}" />
瞧!谢谢。