Ajuda JSF

3 respostas
M

Pessoal,

tenho um problema.
estou construindo uma app com jsf + richfaces e ta acontecendo uma coisa muito estranha…

eu tenho uma pagina q tem uma listagem de clientes, nela eu clico em um registro (q eh um link), e sou levado para uma pagina com um formulario onde poderei editar os dados do cliente.
O problema ocorre quando dou o submit do formulario, esta sendo chamado um outro metodo no meu managed bean q n eh o metodo q faz a atualização do cliente. O metodo q esta sendo chamado eh o alterar() e nao o salvar(), reparem q no botao q submete o formulario eu chamo actionListener="#{clienteController.salvar}"

Aqui vai o codigo:

pagina com a listagem:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:rich="http://richfaces.ajax4jsf.org/rich"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:f="http://java.sun.com/jsf/core">

	<ui:composition template="/pages/auth/welcome.xhtml">
				
	<ui:define name="mainContent">
				
	<h2>Cadastro de Cliente</h2>
	
	<fieldset>
	<a4j:form styleClass="formulario">
		<h:outputLink value="/ProjetoTDA/pages/auth/editar_cliente.jsf">Novo Cliente</h:outputLink>
		
		<rich:dataTable style="margin-top:3em" cellpadding="0"
							cellspacing="0" id="tabelaCliente" columns="3" rows="8" width="450"
							border="0" var="cliente" value="#{pesquisaClienteController.listaCliente}">

				<f:facet name="header">
					<h:panelGrid columns="2">
						<h:outputLabel value="pesquisa:" for="pesquisa" />
						<h:inputText id="pesquisa" value="#{pesquisaClienteController.pesquisa}" />
					</h:panelGrid>
				</f:facet>

				<rich:column>
					<center>
					<a4j:commandLink action="#{clienteController.alterar}" value="#{cliente.nome}">
						<f:param name="id" value="#{cliente.clienteID}" />
					</a4j:commandLink>
					</center>
				</rich:column>
				<rich:column>
					<center>
					<a4j:commandLink actionListener="#{pesquisaClienteController.clienteAExcluir}" >
						<h:graphicImage value="/resources/images/delete.gif" />
					</a4j:commandLink>
					</center>
				</rich:column>

				<f:facet name="footer">
					<rich:datascroller />
				</f:facet>
			</rich:dataTable>
	
	</a4j:form>
	</fieldset>
			
	</ui:define>
	</ui:composition>
</html>

Pagina de edição do cliente:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
      xmlns:rich="http://richfaces.ajax4jsf.org/rich"
      xmlns:f="http://java.sun.com/jsf/core">

	<ui:composition template="/pages/auth/welcome.xhtml">
				
	<ui:define name="mainContent">
				
	<h2>Cadastro de Cliente</h2>
	
	<fieldset>
	
    <a4j:form id="formEdicaoCliente">
	<h:inputHidden value="#{clienteController.clienteDTO.clienteID}" rendered="#{not clienteController.atualizacao}"/>
	<h:inputHidden value="#{clienteController.atualizacao}"/>
	
	<h:panelGrid columns="3" style="padding-top:0cm">
			<h:outputText value="Nome:" />
			<h:inputText id="nome" style="width: 320px;" value="#{clienteController.clienteDTO.nome}" required="true" requiredMessage="Informe o nome"/>
			<h:message for="nome" />
			
			<h:outputText value="CPF/CNPJ:" />
			<h:inputText id="cpf" style="width: 320px;" value="#{clienteController.clienteDTO.cpfCnpj}" required="true" requiredMessage="Informe o cpf/cnpj"/>
			<h:message for="cpf" />
			
			<h:outputText value="Tipo:" />
			<h:selectOneMenu id="tipo" value="#{clienteController.clienteDTO.tipoPessoa}" style=" width : 157px;" required="true" requiredMessage="Imforma o tipo de cliente">
				<f:selectItems value="#{clienteController.listaTipoPessoa}"/>
			</h:selectOneMenu>
			<h:message for="tipo" />
			
			<h:outputText value="Isenção:" />
			<h:selectOneMenu id="isencao" value="#{clienteController.clienteDTO.statusIsencao}" style="text-align:left; width : 156px;" required="true" requiredMessage="Informe a isenção">
				<f:selectItems value="#{clienteController.listaIsencao}"/>
			</h:selectOneMenu>
			<h:message for="isencao" />
			
	</h:panelGrid>		
			
	<h:panelGrid columns="1" id="botoesEdicaoCliente" styleClass="confirmar">	
		<a4j:commandButton rendered="#{not clienteController.atualizacao}" actionListener="#{clienteController.salvar}" styleClass="botao" id="cadastrar" value="Cadastrar" oncomplete="#{rich:component('panel')}.show() "/>
		<a4j:commandButton rendered="#{clienteController.atualizacao}" actionListener="#{clienteController.salvar}" styleClass="botao" id="atualizar" value="Atualizar" oncomplete="#{rich:component('panel')}.show() "/>
	</h:panelGrid>
	
	<rich:modalPanel id="panel" width="350" height="100">
        <f:facet name="header">
            <h:panelGroup>
                <h:outputText value="Atenção!"></h:outputText>
            </h:panelGroup>
        </f:facet>
        <f:facet name="controls">
            <h:panelGroup>
                <h:graphicImage value="/resources/images/close.png" style="cursor:pointer" id="hidelink"/>
                <rich:componentControl for="panel" attachTo="hidelink" operation="hide" event="onclick"/>
            </h:panelGroup>
        </f:facet>
        <h:outputText value="#{clienteController.mensagem}"/>
        <br/>
        
        <rich:spacer height="15"/>
        
        <center>
        <h:panelGrid columns="1">
        	<h:outputLink value="/ProjetoTDA/pages/auth/welcome.jsf" >Voltar para home</h:outputLink>
        </h:panelGrid>
        </center>
    </rich:modalPanel>
	
	</a4j:form>
	</fieldset>
			
	</ui:define>
	</ui:composition>
</html>

Managed Bean:

package tda.controllers;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import tda.dto.ClienteDTO;
import tda.dto.TituloDTO;
import tda.dto.UsuarioDTO;
import tda.enums.IsencaoEnum;
import tda.enums.TipoPessoaEnum;
import tda.exceptions.TDAException;
import tda.persistence.ClientePersistence;
import tda.persistence.UsuarioPersistence;
import tda.util.FacesUtil;
import tda.util.NavigationConstants;

public class ClienteController {
	
	private static final Logger log = Logger.getLogger(ClienteController.class);
	private ClienteDTO clienteDTO;
	private boolean atualizacao;
	private ClientePersistence persistence;
	private UsuarioPersistence usuarioPersistence;
	private String mensagem;
	
	public ClienteController() {
		this.persistence = ClientePersistence.getInstance();
		this.usuarioPersistence = UsuarioPersistence.getInstance();
	}
	
	public String alterar() {
		Long id = Long.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"));
		log.info("obtido parametro: " + id);
		this.clienteDTO = persistence.buscarClientePorID(id);
		this.atualizacao = true;
		log.info("redirecionando para pagina de editar cliente.");
		
		return NavigationConstants.EDITAR_CLIENTE;
	}
	
	public void salvar(ActionEvent event) {
		try {
			if (!this.atualizacao) {
				// se for cadastro, temos q buscar a instituição do usuario q esta logado e setar no cliente q esta sendo cadastrado
				log.info("chamando cadastro de cliente.");
				String login = FacesUtil.getLoginUsuarioPrincipal();
				UsuarioDTO usuarioDTO = usuarioPersistence.buscarUsuarioPorLogin(login);
				this.clienteDTO.setInstituicaoID(usuarioDTO.getInstituicaoID());
				persistence.cadastrar(this.clienteDTO);
				this.mensagem = "Cliente cadastrado com sucesso";
			} else {
				log.info("atualizando cliente. clienteID:" + clienteDTO.getClienteID());
				persistence.atualizarCliente(this.clienteDTO);
				this.mensagem = "Cliente atualizado com sucesso";
			}
		} catch (TDAException e) {
			if (this.atualizacao) {
				this.mensagem = "Erro ao atualizar cliente";
			} else {
				this.mensagem = "Erro ao cadastrar cliente";
			}
		}
	}
	
	public List<SelectItem> getListaTipoPessoa() {
		List<SelectItem> listaSelects = new ArrayList<SelectItem>();

		for (TipoPessoaEnum tipoPessoa : TipoPessoaEnum.values()) {
			SelectItem item = new SelectItem();
			item.setValue(tipoPessoa);
			item.setLabel(tipoPessoa.getDescricao());
			listaSelects.add(item);
		}
		
		SelectItem itemSelecione = new SelectItem(null, "Selecione");
        listaSelects.add(0, itemSelecione);

        return listaSelects;
	}
	
	public List<SelectItem> getListaIsencao() {
		List<SelectItem> listaSelects = new ArrayList<SelectItem>();

		for (IsencaoEnum isencao : IsencaoEnum.values()) {
			SelectItem item = new SelectItem();
			item.setValue(isencao);
			item.setLabel(isencao.getDescricao());
			listaSelects.add(item);
		}
		
		SelectItem itemSelecione = new SelectItem(null, "Selecione");
        listaSelects.add(0, itemSelecione);

        return listaSelects;
	}
	
	public ClienteDTO getClienteDTO() {
		return clienteDTO;
	}

	public void setClienteDTO(ClienteDTO clienteDTO) {
		this.clienteDTO = clienteDTO;
	}

	public boolean isAtualizacao() {
		return atualizacao;
	}

	public void setAtualizacao(boolean atualizacao) {
		this.atualizacao = atualizacao;
	}
	
	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}
}

faces config:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
  <managed-bean-name>clienteDTO</managed-bean-name>
  <managed-bean-class>tda.dto.ClienteDTO</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
  <managed-bean-name>clienteController</managed-bean-name>
  <managed-bean-class>tda.controllers.ClienteController</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
   <property-name>clienteDTO</property-name>
   <value>#{clienteDTO}</value>
  </managed-property>
 </managed-bean>
</faces-config>

podem me ajudar com isto? Sou novo no desenvolvimento jsf e n sei oq esta acontecendo…

Obrigado!

3 Respostas

M

na verdade ele nao esta chamando o meu actionListener="#{clienteController.salvar}" que esta no meu botao de submit do formulario da pagina de edição de cliente.

Alguem pode ajudar??

M

alguem pode me ajudar?

elugo

bom vai uma sugetão!!
Eu analizei seu código e aparentemente esta tudo correto!
mas tente utilizar o action apenas ao invéz de actionListener ok!

Criado 11 de dezembro de 2008
Ultima resposta 12 de dez. de 2008
Respostas 3
Participantes 2