JSF输出标签清晰

时间:2013-05-10 21:53:25

标签: jsf label output clear

我有以下问题。我只提供个人识别码时使用表格。我有验证器检查它是否是一个4位数字。然后将提交操作设置为检查数据库中是否存在PIN的方法。如果没有,它会消息=“没有PIN”;我在表单下面的输出标签中使用了该消息。以前它是null,所以那里没有消息。现在它变为“无PIN”但我必须在再次单击提交按钮后清除它,因为当您输入例如“12as”时错误消息不会消失PIN和验证器负责处理它。我该如何实施这种情况?也许在这种情况下使用输出标签是错误的想法?

2 个答案:

答案 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。