我是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的魔法无关。
你能告诉我为什么会这样,以及如何解决它?用户喜欢复制正确的链接;)
答案 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>