2009-03-17 3 views
5

У меня есть класс тегов, который расширяет UIComponent и UIOutput. В этом классе у меня есть encodeBegin и encodeEnd, которые я могу использовать в моем контекстном Writer для вывода любого вида html-тега, который я тоже хочу использовать, используя writer.startElement («div», myComponent) и так далее.Как добавить существующие компоненты JSF к моим собственным компонентам?

Моя проблема теперь в том, что мне нужно вставить, например, вместо использования writer.startElement. Я могу сделать это, выполнив getChildren(). Add (HtmlCommandButton button = new HtmlCommandButton()); но когда я делаю это так, я не могу отобразить компонент, где я хочу, чтобы они отображались, как я могу с write.startElement.

Есть ли у кого-нибудь хорошие решения в том, как я могу использовать теги richfaces, теги JSF и т. Д. В моей собственной taglibrary? Короче, что я действительно хочу сделать это в моем encodeBegin:

writer.startElement("a4j:commandButton", myComponent); 
writer.writeAttribite("action", "#{Handler.myAction}", null); 
writer.endElement("a4j:commandButton"); 

Спасибо по заранее

ответ

3

Вы не можете использовать ResponseWriter, как хотите. Два способа я могу представить, как добавлять дочерние элементы управления программным путем либо через привязку (see this answer), либо в том месте, где обычно создаются элементы управления (в JSP, то есть в tag class).

Существует два способа для компонентов JSF содержать другие элементы управления: как дочерние элементы или как именованные грани. Компоненты всегда контролируют, как они визуализируют свои грани; если они должны отдать своих детей, они должны вернуть значение true для getRendersChildren.

Это непроверенный код, но последовательность идет что-то вроде этого:

@Override 
    public boolean getRendersChildren() { 
    return true; 
    } 

    @Override 
    public void encodeBegin(FacesContext context) 
     throws IOException { 
    // should really delegate to a renderer, but this is only demo code 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.startElement("span", this); 
    String styleClass = getStyleClass(); 
    writer 
     .writeAttribute("class", styleClass, "styleClass"); 

    UIComponent headerComponent = getFacet("header"); 
    if (headerComponent != null) { 
     headerComponent.encodeAll(context); 
    } 

    writer.startElement("hr", null); 
    } 

    @Override 
    public void encodeChildren(FacesContext context) 
     throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    for (UIComponent kid : getChildren()) { 
     kid.encodeAll(context); 
     writer.startElement("br", null); 
    } 
    } 

    @Override 
    public void encodeEnd(FacesContext context) 
     throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.endElement("span"); 
    } 
+0

Отличный человек. Я просто испытал это. MyComponent.encodeAll (контекст) был именно тем, что я искал. Большое спасибо! –

1

Не совсем ответ, скорее догадка, но, может быть, вы могли бы расширить один из элементов управления Facelets?

В качестве альтернативы, используйте либо прямолинейные грани, что и есть именно то, что вы хотите, хотя я не использовал его сам. Или вы можете добавить элементы управления UIOutput, где вы хотите, чтобы HTML появлялся и устанавливал значение каждого из HTML, который вы хотите отобразить, - это именно то, что f: verbatim делает под капотом, или, как кажется, из-за исходного кода:)

+0

Да Im уже простирающуюся UIOutput. Я не уверен, что я буду расширять, что дает мне возможность выводить другие компоненты, а не только выводить теги. Спасибо за ответ. –

+0

Я просмотрел некоторые элементы управления и отредактировал вопрос. Я ничего не сделал, вы не могли бы сделать себя с Google, а также на лицах и в лицевых источниках! –

+0

Отлично. Я попробую это как можно скорее (возможно, в течение 48 часов, так как Im не работает в эти два дня). Большое спасибо за ваше время. –

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