JSF 2 - Composição de páginas via ui:include e Ajax

22 respostas
B

Prezados,

Tenho uma página de listagem de registros, e nela um botão cadastrar. Este botão chama um dialog. Esse dialog está incluído na página de listagem via ui:include.

Quero após salvar o registro no dialog, atualizar a página de listagem. Então no botão salvar do dialog fiz o seguinte:

<p:commandButton id="btn_salvar_fiscal_envolvido" type="submit" action="#{envolvidoBean.salvar}" value="Salvar" update="frm_lista_envolvido" />

Porém é lançada a exception:

javax.servlet.ServletException: Cannot find component with identifier "frm_lista_envolvido" in view.] with root cause

Como sou novo no JSF 2 gostaria de saber se o caminho seria mais ou menos este…

Obrigado :wink:

22 Respostas

O

Não seria o ID do form que esta faltando?

B

Olá! Pior que não… O id do form está setado…

O

Coloca todo o código da pagina…

B

Opá. Segue partes relevantes:

Página de listagem:

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">		
<ui:composition>
	<ui:include src="fiscal_envolvido.xhtml" />	

	<h:form id="frm_lista_efetivo_acao_fiscalizatoria" prependId="false">
		<p:dataTable var="envolvido" value="#{acaoFiscalizatoriaEfetivoBean.fiscaisEnvolvidos}" paginator="true" rows="10"
			paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
			rowsPerPageTemplate="5,10,15" emptyMessage="#{msg.aie_info_nenhum_registro_encontrado}">
                  
               ....

Dialog:

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">
<h:body>
	<p:dialog header="Cadastro de Efetivo"
		widgetVar="dlg_cadastrar_fiscal_envolvido" modal="true"
		resizable="false">

		<p:messages showDetail="false" autoUpdate="true" />

		<h:form id="frm_cadastro_fiscal_envolvido" prependId="false">
			
			<p:fieldset legend="Filtro">
				<h:panelGrid columns="2" cellpadding="2">
					<h:outputText value="Digite o nome do Fiscal para pesquisa:" />
					<h:outputText />
					
					<p:autoComplete id="auto_complete_fiscal_envolvido"
						value="#{fiscalEnvolvidoBean.fiscalSelecionado}"
						completeMethod="#{fiscalEnvolvidoBean.completaNomeFiscal}"
						minQueryLength="2" queryDelay="600" forceSelection="true"
						var="fiscal" itemLabel="#{fiscal.pessoaFisica.pessoa.nome}"
						itemValue="#{fiscal}" size="72"
						title="#{msg.aie_tooltip_autocomplete_municipio}"
						converter="fiscalConverter" />
					
					<p:commandButton id="btn_selecionar_fiscal_envolvido" value="Selecionar" update="panel_fiscal_envolvido" />		
				</h:panelGrid>					
			</p:fieldset>				 	
							
			<br />		
		
			
			<p:fieldset legend="Fiscal Envolvido">							
				<h:panelGrid id="panel_fiscal_envolvido" columns="8" cellpadding="2">						
					<h:outputText value="Nome:" />
					<p:inputText id="input_nome_fiscal" value="#{fiscalEnvolvidoBean.fiscalSelecionado.pessoaFisica.pessoa.nome}" disabled="true" style="width: 220px;" />		
					 
					<h:outputText value="Matrícula:" />
					<p:inputText id="input_matricula_fiscal" value="#{fiscalEnvolvidoBean.fiscalSelecionado.matricula}" disabled="true" style="width: 90px;" />
										
					<h:outputText value="CPF:" />
					<p:inputText id="input_cpf_fiscal" value="#{fiscalEnvolvidoBean.fiscalSelecionado.pessoaFisica.cpf}" disabled="true" style="width: 90px;" />
										 
					<h:outputText value="Nº Portaria Designação:" />
					<p:inputText id="input_portaria_fiscal" value="#{fiscalEnvolvidoBean.fiscalSelecionado.sequenciaPortaria}" disabled="true" style="width: 90px;" />				
				</h:panelGrid> 		

				<h:panelGrid columns="2" cellpadding="2">
					<h:outputText value="Grau de Envolvimento: *" />
					<p:selectOneMenu id="select_grau_envolvimento_fiscal" value="#{fiscalEnvolvidoBean.grauEnvolvimentoSelecionado}" converter="grauEnvolvimentoConverter" style="width:286px;">
						<f:selectItem itemLabel="#{msg.aie_opcao_combo_selecione}" itemValue="" />
						<f:selectItems value="#{fiscalEnvolvidoBean.grauEnvolvimentoSelect}" />
					</p:selectOneMenu>
				</h:panelGrid>
	
				<h:panelGrid columns="1" cellpadding="2">
					<h:outputText value="Observação:" />
					<p:inputTextarea id="input_textarea_observacao_fiscal_envolvido" value="#{fiscalEnvolvidoBean.envolvido.descricao}" style="width:850px;height:68px;" effectDuration="400" />
				</h:panelGrid>					
			</p:fieldset>
			
			<br />

			<div align="center">    	 	
				<p:commandButton id="btn_salvar_fiscal_envolvido" type="submit" action="#{fiscalEnvolvidoBean.salvar}" value="Salvar" update="frm_lista_efetivo_acao_fiscalizatoria" />
				<p:commandButton id="btn_limpar_fiscal_envolvido" type="reset" value="Limpar"> 
					<p:ajax update="frm_cadastro_fiscal_envolvido" />
				</p:commandButton>
			</div>
		</h:form>
	</p:dialog>
A

Pelo o que eu entendi, vc está tentando atualizar o form da Página de Listagem… caso seja isso, no seu dialog na linha 28 dá um update em frm_lista_efetivo_acao_fiscalizatoria e não panel_fiscal_envolvido… mas se a intenção é mesmo atualizar o panel_fiscal_envolvido, aconselho vc atualizar o form em que ele está dentro, que no caso é: frm_cadastro_fiscal_envolvido

O

é isso que o andii.brunetta falou

tenta colocar update="@all"

B

Olás!

Então, creio que vcs fizeram um pequena confusão. O dialog possui um autocomplete que quando um item é selecionado atualiza alguns campos dentro do dialog via ajax. Isto já funciona bacana. A questão mesmo é quando clicar no botão salvar do dialog atualizar o form da outra tela, sacaram?

E

Voce esta usado o Primefaces 3.1. Tenta usa o update=":frm_lista_envolvido".
update=":< form >: "

A

orlandogpe:
é isso que o andii.brunetta falou

tenta colocar update="@all"

eii… é A andii! rsrs

O

Sorry! rsrs

B

Edson Donizete:
Voce esta usado o Primefaces 3.1. Tenta usa o update=":frm_lista_envolvido".
update=":< form >: "

Olá Edson!

Cara, infelizmente deu o mesmo erro:

Cannot find component with identifier ":frm_lista_efetivo_acao_fiscalizatoria" in view.
B

Tentei também usando o update="@form". Não deu erro, mas também não funcionou…

Vcs sabem se da forma como estou tentando realmente é possível? Por que dos exemplos que encontrei, vi o dialog dentro do mesmo form… mas no meu caso não atende, pois uso a tela do dialog em vários outros lugares.

O

Opa fiz um teste aqui e funcionou, so que eu uso o rich faces.

Fiz um teste simples:

Tipo: na pagina que tem o botao (Dialog no seu caso), u mandei rederizar o componente e nao o form todo, da pagina que foi feita o inlude.

Como eu trabalho com o RichFaces, nao sei se vai funcionar com o prime.

Flww

E

Que bom, e que comecei a testa o PrimeFaces 3.1 e sempre tenho que fazer isso para conseguir fazer atualização.

B

orlandogpe:
Opa fiz um teste aqui e funcionou, so que eu uso o rich faces.

Fiz um teste simples:

Tipo: na pagina que tem o botao (Dialog no seu caso), u mandei rederizar o componente e nao o form todo, da pagina que foi feita o inlude.

Como eu trabalho com o RichFaces, nao sei se vai funcionar com o prime.

Flww

Fala Orlando! Muito obrigado pela ajuda…

Poderia postar o código só para eu ter como referência?

Vlws :wink:

O

Fiz sem nenhum framework... apenas com o componentes e ajax nativos . (Com rich faces tb deu certo)

Como disse é um bem simples, mas serve de base para fazer outra coisa.

Página que faz o include e tem o botao.
<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>        
        <h:form>
            <ui:include src="include.xhtml"/><br/><br/>
            
            <h:outputText value="Pagina do botao:"/>
            <h:commandButton value="Submit"  action="#{managedBean.gerarRandom()}">
                <f:ajax render="numeroRandom" />
            </h:commandButton>
        </h:form>
    </h:body>
</html>
Página que tem o componente a ser atualizado: (include.xhtml)
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>TODO supply a title</title>
    </h:head>
    <h:body>
        <div>Página Incluída</div>
        <h:outputText value="Componente a ser atualizado: "/>
        <h:outputText id="numeroRandom" value="#{managedBean.numeroRandom}"/>
    </h:body>
</html>
Managed Bean
package pacote;

import java.util.Random;

@javax.faces.bean.ManagedBean
@javax.faces.bean.SessionScoped
public class ManagedBean {
    private int numeroRandom;

    public int getNumeroRandom() {
        return numeroRandom;
    }

    public void setNumeroRandom(int numeroRandom) {
        this.numeroRandom = numeroRandom;
    }
    
    public void gerarRandom(){
        numeroRandom = new Random().nextInt();
    }
}

Se quiser passa o email q tem mando o projeto.
Flww

B

Vlw Orlando.

Muito obrigado :wink:

B

Galera,

Depois de penar muito, descobri que o erro é devido à um bug do PRIMEFACES, bastante relatado no forúm deles, porém sem solução até o momento. Segue apenas alguns posts:

http://forum.primefaces.org/viewtopic.php?f=3&t=15344
http://forum.primefaces.org/viewtopic.php?f=3&t=15344
http://forum.primefaces.org/viewtopic.php?f=3&t=17454&start=10

Cara, infelizmente o primefaces tem mais me atrapalhado que ajudado. Utilizo a versão 3.1, mas fiz testes com a 3.0 e a 3.2 RC, e os erros ocorrem em ambas… :cry:

O

Tb tive alguns problemas com o prime faces e perdi muitas hrs de trabalho com uma coisa q nao tinha solução, por fim acabei optanto pelo RichFaces… tem menos componentes mas até o momento achei mais estável.

G

Edson,

Também estou começando no JSF e estou com o mesmo problema, também não sei se isso é possível!

No meu caso, gostaria de criar uma página com o nome de buscaCliente, essa iria buscar os Clientes e devolver o selecionado. Só isso!

e então de qualquer Tela eu poderia chamar essa.Criei um Dialog + um Bean pra esse Dialog!

Nas telas que preciso buscar cliente eu adiciono ela via

<ui:include src=“dialogbuscarcliente.xhtml”/>

<p:commandButton value=“Buscar Cliente” icon=“iconPesquisar” onclick=“dlgBC.show()” />

O Dialog Aparece td certinho, fazendo suas funções… buscando clientes com filtro e etc. mas o que não sei é como o botão deste dialog “Selecionar” vai devolver o cliente para a tela que a chamou!

Andei lendo percebi que existe como salvar variáveis na sessão mas, não sei se isso é uma boa opção.

Existe como fazer isso?

A

ola estou com um problema parecido com este so que não esta funcionando do jeito que foi passo neste forum
so que o que esta acontecendo comigo é o seguinte.

eu estou abrindoo conteudo dam inha grid em um dialo para ser alterado.

ele carrega conteudo normal.

so que quando eu faço alguma alteracao nos campos e clico em atualizar ele não atualiza os dados.

so que se eu apertar f5 e realizar todo o procedimento novamente ele realiza a atualização.

o que pode ser q esta acontecendo???
alguem tem uma solucao…

valeu

J

andreluiz_sh:
ola estou com um problema parecido com este so que não esta funcionando do jeito que foi passo neste forum
so que o que esta acontecendo comigo é o seguinte.

eu estou abrindoo conteudo dam inha grid em um dialo para ser alterado.

ele carrega conteudo normal.

so que quando eu faço alguma alteracao nos campos e clico em atualizar ele não atualiza os dados.

so que se eu apertar f5 e realizar todo o procedimento novamente ele realiza a atualização.

o que pode ser q esta acontecendo???
alguem tem uma solucao…

valeu

Deve colocar isso dentro de um panelGrid ou uma tabela, e ao clicar em atualizar deve dar uma update no panelGrid.

Criado 9 de março de 2012
Ultima resposta 31 de ago. de 2012
Respostas 22
Participantes 7