[RESOLVIDO] MVC com Primefaces

Olá!

Criei um projeto pra testar os componentes do Primefaces, e criei uma página simples, com alguns campos, porem estou com dúvida sobre como “chamar” o método da classe de controle. Segue o código:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Insert title here</title>
</h:head>

<h:body>
	<h:form id="form">
		<h:panelGrid columns="2">
			<h:outputText value="Nome: " />
			<p:inputText value="#{clienteController.cliente.nome}" />

			<h:outputText value="Celular: " />
			<p:inputText value="#{clienteController.cliente.telefone1}" />

			<h:outputText value="Telefone: " />
			<p:inputText value="#{clienteController.cliente.telefone2}" />

			<h:outputText value="Cidade: " />
			<p:inputText value="#{clienteController.cliente.cidade}" />

			<h:outputText value="Endereço: " />
			<p:inputText value="#{clienteController.cliente.endereco}" />

			<h:outputText value="Sexo: " />
			<p:inputText value="#{clienteController.cliente.sexo}" />

			<h:outputText value="Observações: " />
			<p:inputText value="#{clienteController.cliente.observacoes}" />

			<p:commandButton value="Salvar" action="#{clienteController.adicionarCliente}" update="form" />
		</h:panelGrid>
	</h:form>
</h:body>
</html>

Classe Cliente

package model;

import javax.persistence.*;

@Entity
@SequenceGenerator(name = "cliente_cod_seq", sequenceName = "cliente_cod_seq", allocationSize = 1)
public class Cliente {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cliente_cod_seq")
	private long cod;

	private String nome;

	private String telefone1;

	private String telefone2;

	private String cidade;

	private String endereco;

	private String sexo;

	private String observacoes;

	public long getCod() {
		return cod;
	}

	public void setCod(long cod) {
		this.cod = cod;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone1() {
		return telefone1;
	}

	public void setTelefone1(String telefone1) {
		this.telefone1 = telefone1;
	}

	public String getTelefone2() {
		return telefone2;
	}

	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}
}

Classe ClienteController

package controller;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import model.Cliente;
import dao.ClienteDao;
import dao.ClienteDaoImp;

@ManagedBean
@SessionScoped
public class ClienteController {

	private Cliente cliente;
	@SuppressWarnings("rawtypes")
	private DataModel listaClientes;

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public DataModel getListarClientes() {
		List lista = new ClienteDaoImp().list();
		listaClientes = new ListDataModel(lista);
		return listaClientes;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public void prepararAdicionarCliente(ActionEvent actionEvent) {
		cliente = new Cliente();
	}

	public void prepararAlterarCliente(ActionEvent actionEvent) {
		cliente = (Cliente) (listaClientes.getRowData());
	}

	public String excluirCliente() {
		Cliente clienteTemp = (Cliente) (listaClientes.getRowData());
		ClienteDao dao = new ClienteDaoImp();
		dao.remove(clienteTemp);
		return "index";
	}

	public void adicionarCliente(ActionEvent actionEvent) {
		ClienteDao dao = new ClienteDaoImp();
		dao.save(cliente);
	}

	public void alterarCliente(ActionEvent actionEvent) {
		ClienteDao dao = new ClienteDaoImp();
		dao.update(cliente);
	}
}

Desde já, agradeço a ajuda de todos.

Grande abraço.

qual a dúvida? kkkkkkkkkk
é em como invocar a ação?
ja tentou algo e teu algum erro?

Ao clicar no <p:commandButton/> não acontece nada, por isso creio que o erro esteja ai.

OBS.: Criei uma classe de teste, e verifiquei que o Dao funciona perfeitamente.

[quote=lksJF]Ao clicar no <p:commandButton/> não acontece nada, por isso creio que o erro esteja ai.

OBS.: Criei uma classe de teste, e verifiquei que o Dao funciona perfeitamente.[/quote]

tire o ActionEvent da assinatura

Fiz a correção sugerida pelo rmendes08 e ainda não funcionou.

Quando clico no commandButton para salvar, permanece sem reação alguma…

Mais alguma sugestão?!

Bom pessoal, fiz mais uma correção e consegui que o método fosse chamado pelo commandButton.

Foi preciso mudar a classe ClienteController de:

public class ClienteController {

	private Cliente cliente;
...

Ficando da seguinte forma:

public class ClienteController {

	private Cliente cliente = new Cliente();
...

Mas, com o código dessa forma, sempre que usar o ClienteController, estarei criando um novo objeto Cliente. Mesmo quando quiser utilizar apenas o excluirCliente(). Certo?!

Fiz essa classe controladora com base em um tutorial. Assim, percebi que foi criado um método prepararAdicionarCliente(), que “apenas” instancia um novo objeto. Essa forma é usual? Costuma-se utilizar essa “solução” para a criação desnecessária de um objeto?

Desde já, agradeço a todos que ajudaram.

Mais alguém?

cara faça o seguinte , no XHTML o metodos do bean são interpretados por getters e setters , apenas mude a nomenclatura de seus metodos get , set no meu caso funcionou haha

lksJF,

Você pode instanciar o cliente apenas no momento que você for realmente criar um novo cliente. Por exemplo, eu faria algo assim:

[code]public class ClienteController {

private Cliente cliente;  

public void novoCliente() {
    cliente = new Cliente();
}

public String excluirCliente() {  
    Cliente clienteTemp = (Cliente) (listaClientes.getRowData());  
    ClienteDao dao = new ClienteDaoImp();  
    dao.remove(clienteTemp);  
    return "index";  
}  

public void adicionarCliente() {  
    ClienteDao dao = new ClienteDaoImp();  
    dao.save(cliente);  
}  

public void alterarCliente() {  
    ClienteDao dao = new ClienteDaoImp();  
    dao.update(cliente);  
}  

[/code]

Basicamente tenho uma listagem de clientes, um botão para excluí-lo e editá-lo e um botão pra criar um novo cliente (que pode abrir uma modal, outra página ou renderizar um painel, etc…). Esse botão de novo cliente, chama o método novoCliente(), que instancia o cliente.
Com isso, apenas quando vou criar um novo cliente que crio o objeto.

Opaaa!

Valeu edubiss, agora sim compreendi!
Problemas solucionados, estou alterando o título para RESOLVIDO.

Muito obrigado a todos que colaboraram!

Grande abraço!
=]