我正在尝试编写一个渲染器来处理组件placeholder
上的属性<h:inputText>
。在阅读了 JSF 2.0 去除了所需的 HTML5 属性后,我走向了这条路,这似乎是正确的。这是我的自定义渲染器
public class InputRenderer extends com.sun.faces.renderkit.html_basic.TextRenderer{
@Override
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
System.out.println("Rendering :"+component.getClientId());
String placeholder = (String)component.getAttributes().get("placeholder");
if(placeholder != null) {
ResponseWriter writer = context.getResponseWriter();
writer.writeAttribute("placeholder", placeholder, "placeholder");
}
super.encodeBegin(context, component);
}
@Override
public void decode(FacesContext context, UIComponent component) {
super.decode(context, component);
}
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
super.encodeEnd(context, component);
}
}
这个渲染器在 faces config 中注册为
<render-kit>
<renderer>
<component-family>javax.faces.Input</component-family>
<renderer-type>javax.faces.Text</renderer-type>
<renderer-class>com.example.renderer.InputRenderer</renderer-class>
</renderer>
</render-kit>
这可以很好地注册,那里没有问题。
我的意图是处理placeholder
属性,插入它,然后将处理委托给super。我上面的代码不起作用,因为我在错误的地方插入了属性。它必须在writer.startElement('input')
执行后插入。但是,startElement 必须发生在 superencodeBegin()
方法的某个地方。那么如何插入自定义属性(在本例中为“占位符”),然后继续执行流程?
注意:上面的代码确实添加了一个placeholder
属性,但没有添加到我想要的输入组件,它将它写入 Input 的父级(因为我试图在组件本身实际写入流之前写入属性,它将属性应用于当前组件)