Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 实现返回上一页的commandButton_Jsf_Jsf 2 - Fatal编程技术网

Jsf 实现返回上一页的commandButton

Jsf 实现返回上一页的commandButton,jsf,jsf-2,Jsf,Jsf 2,我想做的是实现一个JSF页面,一旦完成,它将返回到上一个页面。这与@RequestScoped bean有关 名为viewDocument.xhtml的原始页面具有以下内容: <f:metadata> <f:viewParam name="ID" value="#{viewDocument.id}" /> </f:metadata> (bunch of stuff) <h:link outcome="editThingy" value="E

我想做的是实现一个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>

(一堆东西)
这两个按钮(取消或保存)都将返回到returnrequest参数指示的页面,新页面将获得ID request参数,因此它将调出EditThingy处理的相同记录

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

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

这个
应该可以正常工作。您只需要为后续请求保留
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>

更新:根据评论,功能需求现在变得更加明确。cancel按钮也可以按如下方式执行,假设在cancel上根本不需要调用backingbean操作方法:

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

您是否尝试过commandLink,它支持commandButton的f:param或f:setPropertyActionListener?它仍然不适用于我。我得到了正确的导航:“navReturn”将我发送到正确的页面,但从未调用目标页面中的视图参数。浏览器显示带有“editThingy.xhtml?ID=11&Return=viewDoc”的URL,这是我所期望的。你知道下一步要做什么吗?哦,你想要的是
return-navReturn+“?id=“+id+”&faces-redirect=true”?好的,可以了。我认为这确实是JSF规范中的一个漏洞。应通过标记属性或API调用支持重定向。在支持bean中用一个秘密参数编造URL的业务看起来像是糟糕的编码实践。感谢您第一百万次光临。关于标签,有一个用于XML导航案例的
。至于API调用,有一个
ExternalContext#redirect()
<p:button value="Cancel" outcome="#{editThingy.navReturn}" >
    <f:param name="ID" value="#{editThingy.id}" />
</p:button>
return navReturn + "?id=" + id + "&faces-redirect=true";