JSF2 h:消息未显示在其特定字段

时间:2016-07-04 09:59:50

标签: jsf javabeans message

我想在h:inputText字段旁边显示消息,但它们不会在那里显示,而是显示在全局消息的字段中。

消息字段通过绑定标记绑定到inputText,但是当我在我的支持bean中使用getClientId()调用它们时,返回的id似乎是错误的。我认为这会导致消息显示在全局字段中。

可以在下面的链接图片中查看。

Display of the website

我的页面:

<a4j:outputPanel id="editPanel">
        <a4j:queue requestDelay="300" ignoreDupResponses="true" />
        <table>
            <tr>
                <td>Kostenstelle</td>
                <td><h:inputText id="kst" inputType="text" placeholder=""
                        value="#{kostenstellenBean.kst}" label="Kostenstelle"
                        maxlength="5" binding="#{kostenstellenBean.kstInput}">
                        <a4j:ajax event="keyup" render="buttonPanel kstMessage" />
                    </h:inputText></td>
                <td><h:message id="kstMessage" for="kst" /></td>
            </tr>
            <tr>
                <td>Bezeichnung</td>
                <td><h:inputText id="bezeichnung" inputType="text"
                        placeholder="" value="#{kostenstellenBean.bezeichnung}"
                        label="Bezeichnung" maxlength="20"
                        binding="#{kostenstellenBean.bezeichnungInput}">
                        <a4j:ajax event="keyup" render="buttonPanel bezeichnungMessage" />
                    </h:inputText></td>
                <td><h:message id="bezeichnungMessage" for="bezeichnung" /></td>
            </tr>
            <tr>
                <td>BA</td>
                <td><h:inputText id="ba" inputType="text" placeholder=""
                        value="#{kostenstellenBean.ba}" label="BA" maxlength="3"
                        binding="#{kostenstellenBean.baInput}">
                        <a4j:ajax event="keyup" render="buttonPanel baMessage" />
                    </h:inputText></td>
                <td><h:message id="baMessage" for="ba" /></td>
            </tr>
            <tr>
                <td>BK</td>
                <td><h:inputText id="bk" inputType="text" placeholder=""
                        value="#{kostenstellenBean.bk}" label="BK" maxlength="3"
                        binding="#{kostenstellenBean.bkInput}">
                        <a4j:ajax event="keyup" render="buttonPanel bkMessage" />
                    </h:inputText></td>
                <td><h:message id="bkMessage" for="bk" /></td>
            </tr>
            <tr>
                <td>BL</td>
                <td><h:inputText id="bl" inputType="text" placeholder=""
                        value="#{kostenstellenBean.bl}" label="BL" maxlength="3"
                        binding="#{kostenstellenBean.blInput}">
                        <a4j:ajax event="keyup" render="buttonPanel blMessage" />
                    </h:inputText></td>
                <td><h:message id="blMessage" for="bl" /></td>
            </tr>
            <!-- 
            <h:inputHidden id="index" inputType="text" placeholder=""
                value="#{kostenstellenBean.index}" label="Index" />
            <h:inputHidden id="row" inputType="boolean" placeholder=""
                value="#{kostenstellenBean.rowSelected}" label="Index" />
                 -->
        </table>
        <rich:panel id="buttonPanel">
            <bwf:commandButton id="save" value="Speichern"
                disabled="#{!kostenstellenBean.validateData()}">
                <rich:componentControl target="confirmation_save" operation="show" />
            </bwf:commandButton>
            <bwf:commandButton id="edit" value="Ändern"
                disabled="#{!kostenstellenBean.rowSelected or !kostenstellenBean.validData}">
                <rich:componentControl target="confirmation_edit" operation="show" />
            </bwf:commandButton>
            <bwf:commandButton id="delete" value="Löschen"
                disabled="#{!kostenstellenBean.rowSelected}">
                <rich:componentControl target="confirmation_delete"
                    operation="show" />
            </bwf:commandButton>
            <h:messages />
        </rich:panel>
    </a4j:outputPanel>

我在支持bean中的验证方法:

public boolean validateData() {
    boolean valid = true;
    String message;
    FacesContext context = FacesContext.getCurrentInstance();
    if (kst == 0) {
        message = "Kostenstelle ungültig! ";
        context.addMessage(kstInput.getClientId(), new FacesMessage(message
                + kstInput.getClientId()));
        valid = false;
    }
    if (bezeichnung == null || bezeichnung.isEmpty()) {
        message = "Bezeichnung muss vorhanden sein!";
        context.addMessage(bezeichnungInput.getClientId(),
                new FacesMessage(message));
        valid = false;
    }
    if (ba + bk + bl != 100) {
        message = "Die Summe aller Verteilungsschlüssel muss 100 ergeben! ";
        context.addMessage(baInput.getClientId(), new FacesMessage(message));
        valid = false;
    }
    validData = valid;
    return valid;
}

所有这些输入字段根据输入更改命令按钮的可用性。如果无效,则应禁用命令按钮。这项工作到目前为止。

问题是在支持bean中调用的消息不会显示在我通过绑定和getClientId()寻址的输入字段旁边,而是显示在命令按钮下的全局消息字段中(此字段应该是正确显示所有消息后删除。)。

希望有人可以指出我犯的错误或告诉我逻辑上的缺陷。

1 个答案:

答案 0 :(得分:0)

我通过尝试不同的方法来解决问题。

现在我正在使用前两个输入字段的必需属性,该字段不应为空,导致错误消息显示在指定的消息字段中。

对于其他三个输入字段,辅助bean中的方法检查它们的总和是否等于100,如果不是只显示全局消息。