在JSF 2.1 wep app中,我有一个包含commandButton的dataTable列。 commandButton触发的操作可能会引发错误。 我想在没有引发错误的情况下打开一个对话框,或者在另一种情况下打开一个包含错误消息的框。
JSF
<h:form>
<p:dataTable var="foo" value="#{myBean.foos}" >
<p:column>#{foo.id}</p:column>
<p:column>
<p:commandButton title="Action" action="#{myBean.action()}" onComplete="handleResult(xhr, status, args)" >
<f:setPropertyActionListener value="#{foo}" target="#{myBean.selectedFoo}" />
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
的JavaScript
function handleRequest(xhr, status, args) {
if (!args.success) {
displayBox(args.errorMsg);
} else {
displayDialog();
}
}
为myBean
@ManagedBean
@ViewScoped
public class MyBean {
private List<Foo> foos;
private Foo selectedFoo;
public void action() {
try {
// business logic
} catch (Exception ex) {
RequestContext rContext = RequestContext.getCurrentInstance();
rContext.addCallbackParam("success", false);
rContext.addCallbackParam("errorMsg", ex.getMessage());
}
}
}
我能想到的唯一解决方案是使用PrimeFaces'RequestContext.callBackParam()
并编写一个JS函数来读取它并决定打开什么。
有更顺畅的方式吗?如果可能的话,我会考虑利用验证的概念,但我找不到如何拦截JS中的错误的例子。
答案 0 :(得分:2)
规范方法是只添加一个全局面部消息(因此,使用null
客户端ID)。
public void action() {
try {
// business logic
} catch (Exception ex) {
context.validationFailed();
context.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
}
}
(调用FacesContext#validationFailed()
会导致EL中的#{facesContext.validationFailed}
评估true
;通常会设置为ValidatorException
)
然后,要仅显示全局消息的框,只需使用<p:messages globalOnly="true">
。
<p:messages globalOnly="true" autoUpdate="true" />
要显示成功结果的对话框,请在执行successful postback时进行渲染:
<p:outputPanel autoUpdate="true">
<p:dialog visible="true" rendered="#{facesContext.postback and not facesContext.validationFailed}">
A successful postback is performed!
</p:dialog>
</p:outputPanel>
如有必要autoUpdate="true"
替换update="messagesId dialogPanelId"
中的一个或两个组件,只有在按下特定按钮时才会触发。