[Resolvido] jsf2+primefaces e ajax = problemas de execução de metodos

15 respostas
S
Boa tarde a todos ... estou desenvolvendo uma pequena aplicação com jsf2 ,usando os componentes do primefaces porém enfrento alguns problemas.... tenho uma pagina com um formulario e outra pagina com uma lista,eu insiro um funcionario no forumario,vou na lista ele está lá,beleza,porém, quando eu clico pra editar ele,ele popula no meu ManagedBean o funcionario e leva para o formulario,populando todos os inputs,beleza,porém,quando eu tento atualizar o funcionario,não acontece nada,ele não executa o actionListner e modo algum. então tentei colocar a lista e o formulario na mesma pagina e tratar os eventos com ajax,atualmente a pagina está assim
<p:fieldset legend="Adicionar funcionarios" > 
              <h:form>
                <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" /> 
                  	<h:inputText value="#{funcionarioBean.funcionario.id}" />
                <h:panelGrid columns="4"  columnClasses="label, value" styleClass="panelGridCenter">  
                	
                    <h:outputText value="Nome : *" />  
                    <p:inputText required="true" label="nome"  requiredMessage="é necessario digitar o nome"
                            value="#{funcionarioBean.funcionario.nome}" />  
                      
                    <h:outputText value="CPF: *" />  
                    <p:inputMask mask="[CPF removido]" requiredMessage="é necessario digitar o cpf" converter="convertInput" required="true" label="cpf"  
                            value="#{funcionarioBean.funcionario.cpf}"  />  

                    <h:outputText value="Endereço" />  
                    <p:inputText value="#{funcionarioBean.funcionario.endereco}" requiredMessage="é necessario digitar o endereço"
                     required="true" label="endereco" />  
                      
                    <h:outputText value="CEP :* " />  
                    <p:inputMask mask="99.999-999" converter="convertInput"
                     value="#{funcionarioBean.funcionario.cep}" requiredMessage="é necessario digitar o cep" required="true" />  
                    
                    <h:outputText value="Bairro :* " />
                    <p:inputText value="#{funcionarioBean.funcionario.bairro}" required="true" requiredMessage="é necessario digitar o bairro" />
                    
                    <h:outputText value="Cidade : *" />  
                    <p:selectOneMenu required="true" requiredMessage="é necessario escolher uma cidade" value="#{funcionarioBean.funcionario.cidade}">  
		            	<f:selectItem itemLabel="Rio de janeiro" itemValue="Rio de janeiro" />  
		            	<f:selectItem itemLabel="Nilopolis" itemValue="Nilopolis" />
		            	<f:selectItem itemLabel="Caxias" itemValue="Caxias" />
		            	<f:selectItem itemLabel="Pavuna" itemValue="Pavuna" />  
		        	</p:selectOneMenu>
		        	
		        	<h:outputText value="Estado : *" />
		        	<p:selectOneMenu required="true" requiredMessage="é necessario escolher um estado" value="#{funcionarioBean.funcionario.estado}" >
                        <f:selectItem itemLabel="RJ" itemValue="RJ" />
                        <f:selectItem itemLabel="SP" itemValue="SP" />
                        <f:selectItem itemLabel="MG" itemValue="MG" />
                   </p:selectOneMenu>  
              
  
                    <h:outputText value="Email : *" />
                    
                    <p:inputText required="true" label="Email"  
                            value="#{funcionarioBean.funcionario.email}" requiredMessage="é necessario digitar um email" validatorMessage="email invalido" >
                            	<f:validateRegex 
		pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
                             </p:inputText>  
                      
                    <h:outputText value="Telefone :* " />  
                    <p:inputMask mask="([telefone removido]" converter="convertInput" required="true" requiredMessage="é necessario digitar um telefone" value="#{funcionarioBean.funcionario.telefone}"/>  
                     
                
                    <h:outputText value="Perfil : *" />  
                    <p:selectOneMenu required="true" requiredMessage="é necessario escolher um perfil" value="#{funcionarioBean.funcionario.perfil}">  
		            	<f:selectItem itemLabel="Administrador" itemValue="Administrador" />  
		            	<f:selectItem itemLabel="Funcionario" itemValue="Funcionario" />  
		        	</p:selectOneMenu>
                      
                    <h:outputText value="Login :* " />  
                    <p:inputText required="true" requiredMessage="é necessario digitar um login" value="#{funcionarioBean.funcionario.login}"/>
                    
                    <h:outputText value="Senha :*" />  
                    <p:password  value="#{funcionarioBean.funcionario.senha}" required="true" requiredMessage="é necessario escolher uma senha" /> 
                    
                     <p:commandButton value="Submit"   update="@all" process="@form" actionListener="#{funcionarioBean.adicionaAltera}" > 
                     </p:commandButton>
quando eu clico no submit ele salvar o funcionario
public void adicionaAltera(ActionEvent actionEvent){
		EntityManager manager = this.getManager();
		FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
		
		System.out.println(funcionario.getId());
		
		System.out.println(funcionario.getId());
		if(this.funcionario.getId() == 0 ){
			repository.adiciona(funcionario);
			System.out.println("Adicionou");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario inserido com sucesso!")); 
			funcionario = null;
		}else{
			repository.atualiza(funcionario);
			System.out.println("Alterou");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario alterado com sucesso!"));
			funcionario = null;
		}
		
	}

ele recarrega o seguinte dataTable

<p:fieldset legend="Listar funcionarios" >
 		
		<h:form>
		<p:dataTable  var="funcionarios" value="#{funcionarioBean.funcionarios}" paginator="true" rows="8"
		selection="#{funcionarioBean.funcionarioRemover}" rowKey="#{funcionarios.id}" emptyMessage="Sem funcionarios" >  
  
        <f:facet name="header">  
            Lista de todos os usuarios  
        </f:facet>  
  
        <p:column  selectionMode="multiple"> 
        </p:column>  
  		
  		<p:column headerText="id" >
  			#{funcionarios.id}
  		</p:column>
  		
        <p:column headerText="Nome">  
           #{funcionarios.nome}  
        </p:column>  
  
        <p:column headerText="CPF">  
           #{funcionarios.cpf} 
        </p:column>  
  
        <p:column headerText="Endereço">  
            #{funcionarios.endereco} 
        </p:column>  
  
        <p:column headerText="Cidade">  
            #{funcionarios.cidade}
        </p:column>  
        
        <p:column headerText="Estado">  
            #{funcionarios.estado}
        </p:column>  
        
        <p:column headerText="Bairro">  
            #{funcionarios.bairro}
        </p:column>  
        
        <p:column headerText="Telefone">  
            #{funcionarios.telefone}
        </p:column>  
        
        <p:column headerText="cep">  
            #{funcionarios.cep}
        </p:column>  
        
        <p:column headerText="Email">  
            #{funcionarios.email}
        </p:column>  
        
        <p:column headerText="Login">  
            #{funcionarios.login}
        </p:column>  
        
        <p:column headerText="Perfil">  
            #{funcionarios.perfil}
        </p:column>  
  		
  		<p:column headerText="Alterar">
  			<p:commandButton value="alterar" update="@all" process="@form" actionListener="#{funcionarioBean.altera}"/>  
  		</p:column>
  		
        <f:facet name="footer">  
            <p:commandButton value="deletar selecionados" update="@all" process="@form" action="#{funcionarioBean.remove}" />
        </f:facet>  
    </p:dataTable> 
    </h:form>
    </p:fieldset>
até ai beleza,a lista atualiza direitnho,porém quando eu clico para alterar
public void altera(){
		funcionario = (Funcionario) funcionarios.getRowData();
	}

ele popula os inputs do formulario,como eu queria,ai quando eu clico para alterar....
Não acontece nada,nada,nada posso clicar 5,10,30 vezes que ele não executa o metodo de adicionar e alterar
agora se eu der um F5 e clicar,ele altera...
alguem sabe como eu posso resolver isso?
conseguir alterar sem ter que ficar apertando F5?

o managedBean completo

package br.com.loja_games.controle.pessoal;

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import br.com.loja_games.modelo.Funcionario;
import br.com.loja_games.repositorio.FuncionarioRepositoryImpl;

@ManagedBean
@SessionScoped
public class FuncionarioBean {
	 Funcionario funcionario = new Funcionario();
	 DataModel funcionarios;
	 List<Funcionario> funcionarioRemover;
    
	public void adicionaAltera(ActionEvent actionEvent){
		EntityManager manager = this.getManager();
		FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
		
		System.out.println(funcionario.getId());
		
		System.out.println(funcionario.getId());
		if(this.funcionario.getId() == 0 ){
			repository.adiciona(funcionario);
			System.out.println("Adicionou");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario inserido com sucesso!")); 
			funcionario = null;
		}else{
			repository.atualiza(funcionario);
			System.out.println("Alterou");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", "funcionario alterado com sucesso!"));
			funcionario = null;
		}
		
	}
	
	public void remove(){
	
		System.out.println(funcionarios);
		
		for(Funcionario funcionario : funcionarioRemover){
			EntityManager manager = this.getManager();
			FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
			repository.remove(funcionario);
		}
	}
	
	public  DataModel<Funcionario> getFuncionarios(){
		EntityManager manager = this.getManager();
		FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
		funcionarios = new ListDataModel(repository.getLista());
		return funcionarios ;
	}
	
	public void procura(){
	System.out.println("passou por aqui...");
		EntityManager manager = this.getManager();
		FuncionarioRepositoryImpl repository = new FuncionarioRepositoryImpl(manager);
		FacesContext fc = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
		Long id =  Long.parseLong(request.getParameter("id"));
		System.out.println(id);
		funcionario = repository.procura(id);
		request = null;
		System.out.println(funcionario.getNome()); 
		
	}
	
	public void altera(){
		funcionario = (Funcionario) funcionarios.getRowData();
	}
	
	
	private EntityManager getManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		return (EntityManager) request.getAttribute("EntityManager");
	}
	
	
	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}


	


	public void setFuncionarios(DataModel<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public List<Funcionario> getFuncionarioRemover() {
		return funcionarioRemover;
	}

	public void setFuncionarioRemover(List<Funcionario> funcionarioRemover) {
		this.funcionarioRemover = funcionarioRemover;
	}
    
    
}
Obrigado

15 Respostas

drsmachado

O problema está no teu método de edição, então.
Provavelmente, após popular os campos com os dados a serem editados, alguma coisa errada acontece, fazendo com que a requisição não chegue ao método que serve de listener para o evento ajax. Se você der uma estudada em JSF2, conseguirá entender as várias fases e cada um dos erros possíveis em cada parte do ciclo de vida.

S

o que dificulta a resolução do problema é que nem exception no console dispara,simplesmente não acontece nada,é como se eu não tivesse apertado o botão,porem,
quando eu atualizo a pagina,e clico para alterar novamente,ele altera…

drsmachado

Slow17:
o que dificulta a resolução do problema é que nem exception no console dispara,simplesmente não acontece nada,é como se eu não tivesse apertado o botão,porem,
quando eu atualizo a pagina,e clico para alterar novamente,ele altera…

Usa alguma ferramenta como o firebug?

S

não,eu debugo tudo mostrando os dados que estão sendo passados no console,pra ver se está nulo e etc,nem debug do eclipse tenho costume de usar…

drsmachado

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.

S

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…

drsmachado

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…
Já ajuda.
Tente realizar o submit do formulário com o developer tools aberto, na aba network e verifique se ocorre erro. Normalmente algo está errado aí e você consegue identificar.

S

Sugiro que comece a utilizar.
Você precisa ver erros na requisição ajax, que não chegam aos métodos nas classes java e, também, erros que podem ocorrer nas classes java.
O uso de debug é fundamental para quem desenvolve.
Geralmente quando eu to trabalhando com javascript ou css eu uso o developer tools do chrome…
Já ajuda.
Tente realizar o submit do formulário com o developer tools aberto, na aba network e verifique se ocorre erro. Normalmente algo está errado aí e você consegue identificar.
ele recarrega todos os elementos da pagina e não exibe erro nenhum…

S

endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…

drsmachado

Slow17:
endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…

Isso não tem sentido.

S

drsmachado:
Slow17:
endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…

Isso não tem sentido.

eu também acho que não tem sentido,porém é oque está acontecendo…

drsmachado

Slow17:
drsmachado:
Slow17:
endendi qual é mais ou menos o problema,sempre que faz duas chamadas ajax,a primeira funciona,se você tentar chamar em seguida o ajax novamente,ele dá esse problema,
ele chama todos os elementos da pagina porém não processa nada,se você ficar clicando ele vai ficar chamando repetidamente os elementos porém não faz chamada a metodo
nenhum do entitymanager,mas quando você atualiza a pagina,ele volta a funcionar navamente…
vou mudar de versão do prime faces pra ver se resolve isso…

Isso não tem sentido.

eu também acho que não tem sentido,porém é oque está acontecendo…

Tenho quase certeza que não é isso.
Provavelmente você dispara a requisição e ocorre erro em alguma das fases anteriores à atribuição dos valores dos campos aos objetos no managed bean.

S

Eu cliquei no botão de alterar umas 30 vezes e olha quantos elementos ele chamou na pagina…


S

isso sem disparar erro nenhum no console… ai dou um F5 ,clico e pimba,Funcionario alterado com sucesso!

S

ae consegui resolver machado,porém tive que tirar todas as requisições do ajax e fazer com varias paginas,como havia feito antes,porém quando eu realizo o metodo de
alterar eu dou um redirect para a pagina de adicionar ,dai ela já carrega populada porque o funcionario está armazenada não sessão e consegue alterar tranquilo sem dar f5.
antes estava acontecendo algo como request.foward em que o programa executa a mudança de pagina,porém a pagina antiga continua rodando na aplicação,já dando um
redirect o programa deixa de executar a pagina antiga e se concentra só na pagina atual… algo na pagina de listar estava conflitando o metodo de adicionar funcionarios…
enfim obrigado pela ajuda ae …

Criado 6 de setembro de 2013
Ultima resposta 6 de set. de 2013
Respostas 15
Participantes 2