jsf搞砸了链接

时间:2012-11-20 22:21:40

标签: jsf browser controller primefaces hyperlink

我是JSF的新手。我的应用程序正在运行,但在使用控制器时我对浏览器中的链接感到困惑。顺便说一下,我的应用程序中还有PrimeFaces,所以不要对p:标签感到惊讶。假设我有'list'和'show'页面,控制器在它们之间进行重定向。首先我在http://localhost:8080/y/r/conversation/list.xhtml页面上。使用行<p:commandLink action="#{lazyConversationBean.doShow(conv)}" ajax="false" value="View"/>创建了链接。 lazyConversationBean在这里充当我的控制器。有方法:

public String doShow(Conversation c) {
    this.setSelectedConversation(c);
    return "view";
}

我被重定向到...... http://localhost:8080/y/r/conversation/list.xhtml(浏览器显示它),即使它是正确的http://localhost:8080/y/r/conversation/view.xhtml页面。在那里,我有链接<p:commandButton action="#{lazyConversationBean.doList()}" ajax="false" value="Back to list"/>,再次控制器有方法:

public String doList() {
    return "list";
}

我被重定向到...是的,你猜对了... http://localhost:8080/y/r/conversation/view.xhtml(这也是浏览器显示的内容),即使它再次是正确的http://localhost:8080/y/r/conversation/list.xhtml页面。

它接缝,因为浏览器链接区域始终是当前显示的页面后面一步。我甚至不知道它是否是一些不正确的行为,因为我不知道如何查询谷歌:D只是为了测试我做了this简短的教程,其中netbeans在我的一个实体上创建了整堆代码,和行为是一样的,所以它与PrimeFaces的魔法无关。

你能告诉我为什么会这样,以及如何解决它?用户喜欢复制正确的链接;)

1 个答案:

答案 0 :(得分:2)

这不是问题,框架是这样完成的。有不同的方法可以解决这个问题。例如,您可以添加创建您的操作:

public String doShow(Conversation c)
{
    this.setSelectedConversation(c);
    return "view" + "?faces-redirect=true";
}

<p:commandLink action="#{lazyConversationBean.doShow(conv)}" ajax="false" value="View"/>

它会强制重定向到操作视图,因此浏览器中的URL会发生变化。

编辑:这是faces-config.xml导航的解决方案(注意<redirect />):

<navigation-rule>
    <navigation-case>
        <from-outcome>outcome1</from-outcome>
        <to-view-id>/outcome1.xhtml</to-view-id>
        <redirect />
    </navigation-case>
    <navigation-case>
        <from-outcome>outcome2</from-outcome>
        <to-view-id>/outcome2.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>