我有一个JSF应用程序,我想在导航时更改浏览器地址栏中的URL。当我在Home.xhtml
并且我提交表单时,它会显示下一页AppHome.xhtml
,但浏览器地址栏中的网址不会更改。
这是提交按钮:
<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?
答案 0 :(得分:7)
仅当在与当前请求URL不同的URL上触发同步请求时,才会更改浏览器地址栏中的URL。 ajax请求不是同步请求。因此浏览器地址栏中的URL永远不会改变。此外,JSF默认情况下将表单提交给当前URL(检查生成的HTML action
的{{1}}属性),因此在同步POST请求中URL也永远不会更改。
您需要在其他网址上发送同步GET请求才能更改浏览器地址栏中的网址。重定向将强制执行同步GET请求。您可以通过向<form>
添加<redirect/>
条目来实现此目的。
您反对执行重定向绝对没有理由。它最有可能在其他地方引起,因此需要在别处解决。是慢速页面加载和/或内容闪烁(闪烁)?这个问题反过来与重定向无关,需要以不同的方式解决。这可以通过适当的缓存来解决。或者您是否在重定向时丢失面部消息?通过flash scope使用Flash#setKeepMessages()
。
无关到具体问题,导航案例是soo JSF 1.x.您是否了解新的JSF 2.x implicit navigation功能?确保您正在阅读针对JSF 2.x而不是针对JSF 1.x的最新JSF教程。
如果您按如下方式实施操作方法,则可以完全删除整个<navigation-case>
:
<navigation-rule>