Dúvida sobre padrão MVC

6 respostas
S

[size=9]OLÁ PESSOAL, ESTOU DESENVOLVENDO UMA APLICAÇÃO PELA PRIMEIRA VEZ UTILIZANDO PADRÃO DE PROJETO MVC, MAS AINDA NÃO DOMINEI SOBRE ESSE ASSUNTO,
GOSTARIA QUE VCS ME DESSEM UM AJUDINHA PARA QUE EU CONSIGA SANAR DE VEZ MINHAS DÚVIDAS, ESTOU POSTANDO AQUI O CÓDIGO PARA QUE VCS POSSAM DAR UMA OLHADA
E ANALISAR PARA MIM POR GENTILEZA SE ESTÁ FALTANDO ALGO NA MINHA APLICAÇÃO E SE ELA ESTÁ BEM ORGANIZADA, SOBRE AS DÚVIDAS É O SEGUINTE: ESTOU COMENTENDO UM ERRO E NÃO ESTOU SABENDO COMO CORRIGI-LO, EM MINHAS OUTRAS
APLICAÇÕES ONDE EU NUNCA HAVIA USADO PADRÃO DE PROJETO EU TRABALHAVA COM RESULTSET PARA RETORNO DOS DADOS DO BD AO INVES DE LIST, E APOS REALIZAR ALGUMAS PERGUNTAS AQUI
NO FORUM EU VI QUE ISSO É UMA MÁ PRÁTICA, AGORA, GOSTARIA DE TRABALHAR COM LIST NESSA MINHA APLICAÇÃO, MAS INFELIZMENTE POR AINDA NÃO SABER TRABALHAR CORRETAMENTE COM PADRÃO DE PROJETO
EU NÃO SEI ONDE DEVO ADICIONAR ESSES OBJETOS A MINHA LISTA, SE SERIA NA CAMADA DE PERSISTENCIA OU NE OUTRA CAMADA E TALLS, PORTANTO GOSTARIA QUE VCS APOS DAREM UMA OLHADA NO MEU CODIGO
ME INDICASSEM ONDE DEVO COLOCAR MINHA LIST PARA PODER TRABALHAR CORRETAMENTE COM MEUS OBJETOS
EU QUERO UTILIZAR ESSES OBJETOS ADICIONADOS NA MINHA LIST EM UM METODO CRIADO NO MEU FORM QUE AO ABRIR MINHA APLICAÇÃO IRÁ RETORNAR O PRIMEIRO DADO CONTIDO NA PRIMEIRA POSIÇÃO DA MINHA LISTA
SÓ QUE ATÉ O MOMENTO EU ESTAVA ADD OS OBJETOS NA MINHA LISTA NA CAMADA DE VISÃO MESMO, SÓ QUE AO BUSCA-LOS EU RECEBIA O RETORNO DE QUE MINHA LISTA ESTAVA VAZIA, SENDO QUE O MEU BD ESTÁ CHEIO DE DADOS,
PORTANTO NÃO ESTOU SABENDO ONDE ESTARIA ESSE ERRO E POR ISSO ME RECORRO A VCS, POSTEI AQUI APENAS UMA PARTE DO CODIGO ONDE ACHO QUE ESTARIA JÁ SUFICIENTE PARA QUE VEJAM O QUE ESTOU FAZENDO,
SE VCS TIVEREM TAMBÉM UM ARTIGO QUE DÁ UMA BOA EXPLICAÇÃO SOBRE ESSA ORGANIZAÇÃO QUE DEVE SER FEITA EM UM PADRÃO MVC EU FICARIA AINDA MAIS AGRADECIDO
OBRIGADO GALERA!!!

MINHAS CAMADAS:[/size]
DOMINIO:

public class cliente {

    private int codigo;
    private String nome;
    private String endereco;
    private int numero;
    private String bairro;
    private String cidade;
    private String estado;
    private String cpf;
    private String rg;
    private String telefone;
    private String datanasc;
    private String infoadd;

    //E SEUS RESPECTIVOS GETERS E SETERS ALEM DO CONSTRUTOR
}


CONTROLE:

public class AcaoCadastroCliente {

       public AcaoCadastroCliente() {

       }


          public boolean salvar(cliente cliente) {
 
             cad_clienteDAO pdao = new cad_clienteDAO();
             pdao.salvar(cliente);
             return true;
          }

    
          public boolean editar(cliente cliente) {

            cad_clienteDAO pdao = new cad_clienteDAO();
            pdao.editar(cliente);
            return true;
          }
  

          public cliente buscar_por(int codigo) {

            Interface_cad_cliente pdao = Factory.createcad_clienteDAO();
            cliente p =  pdao.buscar_por(codigo);
            return p;
          }


          public List recuperar() throws SQLException {

            Interface_cad_cliente dao = Factory.createcad_clienteDAO();
            return dao.recuperar();
          }


PERSISTENCIA:

public class cad_clienteDAO extends conexao.ConexaoDAO implements Interface_cad_cliente {

   
    public cad_clienteDAO() {

         this.criarConexao();
    }

   

    public void salvar(cliente cliente) {

     String  sql = ("INSERT INTO cliente (cli_nome, cli_endereco, cli_numero, cli_bairro, cli_cidade, cli_estado, cli_cpf, cli_rg, cli_tel, cli_datanasc, cli_infoadd) " +
                    "VALUES ( " +
                    "'" +   cliente.get_nome()       + "', " +
                    "'" +   cliente.get_endereco()   + "', " +
                    "'" +   cliente.get_numero()     + "', " +
                    "'" +   cliente.get_bairro()     + "', " +
                    "'" +   cliente.get_cidade()     + "', " +
                    "'" +   cliente.get_estado()     + "', " +
                    "'" +   cliente.get_cpf()        + "', " +
                    "'" +   cliente.get_rg()         + "', " +
                    "'" +   cliente.get_telefone()   + "', " +
                    "'" +   cliente.get_datanasc()   + "',"  +
                    "'" +   cliente.get_infoadd()    + "')");
                    
        try {
            this.criarConexao();
            stmt.execute(sql); 
            this.fecharConexao();
        }
        catch(SQLException ex) {
            ex.printStackTrace();
        }

    }

    public void editar(cliente cliente) {

        String sql = "";
        if(cliente.get_codigo() != 0) {
            cliente p1 = (cliente) buscar_por(cliente.get_codigo());
            if( p1 != null ) {
                sql = "Update cliente SET " +
                        " cli_nome = '"         + cliente.get_nome()         + "', " +
                        " cli_endereco = '"     + cliente.get_endereco()     + "', " +
                        " cli_numero = '"       + cliente.get_numero()       + "' " +
                        " cli_bairro = '"       + cliente.get_bairro()       + "' " +
                        " cli_cidade = '"       + cliente.get_cidade()       + "' " +
                        " cli_estado = '"       + cliente.get_estado()       + "' " +
                        " cli_cpf    = '"       + cliente.get_cpf()          + "' " +
                        " cli_rg     = '"       + cliente.get_rg()           + "' " +
                        " cli_tel      = '"     + cliente.get_telefone()     + "' " +
                        " cli_datanasc = '"     + cliente.get_datanasc()     + "' " +
                        " cli_infoadd = '"      + cliente.get_infoadd()      + "' " +
                        " WHERE cli_codigo = "  + cliente.get_codigo();
            }
        }
    }


     
    public cliente buscar_por(int codigo) {

        List result = null;
        try {
            result = this.executarSelect("SELECT * FROM cliente where cli_codigo = " + codigo);
        } catch (SQLException ex) {
            Logger.getLogger(cad_clienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        if(result.size() > 0)
            return (cliente)result.get(0);
        return null;
    }



    
    public List recuperar() throws SQLException {
       
        return this.executarSelect("SELECT * FROM cliente");
    }

FORA ISSO TEM A CAMADA DE VISÃO ONDE ESTÁ CONTIDA MEU FORM E NA CAMADA DE PERSISTENCIA TAMBÉM ESTÁ CONTIDA
UMA CLASSE PARA MINHA CONEXÃO FEITA COM O BD E UMA INTERFACE ONDE SERÃO EXECUTADOS OS RESPECTIVOS METODOS

ERRO RETORNADO EM RELAÇÃO A LISTA
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

6 Respostas

ViniGodoy

Oi. Seu texto está inteiro em letras maiúsculas, por isso não li nada, e creio que muitos não irão ler também.
Além disso, coloque seu código entre as tags code. Assim ele sairá colorido e formatado. Para fazer isso, basta fazer:

seu código aqui

Você pode clicar em editar no post aí em cima e corrigir?

marcoslogan

Bom daqui a pouco eu te explico.

viniciusfaleiro

vish… tbm nào tive coragem de ler…

marcoslogan

bom o teu método para retornar uma lista, tem maneira melhor de fazer aquilo.

public List<Cliente> PesquisarCliente(Cliente cliente)throws ConsultaErro, SQLException{
        String Query = "Select * from cliente Where Codigo = ?";
        PreparedStatement smt = Con.preparedstatement(Query);//Con é uma variável do tipo java.sql.Connection
        List<Cliente> clientes = new ArrayList<Cliente>();//Bom esse método vai retornar uma lista de clientes.
        //Bom, a variável de conexão eu crio a conexão quando eu instanciar essa classe.
       try{
           smt.setInt(2, cliente.getCodigo());
           ResultSet set = smt.executeQuery();
  
           while(set.next()){

               cliente = new Cliente();//Aqui só vai entrar se o ResultSet encontrar um registro e apontar para o próximo, fazendo isso ele instancia o cliente na memória.
               //Aqui é só setar os valores dos métodos set da classe Cliente com os valores retornados do banco.

              cliente.setNome(set.getString("Nome"));...


             clientes.add(cliente);//no final você adiciona o objeto cliente à lista de objetos cliente que você retornará com esse método.
           }
      }catch(SQLException exe){
          throw new ConsultaErro("Erro ao tentar listar os dados do Cliente");
      }finally{
         smt.close();//aqui você fechará o PreparedStatement, mas não fechará a conexão. Senão você terá que abrir a conexão em todo método da classe de persistência.
       }
        return clientes;//Aqui você retorna a lista de objetos Cliente, se o cliente tiver sido instanciado, a lista não estará vazia, ou seja, !=null.        
    }

Você vê aqui que eu não precisei fazer nenhuma comparação se alguém aqui estava ou não instanciado. Deixe para fazer alguma comparação na classe de domínio, quando você terá que pegar os métodos da classe de persistência. A implementação da lista você coloca na camada de persistência de dados, na camada de controle, você vai chamar o método da classe de persistência, e lá você faz um if se a lista estiver vazia, você gera uma exceção. Senão estiver vazia você retorna a lista.
Na camada de domínio, você não tem que retornar um boolean para testar se um cliente foi cadastrado. faça assim.

public void InserirCliente(Cliente cliente)throws ConexaoErro, SQLException, ClienteException{
             if(AcharFuncionario(cliente.getCodigo() != null){
                   throw new ClienteException("Funcionário Já Cadastrado.");//Se já existir um cliente no banco de dados então gere essa exceção, que passará para a camada superior, até a camada de View. Ou a camada de apresentação.
             }

          repositorio.InserirCliente(cliente);//aqui estou chamando o método do meu repositório, ou seja, da minha camada de persistência de dados, aqui eu posso colocar diversos ifs contendo toda a lógica de negócio. Como em todos os métodos, eu vou trabalhar nesse camada só com a parte da lógica de negócio.
    }

Viu como é fácil? Faz o seguinte, baixe algumas apostilas a caelum, que elas lhe auxiliarão muito.

www.caelum.com.br/apostilas

pedromuyala

Bastante conteúdo sobre MVC poderá ser encontrado aqui!
Tanto teoria quanto implementação! E um pouco de Camadas, Pattern Observer, MVP e Exception’s.
Espero ter ajudado! :wink:

S

Nossa, ajudou demais amigão, muito obrigado

Criado 22 de fevereiro de 2010
Ultima resposta 24 de abr. de 2010
Respostas 6
Participantes 5