我有以下问题。我只提供个人识别码时使用表格。我有验证器检查它是否是一个4位数字。然后将提交操作设置为检查数据库中是否存在PIN的方法。如果没有,它会消息=“没有PIN”;我在表单下面的输出标签中使用了该消息。以前它是null,所以那里没有消息。现在它变为“无PIN”但我必须在再次单击提交按钮后清除它,因为当您输入例如“12as”时错误消息不会消失PIN和验证器负责处理它。我该如何实施这种情况?也许在这种情况下使用输出标签是错误的想法?
答案 0 :(得分:3)
您不应该在操作方法中执行验证。你应该使用真正的验证器。
相应地实施Validator
界面。 E.g。
@FacesValidator("pinValidator")
public class PinValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String pin = (String) value;
if (pin == null || pin.isEmpty()) {
return; // Let required="true" deal with it if necessary.
}
if (!pin.matches("\\d{4}")) {
throw new ValidatorException(new FacesMessage("PIN must be 4 digits"));
}
if (!somePinService.exists(pin)) {
throw new ValidatorException(new FacesMessage("PIN is unknown"));
}
}
}
按如下方式使用:
<h:outputLabel for="pin" value="PIN" />
<h:inputText id="pin" value="#{bean.pin}" validator="pinValidator" />
<h:message for="pin" />
验证器异常的faces消息将以与激活验证器的组件关联的<h:message>
结束。
如果您使用ajax提交表单,请不要忘记确保在ajax渲染时也考虑该消息。
无关,JSF <h:outputLabel>
会生成一个HTML <label>
元素,该元素旨在label a form element(例如<input>
,{ {1}}等)。绝对不打算显示任意文本,例如验证消息。我建议暂时放弃JSF并启动learning basic HTML。通过这种方式,您将更好地了解要选择哪些JSF组件以获得所需的HTML输出。
答案 1 :(得分:0)
您可以在验证程序外部使用JSF消息组件: 对于您在表单中输入的消息:
<h:message for="PIN"/>
在您的托管bean中,您可以使用以下方法添加FacesMessage:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN,"No pin summary message","No pin detail message");
FacesContext.getCurrentInstance().addMessage("PIN", message);
此处无需使用outputLabel。