3

对不起,真的很基本的问题......

我有一个显示在页面上的“留言板线程”列表。我希望能够单击其中一个并重定向到显示该线程详细信息的页面。尽管谷歌搜索了一段时间,但我仍在挣扎......

(顺便说一下,我正在使用 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}" />

瞧!谢谢。

4

2 回答 2

3

UICommand未调用操作有很多可能的原因。您可以在此处找到它们:commandButton/commandLink/ajax action/listener 方法未调用或输入值未更新其中缺少表单、嵌套表单或表单中其他地方的转换/验证错误,位于其数据模型的数据表中没有妥善保存,等等。

至于您的特定功能要求,最好使用<h:link>. 命令链接发出 POST 请求,在您的特定情况下,该请求不会以 URL 中带有线程 ID 的可书签 URL 结束。A<h:link>创建一个完整的链接,该链接可添加书签且可搜索机器人索引。

例如

<h:link value="#{thread.title}" outcome="messageboard/list"> 
    <f:param name="threadId" value="#{thread.id}" />
</h:link>

这不需要表单或操作方法。您只需要将其移动@ManagedProperty到与 关联的 bean messageboard/list,或者<f:viewParam>messageboard/list视图中将其替换为允许更细粒度的验证/转换。

也可以看看:

于 2012-04-26T22:57:38.987 回答
1

你最好的选择可能是使用BalusC答案和使用<h:link>。但是,我对您所看到的行为有一些想法。

Primefaces <p:commandLink>(like <p:commandButton>) 默认使用 ajax。因此,从您的操作返回结果不会产生任何实际导航。这可能会使您的操作看起来没有被调用。尝试添加ajax=false到您的<p:commandLink>.

使用 时<h:link>,导航会在呈现链接时解决,而不是在单击时解决。修改您的示例:

<h:link value="#{thread.title}" outcome="#{messageboardBean.showThread()}"> 
    <f:param name="threadId" value="#{thread.id}" />
</h:link>

showThread()将在呈现包含链接的视图时被调用(我认为)。如果您没有在正确的时间进行检查,这也可能使它看起来像是正在调用该方法。

在这两种情况下,这都不能解释为什么你根本看不到 System.out 的消息,但我知道我已经尝试过认为它是故障安全的,但仍然没有看到输出,这完全取决于你的容器、配置、启动方式等。

于 2012-04-27T12:53:54.600 回答