0

我是 JSF 的新手。我的应用程序正在运行,但在使用控制器时我对浏览器中的链接感到困惑。顺便说一句,我的应用程序中还有 PrimeFaces,所以不要对p:标签感到惊讶。假设我有“列表”和“显示”页面,控制器在它们之间进行重定向。首先我在http://localhost:8080/y/r/conversation/list.xhtml页面上。有用 line 创建的链接<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 只是为了测试我做了这个简短的教程,netbeans 在我的一个实体上创建了整个代码堆栈,行为是同样,所以它与 PrimeFaces 魔法无关。

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

4

1 回答 1

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>
于 2012-11-20T22:26:45.383 回答