【发布时间】:2012-04-26 22:49:48
【问题描述】:
抱歉,非常基本的问题...
我有一个显示在页面上的“留言板线程”列表。我希望能够单击其中一个并重定向到显示该线程详细信息的页面。尽管谷歌搜索了一段时间,但我仍在苦苦挣扎......
(顺便说一下,我正在使用 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,同样(或相似)的问题。
谢谢!
更新 - 已解决
感谢以下帮助,这是我的解决方案(我已将“留言板”重命名为“讨论”)。
使用此代码生成链接
value:在页面上显示什么,在我的例子中是我讨论的标题 结果:指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'和第一页的param名字一样,绑定到我的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}" />
瞧!谢谢。
【问题讨论】:
标签: java jsf-2 primefaces