1

我正在使用 jsf2 应用程序,但地址栏中显示的页面名称有问题。当我导航到另一个页面时,地址栏中有上一页的名称。

谢谢。

4

2 回答 2

2

这是发生的,因为在 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";
}
于 2011-09-05T12:34:39.793 回答
2

那是因为您使用 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>

也可以看看:

于 2011-09-05T13:14:22.923 回答