当我点击命令按钮时,我希望我的面板保持可见,并且执行的方法会调用错误消息。
更具体地说,我有一个输入字段的验证器,它应该得到一个日期。如果此日期无效,则支持bean中的validate方法将生成错误消息。使用命令按钮后,应在弹出式面板的输入字段旁边显示。
单击命令按钮会关闭弹出窗口。但是,如果我重新打开它,会显示错误消息,让我想知道为什么它首先关闭,当最大的不满足条件没有得到满足时。
我的xhtml页面:
<h:body>
<h:commandButton id="note" value="Neuer Satz">
<rich:componentControl target="note_panel" operation="show" />
</h:commandButton>
<rich:popupPanel id="note_panel" modal="true" autosized="true"
resizeable="false" header="Neuen Mehrwertsteuersatz vormerken"
domElementAttachment="form">
Gültig ab
<h:inputText id="newVorGueltigAb"
value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10"
validator="#{mehrwertsteuerBean.validateNewDate}" />
<h:message for="newVorGueltigAb" style="color:red" />
<h:commandButton value="Vormerken"
action="#{mehrwertsteuerBean.addSteuersatz()}"
oncomplete="if (#{facesContext.maximumSeverity==null})
#{rich:component('note_panel')}.hide(); return false;" />
<h:commandButton value="Abbrechen"
onclick="#{rich:component('note_panel')}.hide(); return false;" />
</rich:popupPanel>
</h:body>
支持bean中的验证方法:
public void validateNewDate(FacesContext context, UIComponent toValidate,
Object value) {
String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})";
String date = (String) value;
if (date.matches(regex)) {
validNewDate = true;
} else {
validNewDate = false;
String message = "Bitte gültiges Datum eingeben!";
context.addMessage(toValidate.getClientId(context),
new FacesMessage(message));
}
}
答案 0 :(得分:0)
首先,当您希望验证失败时,您必须抛出异常。所以看起来应该是这样的:
public void validateNewDate(FacesContext context, UIComponent toValidate, Object value) {
String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})";
String date = (String) value;
if (!date.matches(regex)) {
String message = "Bitte gültiges Datum eingeben!";
throw new ValidatorException(
new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}
}
如果您这样做,则模型中不会发生任何更改,并且会触发您commandButton
WON&T中的操作。这是JSF验证的正确流程。
第二件事。您必须手动处理验证错误。要检查我是否有错误,请使用此功能:
public boolean isNoErrorsOccured() {
FacesContext facesContext = FacesContext.getCurrentInstance();
return ((facesContext.getMaximumSeverity() == null) ||
(facesContext.getMaximumSeverity()
.compareTo(FacesMessage.SEVERITY_INFO) <= 0));
}
这样你的a4j:commandButton
可能如下所示:
<a4j:commandButton value="Vormerken" execute="note_panel"
action="#{mehrwertsteuerBean.addSteuersatz}"
render="note_panel"
oncomplete="if (#{facesHelper.noErrorsOccured}) {#{rich:component('note_panel')}.hide();}
else { console.log('OMG! I\'ve got an error!'); }" />
<强>更新强>
所有应该看起来像这样:
<rich:popupPanel id="note_panel" modal="true" autosized="true" resizeable="false"
header="Neuen Mehrwertsteuersatz vormerken" domElementAttachment="body">
Gültig ab
<h:form>
<h:inputText id="newVorGueltigAb" value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10"
validator="#{mehrwertsteuerBean.validateNewDate}" />
<h:message for="newVorGueltigAb" style="color:red" />
<a4j:commandButton value="Vormerken" execute="@form" action="#{mehrwertsteuerBean.addSteuersatz}"
render="@form"
oncomplete="if (#{mehrwertsteuerBean.noErrorsOccured}) {#{rich:component('note_panel')}.hide();}" />
<h:commandButton value="Abbrechen"
onclick="#{rich:component('note_panel')}.hide(); return false;" />
</h:form>
</rich:popupPanel>
注意:
<h:form>
!!! render
属性,因为您必须在验证错误时呈现面板。action
末尾没有括号。execute
属性设置为仅弹出。这将导致整个表单中的其他字段都不会更新。h:form
位于弹出窗口内,我已将domElementAttachment
更改为正文。