如何从另一个JSF页面按下某个按钮返回到同一个JSF页面

Sha*_*aan 4 navigation jsf-2

我有两个JSF页面,假设A和B.从这两个页面A和BI可以导航到页面C.现在页面C中有一个按钮(OK按钮),点击它应该导航回A或B取决于从哪里(A或B),C页被呼叫.任何帮助将深表感谢.

sku*_*sel 6

利用视图参数的解决方案

我们的想法是您可以将当前视图ID作为下一个(目标)页面的get参数传递.从目标页面,您将能够使用它来导航回来.

基本示例:

意见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>
Run Code Online (Sandbox Code Playgroud)

查看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>
Run Code Online (Sandbox Code Playgroud)

页面A/B的豆:

@ManagedBean
@RequestScoped
public class BaseBean {

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

}
Run Code Online (Sandbox Code Playgroud)

页面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;
    }

}
Run Code Online (Sandbox Code Playgroud)

最后要提到的是,视图ID可能 Web浏览器中的URL 不同.

<h:link>在使用时增强解决方案

考虑到BalusC的正确评论和他之前对问题的回答取消按钮在验证错误的情况下不起作用,以防您不需要<h:commandButton>在目标页面中使用,因此不需要做任何业务工作回到上一页时,您基本上可以将工作留给<h:link>.在这种情况下,根本不需要(目标视图的)支持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>
Run Code Online (Sandbox Code Playgroud)