Jsf 装饰渲染器

Jsf 装饰渲染器,jsf,Jsf,我想在简单的文本输入中添加HTML5属性。因此,我想装饰h:inputText的标准渲染器。我的解决方案是基于从com.sun.faces.renderkit.html_basic.textrender继承而来的,它是Mojarra特有的。有没有更好的方法来装饰现有的渲染器,而不必绑定到特定的实现,也不必重新实现基本渲染器的功能 到目前为止,我的解决方案如下: @FacesRenderer(componentFamily=Html5InputRenderer.COMPONENT_FAMILY,

我想在简单的文本输入中添加HTML5属性。因此,我想装饰h:inputText的标准渲染器。我的解决方案是基于从com.sun.faces.renderkit.html_basic.textrender继承而来的,它是Mojarra特有的。有没有更好的方法来装饰现有的渲染器,而不必绑定到特定的实现,也不必重新实现基本渲染器的功能

到目前为止,我的解决方案如下:

@FacesRenderer(componentFamily=Html5InputRenderer.COMPONENT_FAMILY, rendererType=Html5InputRenderer.COMPONENT_TYPE)
public class Html5InputRenderer extends TextRenderer {

public static final String COMPONENT_FAMILY = "javax.faces.Input";

public static final String COMPONENT_TYPE = "javax.faces.Text";

public static final String RENDERED_TYPE_NAME = "renderedType";

@Override
public void encodeBegin(final FacesContext context, final UIComponent component) throws IOException {

    if (component.getAttributes().containsKey(RENDERED_TYPE_NAME)) {

        ResponseWriter writer = context.getResponseWriter();
        StringWriter buffer = new StringWriter();

        String replacement;

        try {
            ResponseWriter clonedWriter  = writer.cloneWithWriter(buffer);
            context.setResponseWriter(clonedWriter);
            super.encodeBegin(context, component);

            String renderedMarkup = buffer.toString();

            // do some stuff with markup rendered by the basic renderer

            clonedWriter.close();

            if (null != replacement) {
                writer.write(replacement);
            }

        } finally {
            context.setResponseWriter(writer);
        }

    } else {
        super.encodeBegin(context, component);
    }
}

Thx,DS

您可以通过以下方式装饰渲染器。为此,请使用公共构造函数创建一个,该构造函数接受类型为
RenderKitFactory
的参数。在
faces config.xml
中定义新的
RenderKitFactory
。在初始化期间,JSF框架将把先前配置的
RenderKitFactory
传递给构造函数


有关更多详细信息,请参阅。

我明白了。我可以使用原始RenderKitFactory和RenderKit来获取原始渲染器的实例。然后将渲染委托给渲染器实例。Thx,那应该可以了。