1

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

这是提交按钮:

<p:commandButton value="Connect" update="panel" id="ajax" action="#{user.check}" styleClass="ui-priority-primary"/>

这是导航规则:

<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>

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

4

1 回答 1

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 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";
    }
}
于 2013-04-17T12:49:36.637 回答