显示JSF错误消息

问题描述 投票:4回答:1

我正在使用没有战斧和其他库的JSF Myfaces Impl 1.2:

我使用不同的样式和图像来显示JSF错误消息,请在示例下面找到。

<h:panelGroup rendered="${adminBean.showErrorIcon==2}">
<table width="375" align="center" class="InfoMsg" border="1"
    cellspacing="0" cellpadding="0">
    <tr>
    <td>
    <table width="375" align="center" class="InfoMsg" border="0">
        <tr>
            <td width="50"><img src="static/images/info_icon.gif"
                width="40" height="40" border="0" /></td>
            <td width="325" align="left"><h:messages layout="table"
                errorClass="InfoMsg" /></td>
        </tr>
    </table>
    </td>
</tr>
</table>

基于Backing Bean的int变量,我在屏幕上显示差异图像和相应的FacesMessage(仅2种情况-错误或信息。

我正在使用下面的代码来设置Backing Bean的变量

//Checking if there are messages!
    log.debug("Checking if there are messages to be shown ]");
    if(getShowErrorIcon()==99){//Set only if the value is still the default :
        log.debug("getShowErrorIcon was DEFAULT - Changing it ]");
        Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();
        if(messages != null && getShowErrorIcon()==99){//Set Error/Info for messages that are not added here :
            while(messages.hasNext()){
                log.debug("There are ***messages***");
                FacesMessage aMessage =(FacesMessage) messages.next();
                if(aMessage.getSeverity().compareTo(FacesMessage.SEVERITY_ERROR)==0){
                    setShowErrorIcon(1);
                    break;//just once is enough
                }
                if(aMessage.getSeverity().compareTo(FacesMessage.SEVERITY_INFO)==0){
                    setShowErrorIcon(2);
                    break;
                }
            }
        }
    }//if it is not default, then something has been set already, why again?

现在,我遇到的问题是,有MyFacesImpl添加的FacesMessage(s)-例如required = true和在PROCESS_VALIDATION阶段添加的自定义验证器消息,由于我的整数变量,这些未显示在屏幕上没有设置Backing Bean的,并且因为没有调用INVOKE_APPLICATION阶段(这意味着没有调用上面的代码!!!)

我该如何解决?或最好的方法是什么/将上面的检查代码放在哪里的最佳位置?

感谢您的帮助。谢谢!

css jsf
1个回答
11
投票

我不确定,但这看起来似乎不必要地过于复杂。要根据消息的严重性更改图标/样式,只需使用CSS功能即可。您可以使用infoClasserrorClass<h:messages>属性根据消息的严重性指定不同的CSS类,并且可以将图标指定为CSS背景图像。

JSF:

<h:messages id="messages" layout="table" infoClass="info" errorClass="error" />

CSS:

#messages .info td {
    background: url('info.gif') no-repeat left center;
    padding-left: 15px;
}
#messages .error td {
    background: url('error.gif') no-repeat left center;
    padding-left: 15px;
}

<h:messages layout="table">本身已经呈现HTML <table>。我认为围绕它的整个表格也是不必要的。只需按照通常的CSS方式相应地应用样式即可。

#messages {
    width: 375px;
    margin: 0 auto;
    border: 1px black solid;
    border-collapse: collapse;
}

另请参见:


更新:根据评论,您正在寻找类似这样的内容:

<h:messages layout="table" styleClass="messages info" infoClass="info" errorClass="error" />
<h:messages layout="table" styleClass="messages error" infoClass="info" errorClass="error" />

使用CSS:

.messages {
    width: 375px;
    margin: 0 auto;
    border-collapse: collapse;
    border: 1px black solid;
}
.messages.info {
    background: url('info.gif') no-repeat left center;
}
.messages.error {
    background: url('error.gif') no-repeat left center;
}
.messages.info tr.error, .messages.error tr.info {
    display: none;
}
.messages td {
    padding-left: 15px;
}

这显示了两个单独的消息表,一个用于info,另一个用于error消息,每个消息表的左中心都有一个图标。

© www.soinside.com 2019 - 2024. All rights reserved.