Facelets ui:fragment

6 respostas
J

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:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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">
    <center>
    <h:form>
        <p:commandButton value="teste" action="#{cadastroController.teste}" />
      </h:form>
    </center>
</ui:fragment>

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 ele funciona.

Preciso de ajuda :? :shock:

6 Respostas

Hebert_Coelho

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

J

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

J

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?

Hebert_Coelho

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?

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?

J

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

J

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+

Criado 18 de janeiro de 2013
Ultima resposta 14 de fev. de 2013
Respostas 6
Participantes 3