JSF - Substituir a arvore de componentes

Bom dia pessoal,

Estou estudando jsf e me deparei com a seguinte situação:

Eu tenho uma pagina jsf com um inputText e um command button. Preciso que quando o usuário digitar um texto e submeter através do botão, minha arvore de componentes seja substituida por uma criada dinamicamente de acordo com o texto digitado, e depois de substituir a arvore, renderizar a nova arvore de componentes.

É possível fazer isso? o meu principal problema é descobrir aonde eu devo substituir a arvore, e como eu falo pro jsf que ele precisa renderiza-la novamente.

Pensei em uma solução utilizando um view hanlder customizado, que de acordo com o id da UIViewRoot ele constrói a arvore dinamicamente. Isto é realmente possivel?

Eu poderia tambem tentar registrar um phase listener que de acordo com os valores aplicados no meu bean (neste caso o valor do inputText), criaria uma arvore nova antes da etapa de renderizar resposta?

Conto com a ajuda de vocês, espero ter conseguido descrever bem o problema que desejo resolver.

Valeu pessoal

sim, é possivel …
basta no f:view você colocar um binding pra uma propriedade de um managed bean, a propriedade tem que ser d tipo UIViewRoot, ai é só no proprio metodo de action alterar a arvore de componentes a vontade …

Hmm valeu pela resposta…

É muito mais simples do que eu pensava então (ainda bem).

Tentei fazer isso aqui porem não consegui “bindar” com meu backing bean.
na verdade o parametro binding nem aparece no code-completion dentro da tag <f:view>. A unica disponível e locale.
A exceção lançada foi:

[code]type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /pagina_inicial.jsp(11,0) Attribute binding invalid for tag view according to TLD
javax.faces.webapp.FacesServlet.service(FacesServlet.java:152)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)

root cause

javax.faces.FacesException: /pagina_inicial.jsp(11,0) Attribute binding invalid for tag view according to TLD
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:422)
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
[/code]
Alguem sabe porque isso acontece?
pode ser por causa do MyFaces?

Valeu

tenta fazer bind do form então, esqueci que o fview não tinha atributo bind …
ou então tu pode também pegar o viewroot a partir do FacesContext

Valeu, assim quase deu certo, o que acontece é que eu peguei meu formulário, limpei os filhos e adicionei outros componentes, porem isso foi feito em um método do meu backingbean… e o formulário não foi recarregado, portanto os componentes que eu inseri não foram renderizados.

Alguma idéia de como forçar a leitura da arvore novamente?

Os componentes que eu inseri como child do meu formulário, deveriam ter aparecido direto no browser, só de inseri-los na arvore, ou eu preciso chamar algum método pra mandar ele renderizar novamente? eu ja tentei de tudo aqui

olha o que ja tentei fazer

setar rendered false na arvore
forçar o restore da view assim:

app.getViewHandler().restoreView(faces, ((UIViewRoot)formulario.getParent()).getViewId());
app.getViewHandler().renderView(faces,(UIViewRoot)formulario.getParent());

E até agora nada deu certo.

Ajudem por favor

Bom pessoal, descobri a solução do problema, estou postando aqui para facilitar caso alguem tenha o mesmo problema que eu.

O problema é o seguinte, quando você adiciona componentes dinamicamente na arvore ou no form, existe uma propriedade “RendersChildren” nos componentes containers, que não é possível setar.
O problema é que o valor padrão pra essa propriedade é false no formulário e na arvore, então se você adicionar os componentes direto no formulário ou na arvore, eles não serão renderizados. Porem, o valor padrão dessa propriedade nos outros componentes é TRUE, então, se você adicionar os componentes em qualquer outro componente container (HtmlPanelGrid por exemplo), eles serão renderizados.

Valeu Urubatan que me ajudou com isso, espero que esse tópico ajude mais pessoas que queiram adicionar componentes dinamicamente às suas paginas.

Falou

Valeu meu velho, seu objetivo foi alcançado e ajudou bastante.
:smiley: