1

我想要做的是实现一个 JSF 页面,一旦完成,它将返回到前一页面。这是@RequestScoped bean。

名为viewDocument.xhtml的原始页面具有以下内容:

<f:metadata>
    <f:viewParam name="ID" value="#{viewDocument.id}" />
</f:metadata>

 (bunch of stuff)

<h:link outcome="editThingy" value="Edit Thingy">
    <f:param name="ID" value="#{viewDocument.doc.id}" />
    <f:param name="Return" value="viewDocument" />
</h:link>

目标页面editThingy.xhtml有自己的支持 bean,如下所示:

<f:metadata>
    <f:viewParam name="ID" value="#{editThingy.id}" />
    <f:viewParam name="Return" value="#{editThingy.navReturn}" />
</f:metadata>

<h:form>

   (bunch of stuff)

   <p:commandButton value="Save" action="#{editThingy.save}" >
      <f:param name="ID" value="#{editThingy.id}" />
   </p:commandButton>
   <p:commandButton value="Cancel" action="#{editThingy.navReturn}" >
       <f:param name="ID" value="#{editThingy.id}" />
   </p:commandButton>

</h:form>

这个想法是两个按钮(取消或保存)都将返回到Return请求参数指示的页面,新页面获取 ID 请求参数,因此它会提取EditThingy处理的相同记录。

BZZZT!p:commandButton执行 POST而不是 GET,因此它不能使用f:param。但是,如果我尝试使用p:button则没有属性可以调用支持 bean!

有什么方法可以实现我想要的吗?

4

1 回答 1

2

应该工作得<f:param>很好。您只需要Return为后续请求保留参数,就像您为ID参数所做的那样,否则在处理表单提交期间它会丢失,因为您的 bean 是请求范围而不是视图范围。

就这样,

<p:commandButton value="Save" action="#{editThingy.save}" >
    <f:param name="ID" value="#{editThingy.id}" />
    <f:param name="Return" value="#{editThingy.navReturn} " />
</p:commandButton>
<p:commandButton value="Cancel" action="#{editThingy.cancel}" >
    <f:param name="ID" value="#{editThingy.id}" />
    <f:param name="Return" value="#{editThingy.navReturn} " />
</p:commandButton>

public String save() { 
    // ...
    return navReturn;
}

public String cancel() { 
    return navReturn;
}

更新:根据评论,功能需求现在变得更加清晰。取消按钮也可以按如下方式完成,假设您在取消时根本不需要调用支持 bean 操作方法:

<p:button value="Cancel" outcome="#{editThingy.navReturn}" >
    <f:param name="ID" value="#{editThingy.id}" />
</p:button>

保存按钮可以返回以下内容:

return navReturn + "?id=" + id + "&faces-redirect=true";
于 2012-10-06T13:44:54.327 回答