Facelets ui:fragment

oi pessoal,

estou trabalhando numa aplicação web que utiliza facelets. Mas todas as paginas contem essa estrutura:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./template.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui">
   <ui:define name="content">
          //aqui vai o conteudo da pagina especifica
   </ui:define>
</ui:composition>

acontece que dessa forma, toda atualização ele renderiza a pagina toda. E não era bem esse comportamento esperado.

Eu quero atualizar somente a parte central que está o conteudo. Por isso, substitui por ui:fragment …ficando assim:

[code]<?xml version='1.0' encoding='UTF-8' ?>

<ui:fragment xmlns=“http://www.w3.org/1999/xhtml
xmlns:p=“http://primefaces.org/ui
xmlns:h=“http://java.sun.com/jsf/html
xmlns:ui=“http://java.sun.com/jsf/facelets
xmlns:f=“http://java.sun.com/jsf/core”>

<h:form>
<p:commandButton value=“teste” action="#{cadastroController.teste}" />
</h:form>

</ui:fragment>
[/code]

Eu coloquei somente esse botão para testar se minha requisição chega no controlador.

E no controlador:

public void teste() { System.out.println("testeeeeeeeeeeeeeee"); }

Acontece que mesmo o controlador sendo ViewScoped, SessionScoped, a requisição não chega no método.

Se eu voltar para ui:composite ele funciona.

Preciso de ajuda :? :shock:

Se você quer atualizar apenas um pedaço da página você tem usar Ajax.

E qual o problema de atualizar a página toda em uma navegação? O.o

problema nenhum, mas a intenção nao era essa.

mas a duvida em questão é porque nenhum ação dentro do ui:fragment chega no controller

ah quanto ao ajax, eu uso chamando o process="" e o update="" do primefaces

mas o problema é que não chega a requisição no controller.

E a ideia é atualizar somente a parte do conteudo do sistema deixando o resto (que nao precisa ser renderizado toda vez, ja que não muda nenhuma informação) utilizando o ui:fragment…

já que ele existe porque eu não usaria? por que renderizar toda tela sem necessidade?

[quote=javaCBA]ah quanto ao ajax, eu uso chamando o process="" e o update="" do primefaces

mas o problema é que não chega a requisição no controller.

E a ideia é atualizar somente a parte do conteudo do sistema deixando o resto (que nao precisa ser renderizado toda vez, ja que não muda nenhuma informação) utilizando o ui:fragment…

já que ele existe porque eu não usaria? por que renderizar toda tela sem necessidade?[/quote]Por que utilização em excesso de ajax não é aconselhável, ainda mais para isso que você quer fazer.

Bem, você colocou h:head e h:body?

dentro do fragment nao, já que ele vai ser incluido dentro de uma outra pagina.

mas enfim, consegui resolver.

O problema é que eu tinha varios fragments que iriam compor a pagina principal. Ou seja, um controller principal que controlaria vários fragments (sendo que cada fragment chamaria um controller especifico).
Assim funciona:

<ui:include src="paginainicio.xhtml" rendered="#{principalController.pagina == 'paginainicio.xhtml'l'}"/>
<ui:include src="cadastro.xhtml" rendered="#{principalController.pagina== 'cadastro.xhtml'}"/>
<ui:include src="visualizacao.xhtml" rendered="#{principalController.pagina== 'visualizacao.xhtml'}"/>

Forma antiga que não funcionava:

<ui:include src="#{principalController.pagina}"/>

Pelo que percebi, por ser um fragment e ser chamado dinamicamente…o controller nao era carregado. Por isso não conseguia chegar nenhum evento nele.

Mas especificando cada include…ao carregar a paginas, os controllers ficam disponivel mesmo não tendo a tela renderizada.

Na verdade…o comportamento dentro do servidor tanto do composite quanto do fragment é o mesmo. A diferença é que no fragment por carregar apenas um pedaço da tela, ele não starta nenhum controlador. O ui:composite renderiza a tela toda…forçando o carregamento de outro controller. Por isso funcionava de boa.

No meu caso, essa situação é válida porque são poucos controllers (maximo 5) e a navegação vai ocorrer em apenas um pedaço da tela.

De qualquer forma, valeu

Oi amigo, blz?

Bom, eu gostaria de saber qual especificação JSF que está utilizando, pois não conheço a tag <ui:include /> com a opção de rendered. Geralmente, eu coloco o include em uma tag que seja renderizada via AJAX, por exemplo, um h:panelGroup e verifico no controller se a página que quero renderizar foi selecionada.

Esse código que postou funciona???

Veja esse post, que interessante…

t+