更改ajax导航上的URL

Hol*_*ysh 1 navigation ajax url jsf jsf-2

我有一个JSF应用程序,我希望在导航中更改浏览器地址栏中的URL.当我打开Home.xhtml并提交表单时,它会显示下一页AppHome.xhtml,但浏览器地址栏中的URL不会更改.

这是提交按钮:

<p:commandButton value="Connect" update="panel" id="ajax" action="#{user.check}" styleClass="ui-priority-primary"/>
Run Code Online (Sandbox Code Playgroud)

这是导航规则:

<navigation-rule>
    <from-view-id>/Home.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>Success</from-outcome>
        <to-view-id>/AppHome.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>Failure</from-outcome>
        <to-view-id>/Home.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)

执行此导航时,如何更改浏览器地址栏中的URL?

Bal*_*usC 7

仅当在与当前请求URL不同的URL上触发同步请求时,才会更改浏览器地址栏中的URL.ajax请求不是同步请求.因此浏览器地址栏中的URL永远不会改变.此外,JSF默认将表单提交给当前URL(检查action生成的HTML 的属性<form>),因此URL也不会在同步POST请求中更改.

您需要在不同的URL上发送同步GET请求,以便更改浏览器地址栏中的URL.重定向将强制执行同步GET请求.您可以通过添加<redirect/>条目来实现此目的<navigation-case>.

你反对执行重定向的厌恶绝对没有理由.它最有可能在其他地方引起,因此需要在其他地方解决.是慢速页面加载和/或内容闪烁(闪烁)?这个问题反过来与重定向无关,需要以不同的方式解决.这可以通过适当的缓存来解决.或者是你在重定向上丢失面部消息?通过使用闪存范围Flash#setKeepMessages().

也可以看看:


具体问题无关,导航案例是JSF 1.x. 您是否了解新的JSF 2.x 隐式导航功能?确保您正在阅读针对JSF 2.x的最新JSF教程,而不是针对JSF 1.x的JSF教程.

<navigation-rule>如果你按如下方式实现action方法,你可以完全摆脱整个过程:

public String check() {
    // ...

    if (fail) {
        return null; // Goes back to same page while keeping JSF view state.
    } else {
        return "/AppHome?faces-redirect=true";
    }
}
Run Code Online (Sandbox Code Playgroud)