Я пытаюсь написать средство визуализации, которое будет обрабатывать атрибут 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);
}
}
И этот рендерер зарегистрирован в конфигурации лица как
<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
, вставить его, а затем делегировать обработку супер. Мой код выше не работает, потому что я вставляю атрибут в неправильном месте. Он должен быть вставлен после выполнения writer.startElement('input')
. Однако startElement должен происходить где-то в методе супер encodeBegin()
. Итак, как мне вставить пользовательский атрибут (в данном случае «заполнитель»), а затем продолжить поток выполнения?
NB. Приведенный выше код добавляет атрибут placeholder
, но не к компоненту ввода, который я намереваюсь. Он записывает его в родительский элемент ввода (поскольку я пытаюсь написать атрибут до того, как сам компонент фактически записывается в поток, он применяет атрибут к текущему компоненту)