我正在使用 jsf2 应用程序,但地址栏中显示的页面名称有问题。当我导航到另一个页面时,地址栏中有上一页的名称。
谢谢。
这是发生的,因为在 JSF 中,当您导航到新页面时,服务器正在执行到新页面的转发。浏览器不知道转发并显示旧网址。要使服务器执行重定向而不是转发,您必须:
如果您使用导航规则,<redirect/>
请在每个规则中添加一个:
<navigation-rule>
<from-view-id>/pages/from.xhtml</from-view-id>
<navigation-case>
<from-outcome>to</from-outcome>
<to-view-id>/pages/to.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
如果要从 bean 方法返回结果,?faces-redirect=true
请在结果中添加 a:
public String navigate() {
return "/pages/to?faces-redirect=true";
}
那是因为您使用 POST 而不是 GET 进行页面到页面导航,而 JSF 默认提交到与您使用的完全相同的视图<h:form>
。在任何情况下,使用 POST 进行页面到页面导航都是一种非常糟糕的方法。它不仅对用户不友好(它不能添加书签和令人困惑),而且对 SEO 也不友好(搜索机器人不遵循<form>
操作)。
要解决此问题,您必须停止使用<h:commandLink>
页面到页面导航。改为使用<h:link>
。
<h:link value="Go to next page" outcome="nextpage" />
这只会渲染一个
<a href="/contextpath/nextpage.xhtml">Go to next page</a>
这是完美的书签,用户友好和搜索引擎优化友好。
当您由于真正的 POST 表单提交而导航到不同的页面时,我还将通过返回null
或替换它,void
并在同一视图中有条件地呈现结果/消息。或者,如果结果应该是可收藏的(例如搜索结果),您应该使用普通链接或普通链接,<form>
而不是在目标视图中<h:form>
使用。<f:viewParam>