覆盖JSF Primefaces消息标记

时间:2012-02-12 02:04:56

标签: jsf-2 primefaces

我是否可以覆盖<p:message ../>的默认实现,始终隐式拥有display="text"而不是及时输入?

<p:message for="hotelName" display="text" />

2 个答案:

答案 0 :(得分:4)

您可以为此扩展PrimeFaces'MessageRenderer。只需覆盖encodeEnd()方法,在调用super方法之前设置默认属性。

这是一个自包含的启动示例:

package com.example;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.primefaces.component.message.MessageRenderer;

public class CustomMessageRenderer extends MessageRenderer {

    @Override
    public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {
        component.getAttributes().put("display", "text"); // You might want to check first if it isn't already set.
        super.encodeEnd(facesContext, component);
    }

}

您需要在faces-config.xml中注册如下(不,注释魔法不会覆盖现有的渲染器,这些渲染器本身由XML注册,因此XML是绝对必要的):

<render-kit>
    <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.MessageRenderer</renderer-type>
        <renderer-class>com.example.CustomMessageRenderer</renderer-class>
    </renderer>
</render-kit>

但更容易的是只需要一点点CSS来隐藏图标。

.ui-message-error-icon {
    display: none;
}

根据其他答案的建议创建复合组件并不是一件容易的事,因为for的{​​{1}}目标不包含在同一个组合中。

答案 1 :(得分:0)

我只是为此创建一个Facelet组合组件。