【问题标题】:Implementing a commandButton that returns to the previous page实现返回上一页的commandButton
【发布时间】:2012-10-06 04:04:23
【问题描述】:

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

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

【问题讨论】:

  • 你试过commandLink吗,它支持f:param或者f:setPropertyActionListener作为commandButton?

标签: jsf jsf-2


【解决方案1】:

&lt;f:param&gt; 应该可以正常工作。您只需要为后续请求保留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;
}

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

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

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

return navReturn + "?id=" + id + "&faces-redirect=true";

【讨论】:

  • 它仍然不适合我。我得到了正确的导航:“navReturn”将我发送到正确的页面,但从未调用目标页面中的视图参数。浏览器显示带有“editThingy.xhtml?ID=11&Return=viewDoc”的 URL,这是我所期望的。知道接下来要尝试什么吗?
  • 哦,你想要return navReturn + "?id=" + id + "&amp;faces-redirect=true";这样的东西吗?
  • 行了。我认为这确实是 JSF 规范中的一个漏洞。应通过标签属性或 API 调用支持重定向。这种在 backing bean 中使用秘密参数炮制 URL 的业务看起来像是糟糕的编码实践。第百万次感谢。
  • 对于标签,有一个&lt;redirect&gt; 用于XML 导航案例。至于API调用,有一个ExternalContext#redirect()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多