我想要做的是实现一个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>
这个想法是两个按钮(取消或保存)将返回到返回请求参数指示的页面,新页面获取ID请求参数,因此它会提取相同的记录 EditThingy 继续工作。
BZZZT! p:commandButton 执行POST而不是GET,因此无法使用 f:param 。但是,如果我尝试使用 p:button ,则没有属性可以调用支持bean!
有没有办法实现我想要的东西?
答案 0 :(得分: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";