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