【问题标题】:JSF2 h:message is not displayed in its specific fieldJSF2 h:消息未显示在其特定字段中
【发布时间】:2016-07-04 09:59:49
【问题描述】:

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

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

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

我的页面:

<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() 处理的输入字段旁边,而是在命令按钮下的全局消息字段中显示(这个字段应该被删除所有消息都正确显示。)。

希望有人能指出我犯的错误或告诉我逻辑中的缺陷。

【问题讨论】:

  • faces 消息中的 clientID 是什么?它们是真正完整的正确客户 ID 吗?
  • 当我将它们添加到这样的消息中时:new FacesMessage(message + bezeichnungInput.getClientId()) 它说它们转换为 form:kst、form:bezeichnung 或 form:ba,即使只有唯一的标签a4j:outputPanel 周围是 ui:composition 和 html:body。

标签: jsf javabeans message


【解决方案1】:

我通过尝试不同的方法解决了这个问题。

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

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

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2020-07-19
    • 2021-06-13
    • 2019-11-28
    相关资源
    最近更新 更多