【问题标题】:How to get back to same JSF page on Pressing of some button from another JSF page如何在按下另一个 JSF 页面上的某个按钮时返回相同的 JSF 页面
【发布时间】:2013-02-28 07:49:43
【问题描述】:

我有两个 JSF 页面,假设 A 和 B。从这两个页面 A 和 BI 可以导航到页面 C。现在页面 C 中有一个按钮(确定按钮),单击它应该导航回任一 A或 B 取决于从哪里(A 或 B)调用页面 C。任何帮助将不胜感激。

【问题讨论】:

标签: jsf-2 navigation


【解决方案1】:

利用视图参数的解决方案

这个想法是您可以将当前视图 id 作为下一个(目标)页面的获取参数传递。从目标页面,您将能够使用它来导航。

基本示例:

查看 A 和 B:

<h:body>
    Hello from page A (B)
    <h:link value="Go to page C via link" outcome="target">
        <f:param name="backurl" value="#{view.viewId}"/>
    </h:link>
    <h:form>
        <h:commandButton value="Go to page C via command button" action="#{baseBean.doAction}"/>
    </h:form>
</h:body>

查看 C:

<f:metadata>
    <f:viewParam name="backurl" value="#{backBean.backurl}"/>
</f:metadata>
<h:body>
    Hello from page C
    <h:link value="Go back via link" outcome="#{backBean.backurl}">
    </h:link>
    <h:form>
        <h:commandButton value="Go to page C via command button" action="#{backBean.back}"/>
    </h:form>
</h:body>

页面 A / B 的 Bean:

@ManagedBean
@RequestScoped
public class BaseBean {

    public String doAction() {
        String url = FacesContext.getCurrentInstance().getViewRoot().getViewId();
        return "/target?faces-redirect=true&backurl=" + url;
    }

}

C页的Bean:

@ManagedBean
@RequestScoped
public class BackBean {

    private String backurl;

    public String back() {
        return backurl + "?faces-redirect=true";
    }

    public String getBackurl() {
        return backurl;
    }

    public void setBackurl(String backurl) {
        this.backurl = backurl;
    }

}

最后要提到的一点是,视图 ID 可能与网络浏览器中的 URL不同

仅使用&lt;h:link&gt; 时的解决方案增强

考虑到BalusC的正确评论和他之前对问题Cancel button doesn't work in case of validation error的回答,以防您不需要在目标页面中使用&lt;h:commandButton&gt;,因此在去的时候不需要做任何业务工作返回上一页,您基本上可以将工作留给&lt;h:link&gt;。在这种情况下,根本不需要(目标视图的)支持 bean,并且可以将目标视图的结构最小化为:

<f:metadata>
    <f:viewParam name="backurl"/>
</f:metadata>
<h:body>
    Hello from page C
    <h:link value="Go back" outcome="#{backurl}" rendered="#{not empty backurl}"/>
</h:body>

【讨论】:

  • 请注意,在 C 中 &lt;h:link&gt; 的情况下,整个 bean 是不必要的。只需去掉&lt;f:viewParam&gt;value 属性并使用outcome="#{backurl}"。另见stackoverflow.com/questions/13148566/…
  • @BalusC 当然,但在这种情况下,我们必须删除&lt;f:viewParam&gt; 的值绑定,否则它将为空。啊,编辑,编辑:)
  • 呃,我有没有说别的?
  • @BalusC 顺便问一下,你能看看what's wrong with my solution with internalization problem,因为我不能让它完全工作吗?
  • rendered="#{not empty backurl}" 是什么意思?
【解决方案2】:

你可以在你的 Beanclass 中实现一个属性comesFrom。当导航到页面CA,如果是页面 A,B,如果是页面 B)时,您可以在此属性中提供您来自的页面的名称。
单击页面C 中的“确定”按钮后,您可以检查您的属性comesFrom 并导航回该属性的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多