У меня есть метод кодирования пользовательского рендерера для UIInput
.encode метод рендеринга
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
String ClientId = component.getClientId(context);
String hint = (String) component.getAttributes().get("placeholder");
String styleClass = (String) component.getAttributes().get("styleClass");
String value = (String) component.getAttributes().get("value");
ResponseWriter writer = context.getResponseWriter();
writer.writeAttribute("name", ClientId, null);
writer.writeAttribute("placeholder", hint, "hint");
writer.startElement("input", component);
writer.writeAttribute("class", styleClass, "styleClass");
writer.writeAttribute("value", ((UIInput) component).getValue(), "value");
writer.endElement("input");
}
Я пишу startElement
после того, как я написал 2 атрибуты, но это работает. То есть как startElement
способ делает работа? Мы можем startElement
в любом месте до endElement
и после endElement
предыдущего element
.
_writer.writeAttribute ("name", ClientId, null) предполагается выбросить IllegalStateException_ Why? Этот пример из основного выпуска JavaSerever Faces 3rd edition. _Когда этот метод был вызван, клиенты могут вызвать методы writeAttribute() или writeURIAttribute() для добавления атрибутов и соответствующих значений ._ I.e. мы можем написать атрибут перед вызовом startElement? –
@ St.Antario - javadoc указывает, что это незаконная операция. Вызов 'writeAttribute' перед любым вызовом' startElement' должен вызывать 'IllegalStateException', потому что нет никакого контекста для записываемых атрибутов. Это приведет к недопустимому HTML. Как писатель должен знать, к какому элементу приписываются атрибуты? Я бы не рекомендовал его. В этом нет причин для этого. – kolossus
@ St.Antario вы можете проверить ссылку javadoc в ответе, чтобы подтвердить поведение 'writeAttribute' – kolossus