利用视图参数的解决方案
这个想法是,您可以将当前视图 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>
View 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;
}
}
最后要提到的是,view id 可能differ来自网络浏览器中的 URL。
仅当解决方案增强<h:link>
is used
考虑到 BalusC 的正确评论以及他之前对该问题的回答验证错误时取消按钮不起作用 https://stackoverflow.com/questions/13148566/cancel-button-doesnt-work-in-case-of-validation-error/13149506#13149506,以防您不需要雇用<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>