2013-12-10 3 views
0

У меня есть метод кодирования пользовательского рендерера для 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.

ответ

1

Это удивительно. writer.writeAttribute("name", ClientId, null); предполагается бросить IllegalStateException. Что касается startElement и endElement, от javadoc:

startElement... После того, как этот метод был вызван, клиенты могут вызывать writeAttribute() или writeURIAttribute() методов для добавления атрибутов и соответствующих значений. Начальный элемент будет закрыт (то есть, добавлен символ тянущаяся '>') на любой последующий вызов к startElement(), writeComment(), writeText(), endElement(), endDocument(), close(), flush() или write().

+0

_writer.writeAttribute ("name", ClientId, null) предполагается выбросить IllegalStateException_ Why? Этот пример из основного выпуска JavaSerever Faces 3rd edition. _Когда этот метод был вызван, клиенты могут вызвать методы writeAttribute() или writeURIAttribute() для добавления атрибутов и соответствующих значений ._ I.e. мы можем написать атрибут перед вызовом startElement? –

+0

@ St.Antario - javadoc указывает, что это незаконная операция. Вызов 'writeAttribute' перед любым вызовом' startElement' должен вызывать 'IllegalStateException', потому что нет никакого контекста для записываемых атрибутов. Это приведет к недопустимому HTML. Как писатель должен знать, к какому элементу приписываются атрибуты? Я бы не рекомендовал его. В этом нет причин для этого. – kolossus

+0

@ St.Antario вы можете проверить ссылку javadoc в ответе, чтобы подтвердить поведение 'writeAttribute' – kolossus

Смежные вопросы