Aplicando padrões de projeto

79 respostas
ArianeRebellato

Boa noite! Estou desenvolvendo um trabalho de faculdade aonde temos que implementar 3 padrões de projeto de nossa preferência em algum projeto em java existente ou então começar um do zero…para poupar tempo eu quero utilizar um projeto em java p web e hibernate que é de outra matéria…estou meio confusa…conheço alguns dos principais padrões, implementamos alguns exemplos em aula, mas não estou 100% segura para aplicar eles sozinha agora…apesar de ler e ver mais exemplos ainda preciso de ajuda…

Então minha primeira dúvida:

Tenho a classe HibernateUtil a seguir

package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author SONY
 */
public class HibernateUtil {
    private static EntityManagerFactory factory =null;

    public static EntityManager getManager(){
        try{
        if (factory == null){
            factory = Persistence.createEntityManagerFactory("ContasPU");
        }
        return factory.createEntityManager();

    } catch(Exception e){
            System.out.println("Erro"+e);
            return null;
    }

}
}

Toda vez que é necessário seu uso chamo ela nos arquivos.jsp

EntityManager manager = HibernateUtil.getManager();

e a definição do PP Singleton: estabelece a regra de que só pode existir um objeto disponível na memória para a classe que implementa este padrão.
A minha classe HibernateUtil já é um exemplo de Singleton então? Se não, como fazer para que seja?

Obrigada!! :smiley:

79 Respostas

danieldomingues86

Olá,

Para fazer um teste rapido se sua classe é Singleton é facil. Tente fazer duas vezes new() dela, se voce conseguir ela nâo é Singleton :slight_smile:

Abraços
Daniel

ArianeRebellato

consegui :evil: pela primeira vez, gostaria de não ter conseguido…ahahahahah…
ironias a parte, o que na minha classe vai determinar que se trata de um Singleton?

e agora:

package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author SONY
 */
public class HibernateUtil {

    private static final HibernateUtil hibernate = new HibernateUtil();
    private static EntityManagerFactory factory = null;

    private HibernateUtil() {
    }

    // retorna o objeto Singleton estático
    public static HibernateUtil getInstance() {
        return hibernate;
    }

    public static EntityManager getManager() {
        try {
            if (factory == null) {
                factory = Persistence.createEntityManagerFactory("ContasPU");
            }
            return factory.createEntityManager();

        } catch (Exception e) {
            System.out.println("Erro" + e);
            return null;
        }

    }
}

??

Pelo menos acusou um erro (nunca pensei que ia ficar feliz com isso)…tentei criar um novo objeto

HibernateUtil util = new HibernateUtil(); e acusa que o HibernateUtil é de acesso privado…é isso?? :roll:
Pq eu criei um construtor privado, óbvio…o que impede a instanciação…então agora eu tenho um singleton?

Adelar

Pergunta do primeiro post:

Não. A EntityManagerFactory é um singleton, pois é criada somente uma vez e acessada para criar entidades depois de instanciada. A HibernateUtil é somente uma classe de acesso. Se for seguir o padrão à risca haveria um método chamado getInstance() na EntityManagerFactory que retornaria sempre a mesma instância do objeto, mas isso não impede que seja feito da forma que você fez.

danieldomingues86

Pelo menos acusou um erro (nunca pensei que ia ficar feliz com isso)…tentei criar um novo objeto
view plaincopy to clipboardprint?
HibernateUtil util = new HibernateUtil();
e acusa que o HibernateUtil é de acesso privado…é isso??
Pq eu criei um construtor privado, óbvio…o que impede a instanciação…então agora eu tenho um singleton?

Agora sim :slight_smile:

Veja que voce tem um objeto HibernateUtil já instanciado dentro da sua propria classe e ninguem de fora consegue fazer um new() dessa sua classe, ou seja o
construtor private é essencial para se ter um Singleton.

É isso ai

Abraços
Daniel.

ArianeRebellato

e agora to fazendo certo??

package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author SONY
 */
public class HibernateUtil {

    // Objeto Singleton a ser retornado por getSingletonInstanc
    private static EntityManagerFactory factory = null;

    // construtor privado impede a instanciação pelos clientes
    private HibernateUtil() {
    }

    // retorna o objeto Singleton estático
    public static EntityManager getInstance() {
        try {
            if (factory == null) {
                factory = Persistence.createEntityManagerFactory("ContasPU");
            }
            return factory.createEntityManager();

        } catch (Exception e) {
            System.out.println("Erro" + e);
            return null;
        }

    }
}
e chamo assim em todas as paginas necessárias
EntityManager manager = HibernateUtil.getInstance();
ArianeRebellato

Agora sim

Veja que voce tem um objeto HibernateUtil já instanciado dentro da sua propria classe e ninguem de fora consegue fazer um new() dessa sua classe, ou seja o
construtor private é essencial para se ter um Singleton.

É isso ai

Abraços
Daniel.

Eba! Obrigada!!

ArianeRebellato

Alguma sugestão sobre que outro padrão eu poderia usar em um projeto de um sistema de gerenciamento de contas a pagar e receber super simples em JSP, Hibernate e o banco de dados Postgres?

Funcionalidades do sistema:
? Inserir conta
? Editar conta
? Remover conta
? Listagem

danieldomingues86

Um Excelente pro seu caso, o Padrão Command.

Abraços
Daniel.

ArianeRebellato

huumm…vou pesquisar…aproveitando que tu ta online, eu quero testar de alguma maneira o exemplo usando o singleton…mas não to sabendo muito cm…to querendo algo assim assim:

//construtor
 private HibernateUtil() {
         System.out.println("Factory sendo utilizada...");
    }

//....
//e na pagina jsp pensei em algo algo assim...

HibernateUtil firstHibernateUtil;
    HibernateUtil secondHibernateUtil;
    firstHibernateUtil = HibernateUtil.getInstance();
    secondHibernateUtil = HibernateUtil.getInstance();

    if (firstHibernateUtil == secondHibernateUtil) {
%>
        <%="FirsHibernateUtil e secondHibernateUtil fazem referência ao mesmo HibernateUtil");%>

<%            }

tem fundamento isso? este código ta dentro da pagina inserir.jsp…só pra fazer um teste…

rogelgarcia

No seu último exemplo da classe HibernateUtil… ela é um singleton MAS sem utilidade nenhuma… então não tem razão para usar esse padrão. Você nao está usando nenhuma instancia do objeto HibernateUtil.

A EntityManagerFactory NÃO é um singleton!

danieldomingues86

Olá,

Aproveitando que eu estou online e vou responder rsrs…

Sim esse é um bom teste para ver a questão do singleton, exatamente voce pode recuperar a instancia varias vezes, por variaveis diferentes e ver se todas apontam para o mesmo objeto, se sim ok! Singleton implementado :slight_smile:

Dicas : Evite sempre usar scriptlets em paginas jsp isso é uma má prática, a ideia de uma pagina jsp é de somente representar a interface grafica, no caso a pagina, deixe a codificações para um objeto que se comunique diretamente com suas paginas .jsp’s que no caso são os controllers(Servlets).

Qualquer dúvida é só falar.

Abraços
Daniel.

rogelgarcia

Para transformar o seu HibernateUtil em um singleton que faça algum sentido, troque o método [color=darkred]public static EntityManager getInstance()[/color] por um método não estático e o renomeie para getEntityManager().

Crie outro [color=darkred]getInstance[/color] que retorna a instancia de HibernateUtil.

ArianeRebellato

No seu último exemplo da classe HibernateUtil… ela é um singleton MAS sem utilidade nenhuma… então não tem razão para usar esse padrão. Você nao está usando nenhuma instancia do objeto HibernateUtil.

A EntityManagerFactory NÃO é um singleton!

Poi é!! Eu quero que seja útil…cm eu faço isso?

danieldomingues86

Exatamente o que ele disse, tinha esquecido disso rsrs

Utilize o padrão Singleton para encapsular algo, pois não adianta ter uma classe singleton que não forneça nenhuma funcionalidade específica.

Abraços
Daniel

rogelgarcia

Instruções acima… fazendo essas modificações ao pedir um EntityManager automaticamente você terá que usar o singleton do HibernateUtil.

Dica, o que será estático na sua classe será:
Um atributo do tipo [color=darkred]HibernateUtil[/color]
e o método [color=darkred]public static HibernateUtil getInstance()[/color]

Você terá algo mais ou menos assim na sua classe:

private static HibernateUtil instance;

public static HibernateUtil getInstance(){
     // código para retornar o singleton aqui
}

private HibernateUtil(){ //o construtor de HibernateUtil deve ser private
}

//outros métodos públicos e não estáticos
ArianeRebellato
Crie outro getInstance que retorna a instancia de HibernateUtil.
package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Padrão de projeto aplicado:
 * Singleton: Singleton: estabelece a regra de que só pode existir um objeto disponível 
 * na memória para a classe que implementa este padrão. 
 * Temos um objeto HibernateUtil já instanciado dentro da própria classe e 
 * ninguem de fora consegue fazer um new() dessa classe, ou seja o 
 * construtor private é essencial para se ter um Singleton, pois impede a instanciação da classe.
 */
public final class HibernateUtil {

    // Objeto HibernateUtil a ser retornado por getInstance
    private static final HibernateUtil hibernate = new HibernateUtil();
    private static EntityManagerFactory factory = null;

    // construtor privado impede a instanciação pelos clientes
    private HibernateUtil() {
         System.out.println("Factory sendo utilizada...");
    }

    // retorna o objeto HibernateUtil estático
    public static HibernateUtil getInstance() {
        return hibernate;
    }

    public static EntityManager getManager() {
        try {
            if (factory == null) {
                factory = Persistence.createEntityManagerFactory("ContasPU");
            }
            return factory.createEntityManager();

        } catch (Exception e) {
            System.out.println("Erro" + e);
            return null;
        }

    }
}
rogelgarcia

O método getManager() deve ser não estático…

danieldomingues86
Segue como fica :
package com.patterns.singleton;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/** 
* Padrão de projeto aplicado: 
* Singleton: Singleton: estabelece a regra de que só pode existir um objeto disponível  
* na memória para a classe que implementa este padrão.  
* Temos um objeto HibernateUtil já instanciado dentro da própria classe e  
* ninguem de fora consegue fazer um new() dessa classe, ou seja o  
* construtor private é essencial para se ter um Singleton, pois impede a instanciação da classe. 
*/  
public final class HibernateUtil {  
  
    // Objeto HibernateUtil a ser retornado por getInstance  
    private static final HibernateUtil hibernate = new HibernateUtil();  
    private static EntityManagerFactory factory = null;  
  
    // construtor privado impede a instanciação pelos clientes  
    private HibernateUtil() {  
         System.out.println("Factory sendo utilizada...");  
    }  
  
    // retorna o objeto HibernateUtil estático  
    public static HibernateUtil getInstance() {  
        return hibernate;  
    }  
  
    public EntityManager getEntityManager() {  
        try {  
            if (factory == null) {  
                factory = Persistence.createEntityManagerFactory("ContasPU");  
            }  
            return factory.createEntityManager();  
        } catch (Exception e) {  
            System.out.println("Erro" + e);  
            return null;  
        }  
    }  
}
Exemplo de uso :
import javax.persistence.EntityManager;

public class Main {
	
	public static void main(String[] args) {
		
		HibernateUtil util1 = HibernateUtil.getInstance();
		HibernateUtil util2 = HibernateUtil.getInstance();
		
		//comparando referencias...
		if(util1 == util2){
			System.out.println(true);
		}else{
			System.out.println(false);
		}
		
		// obtendo entity manager
		EntityManager em1 = HibernateUtil.getInstance().getEntityManager();

	}

}
ArianeRebellato

Daniel! Aproveitando que tu ta online foi ótima né?? ahahaha Vou ler as dicas com atenção … não me abandonem!

danieldomingues86

Não vou te abandonar eu prometo!!!

Qualquer coisa tamo ai :slight_smile:

Ok, Abraços
Daniel.

rogelgarcia

É interessante que o atributo [color=darkblue]factory[/color], não seja estático também (não vai fazer diferença na funcionalidade, mas acho que fica mais elegante… já que não é necessário que ele seja estático)

ArianeRebellato

mas ai dá erro lá no inserir : EntityManager manager = HibernateUtil.getManager();

pq um é estático e o outro não…

rogelgarcia

Exatamente… é esse erro que vai te forçar a usar o singleton… como o Daniel deu como exemplo… a forma seria:

ArianeRebellato

aaaahhhhh ahahahahaha…entendiii…que alegria! :smiley:

cm eu resumiria isso?..o meu singleton é útil por que…?

rogelgarcia

… permite que apenas um objeto da classe HibernateUtil seja criado… por consequencia apenas uma factory será criada na aplicação… desde que essa factory sempre seja acessada pelo HibernateUtil…

danieldomingues86

Olha, e estou pensando o que vou ganhar por causa desse seu trabalho de faculdade,

Penso principalmente sobre os meus direitos autorais já que estou vendo que minhas palavras foram colocadas no comentario do seu código hahaha…

Calma, brincadeira :slight_smile:

Abraços
Daniel

rogelgarcia

Uma lista de Design Patterns para você escolher:

Abstract Factory
Factory Method
Singleton
Adapter
Composite
Decorator
Facade
Proxy
Chain of Responsability
Command (boa sugestão do Daniel para seu problema)
Interpreter
Iterator
Observer
Strategy
Template Method

ArianeRebellato

Traduzindo HibernateUtil.getInstance().getEntityManager() ;

A classe chama o próprio objeto que eu criei lá dentro da HibernateUtil que chama o método da mesma classe que faz a persistência…e eu nunca vou conseguir chamar o método de outra maneira no sistema ponto e virgula??

ArianeRebellato

Olha, e estou pensando o que vou ganhar por causa desse seu trabalho de faculdade,

Penso principalmente sobre os meus direitos autorais já que estou vendo que minhas palavras foram colocadas no comentario do seu código hahaha…

Calma, brincadeira

Abraços
Daniel

eu só me inspirei nas tuas palavras…não copiei… :wink:

rogelgarcia

heeheh

É por aí…

Mas nos termos corretos seria…

Através do método estático getInstance da classe HibernateUtil, eu retorno o objeto que criei lá dentro. Desse objeto eu chamo o método getEntityManager que retorna um objeto EntityManager

(ainda nao tem nenhuma persistencia sendo feita)

ArianeRebellato

hahahaha…a é…

e tu vai cobrar direitos autorais tbm rogelgarcia??

rogelgarcia

Não não… hoje eu tô de bom humor… hehehehe

rogelgarcia

Qual é o próximo Design Pattern?

danieldomingues86

Bem, vamos lá…

Vamos entender pra que serve essa sua classe singleton…

A classe HibernateUtil singleton que voce criou tem como principal finalidade guardar(encapsular) um EntityManagerFactory.

Esse objeto EntityManagerFactory fica guardado nessa classe pois não faz sentido ficar dando new() dele por todo o sistema, porque? Porque ele é uma fabrica (factory) que não muda de estado.

Então através desse objeto HibernateUtil.getInstance() voce consegue acessar essa sua factory, ou seja quem quer que seja vai so pode ter uma instancia da sua HibernateUtil e consequentemente apenas um acesso a factory.

E qual a ideia dessa factory, que por consequencia tambem é um padrão… criar diversas instancias de entity manager getEntityManager() pra quem precisar, ou seja ela fabrica objetos.

Entendeu?

Abraços
Daniel.

ArianeRebellato

entendii…pois então…esta era minha próxima duvida…eu ainda estava na primeira…eu tenho dois padrões em uma classe sóó?

Factory: define uma interface para a criação de um objeto, mas deixa as classes escolherem qual classe deve ser instanciada. Cm assim?

rogelgarcia

EntityManagerFactory é uma factory (tá escrito até no nome… heheh)

A HibernateUtil… nao é uma factory nao… poderia até ser um façade de forçar um pouco a barra…

danieldomingues86

Na verdade voce tem um padrão nessa classe que é o Singleton e o outro padrão está na classe EntityManagerFactory (internamente)

Mas não se preocupe com esse pattern por enquanto, a menos que voce precise usar rsrsrs, veja o Command que eu te disse que vai ser bem facil entender

Abraços
Daniel

rogelgarcia

ArianeRebellato:

Factory: define uma interface para a criação de um objeto, mas deixa as classes escolherem qual classe deve ser instanciada. Cm assim?

Boa pergunta… como assim? :smiley:

Onde você tirou isso?

ArianeRebellato

Tá certo…Obrigada por enquanto gente…eu vou pesquisar este padrão que vcs sugeriram e volto a postar… :slight_smile:

ArianeRebellato

http://www.facensa.com.br/paginapessoal/daniel/files/lp2/WILDT_JAVAPATTERNS.pdf

rogelgarcia

Num tá muito boa essa definição nao…
Na verdade ele traduziu errado… a tradução correta da origem de onde ele copiou é:

Define uma interface para criar um objeto, mas deixa que as subclasses decidam qual classe instanciar.

ArianeRebellato

ai, acho tão difíceis e chatas estas definições…pq não simplificam? né??

Eu conseguiria desfazer uma ação de excluir uma conta com o Command por exemplo??

Suportar ?undo? (desfazer). A operação Execute do Command pode armazenar o estado para reverter seus efeitos no próprio comando. A interface Command deve ter uma operação adicional ?Unexecute? que reverte os efeitos de uma chamada prévia para Execute.

danieldomingues86

Olá,

Olha primeiramente vou postar o seu código novamente, dei uma ajeitada pra ficar melhor :) E aproveitei e fiz mais uma classe abaixo pra voce usar de comparação com o Singleton, acho até interessante mostra-la se quiser, se não fica a dica ai.

package com.patterns.singleton;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/** 
* Padrão de projeto aplicado: 
* 
* Singleton: estabelece a regra de que só pode existir um objeto disponível  
* na memória para a classe que implementa este padrão.  
* Temos um objeto HibernateUtil já instanciado dentro da própria classe e  
* ninguem de fora consegue fazer um new() dessa classe, ou seja o  
* construtor private é essencial para se ter um Singleton, pois impede a instanciação da classe. 
*/  
public final class HibernateUtil {  
  
    private static final HibernateUtil INSTANCE = new HibernateUtil();  
    private static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("ContasPU");  
  
    // construtor privado impede a instanciação pelos clientes  
    private HibernateUtil() {}  
  
    // retorna o objeto HibernateUtil estático  
    public static HibernateUtil getInstance() {  
        return INSTANCE;  
    }  
  
    public EntityManager getEntityManager() {  
       return factory.createEntityManager();  
    }  
}  



/**
 * Uso de classe totalmente static comparada com o padrão Singleton. (Static vc Singleton)
 * Em termos de uso e de alocação de memória da exatamente na mesma.
 * A diferença é que o exemplo acima com o uso de Singleton torna o uso mais elegante
 * por estar aplicando OOP, ou seja através do uso de objetos.
 * Apenas é demonstrado que com uma classe totalmente static pode se conseguir o mesmo 
 * efeito de uma classe Singleton.
 */

final class HibernateUtil2 {  
	  
    private static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("ContasPU");  
  
    // construtor privado impede a instanciação  
    private HibernateUtil2() {}  
  
    public static EntityManager getEntityManager() {  
       return factory.createEntityManager();  
    }  
}

Em relação ao padrão Command o que voce entendeu sobre ele até agora? pra que serve exatamente ele?

Abraços,
Daniel

rogelgarcia

O Command… mesmo sem a implementação do undo… ainda é um command…

ArianeRebellato

ele transformação uma requisição em um objeto. Este objeto pode ser armazenado e distribuído como qualquer outro objeto, tem que ter uma classe abstrata Command, que declara uma interface para execução dos métodos …não muito…não to conseguindo enxergar aonde eu posso encaixar estes padrões no sistema de contas…acho que este é o problema maior…

pode ser a hr…

ArianeRebellato

e ele define um comando a ser executado. Ele permite que um um comando seja encapsulado de modo que ele possa ser utilizado entre vários objetos.

danieldomingues86

Não é que transforma a requisição em um objeto…

O Command é uma classe que encapsula uma solicitação, por exemplo : Imagine que voce tenha uma botão de adicionar, voce então cria uma AdicionarCommand que vai representar a ação que será feita através dessa solicitação que veio de sua página, no caso do seu .jsp, ententeu?

Segue um material legal de referencia : http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/command.htm

Abraços
Daniel

rogelgarcia

[leia o post abaixo primeiro]

Bem… cada command representa uma ação do seu sistema…

Então você terá um InsertCommand, um UpdateCommand, DeleteCommand… etc…

Cada Command, pode ter um nome… Você cria uma lista desses commands… e passa para algum objeto que irá mostrar ao usuário quais opcoes ele tem (de acordo com um atributo da classe command que dá um nome para a acao)

O usuário esolhe qual command ele quer executar… e então você chama o método execute do command escolhido… que irá executar a tarefa…

Num sei é se deu pra entender… tentei resumir… :smiley:

rogelgarcia

Acho que mais resumido fica melhor…

Bem… cada command representa uma ação do seu sistema…

Então você terá um InsertCommand, um UpdateCommand, DeleteCommand… etc…

Você cria uma lista desses commands (um de cada tipo)… e mostra ao usuário quais opcoes ele tem

O usuário esolhe qual command ele quer executar… e então você chama o método execute do command escolhido… que irá executar a tarefa…

ArianeRebellato

auhauhauaha…que loucuura…o resumo do resumo do resumo…eu começo criando um arquivo Command pra cada ação então?? E uma interface command (primeiro)…

ArianeRebellato

Daniel!! É o mesmo material que eu já estava olhando…bom mesmo…obrigada

danieldomingues86

Esse material é ótimo mesmo.

Bem acho que vou nessa… até mais e boa sorte com os padrões :slight_smile:

De qualquer forma antes de ir deixo minha sugestão para seu terceiro e ultimo padrão que precisa… o padrão DAO (Data Acess Objet).

Obs: Como voce vai acessar um banco de dados por causa do Hibernate esse padrão vai cair como uma luva pra voce :slight_smile:

Abraços
Daniel.

rogelgarcia

Para o comand, inicialmente voce cria uma interface:

interface Command {

     String getName();
     void execute();
}

Aí você cria uma classe que implementa Command que executa determinada ação no sistema:

public class AdicionarUsuario implements Command{
      public String getName(){ return "Adicionar Usuario";}
      public void execute(){
             System.out.println("Digite o nome do usuario: ");
             String nome = readLine(); //essa funcao readLine lê uma linha do console.. uma funçao que eu criei aqui.. se quiser fazer igual terá que implementar
             System.out.println("Digite a senha do usuario: ");          
             String senha = readLine(); //essa funcao readLine lê uma linha do console.. uma funçao que eu criei aqui.. se quiser fazer igual terá que implementar
             Usuario usuario = new Usuario();
             usuario.setNome(nome);
             usuario.setSenha(senha);
             HibernateUtil.getInstance().getManager().persist(usuario); //nao sei qual é o nome do método aqui que tem que chamar para persistir pq nao uso JPA
      }
}

E você cria uma classe que implementa Command para cada possível operacao do seu sistema…

Faz uma forma de menu… que exiba todas as funcoes possíveis para que o usuário escolha de alguma forma

O usuário escolhe e então vc chama o execute()… que efetua a operacao…

Isso foi só um exemplo do que é um command… nao necessariamente precisa implementar assim…

ArianeRebellato

é fácil, mass é difícil…eu me atrapalho td…

Todas as minhas ações estão nos arquivos jsp…separei elas em editar.jsp, inserir.jsp, excluir.jsp e listar.jsp…isso pq na primeira etapa do trabalho que não exigia usar padrões eu achei mais fácil pois dava conflito entre elas por usarem o id cm parâmetro…e eu uso o manager para fazer a transação e persistir, etc…bom …vou colar meu método inserir e se puder me aponte nele como seria, que eu acredito que vou entender melhor…e o menu que tu diz, pode ser qualquer menu?? eu tenho um no cabeçalho, simples, só pra apontar as ações mesmo…poderia ser este?? bom…lá vai

inserir.jsp

//Objeto HibernateUtil 
    EntityManager manager = HibernateUtil.getInstance().getManager();

    Contas contas = new Contas();

    if (request.getParameter("id") != null) {
        contas = manager.find(Contas.class, Integer.parseInt(request.getParameter("id")));
    }

    if (request.getMethod().equals("POST")) {
        contas.setDescricao(request.getParameter("descricao"));
        contas.setTipo(request.getParameter("tipo").charAt(0));
        try {
            contas.setDt_baixa(DateFormat.getDateInstance().parse(request.getParameter("dt_baixa")));
            contas.setDt_lancamento(DateFormat.getDateInstance().parse(request.getParameter("dt_lancamento")));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro" + e);
        }
        contas.setValor(Double.parseDouble((request.getParameter("valor"))));



        manager.getTransaction().begin();
        manager.persist(contas);
        manager.getTransaction().commit();
    }


%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Gerenciar Contas</title>
    </head>
    <body style="color: cornsilk">
        <p> <%@ include file="cabecalho.jsp" %></p>
        <p align="center">Lista de Contas</p>
        <table border="1" align="center">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Descrição</th>
                    <th>Dt Lançamento</th>
                    <th>Dt Baixa</th>
                    <th>Tipo</th>
                    <th>Valor</th>
                </tr>
            </thead>
            <tbody>
                <%
                    Query query = manager.createQuery("select c from Contas c");// vai recuperar coleção de objeto

                    ArrayList<Contas> lista = (ArrayList<Contas>) query.getResultList();
                    for (Contas conta : lista) {


                %>

                <tr>
                    <td><%= conta.getId()%></td>
                    <td><%= conta.getDescricao()%></td>
                    <td><%= conta.getDt_lancamento()%></td>
                    <td><%= conta.getDt_baixa()%></td>
                    <td><%= conta.getTipo()%></td>
                    <td><%= conta.getValor()%></td>
                    <td> <a style="text-decoration: none; color: aliceblue" href="editar.jsp?id=<%=conta.getId()%>">Editar</a></td>


                </tr>
                <%  }

                    contas = new Contas();
                    manager.close();

                %>
            </tbody>
        </table>
        <br>
        <form name="formulario" method="POST">
            <table width="264" border="0" align="center" cellpadding="0" cellspacing="5">
                <tr>
                    <td height="49" colspan="2" class="FORMULARIO" ><p align="center">Adicionar Conta</p></td>
                </tr>
                <tr>
                    <td width="104" class="FORMULARIO">Descrição:</td>
                    <td width="144" class="FORMULARIO"><input type="text" name="descricao" value="<%= contas.getDescricao()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Tipo:</td>
                    <td class="FORMULARIO"><select name="tipo">
                            <option value="E">Pagar</option>
                            <option value="R">Receber</option>
                        </select></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Data de Lançamento:</td>
                    <td class="FORMULARIO"><input type="text" name="dt_lancamento" value="<%= contas.getDt_lancamento()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Data de Baixa:</td>
                    <td class="FORMULARIO"><input type="text" name="dt_baixa" value="<%= contas.getDt_baixa()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Valor:</td>
                    <td class="FORMULARIO"><input type="text" name="valor" value="<%= contas.getValor()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">&nbsp;</td>
                    <td class="FORMULARIO">
                        <input type="submit" value="Enviar" name="enviar" />
                    </td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                </tr>
            </table>
        </form>
        <center> <a style="text-decoration: none; color: aliceblue" href="index.jsp">>>Voltar para página principal</a></center>

        <p> <%@ include file="rodape.jsp" %></p>

cabecalho.jsp

<%-- 
    Document   : cabecalho
    Created on : 14/04/2011, 22:53:23
    Author     : SONY
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link type="text/css" href="css/jquery.css" rel="stylesheet" />
        <script type="text/javascript" src="js/jquery.js"></script>
        <script type="text/javascript" src="js/jquery.ui.datepicker-pt-BR"></script>
    </head>

    <body>
        <p align="center"><strong>GERENCIAMENTO DE CONTAS</strong><br /><br />
        <a style="text-decoration: none; color: aliceblue" href="index.jsp" >Página Principal</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="inserir.jsp" >Inserir Conta</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="listar.jsp" >Listar Contas</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="excluir.jsp" >Excluir Contas</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="editar.jsp" >Editar Contas</a><br /><br />
<br />
<br />
            <img src="imagens/top_pag_conta.jpg" id="bgimg"></p>
    </body>
</html>
rogelgarcia

Hummm… como seu projeto é web… complica um bocado usar o command… seriam necessárias muitas estruturas…

Faz o DAO primeiro… que acho que será mais fácil…

ArianeRebellato

ehehehe…taa…valeu…até depois, com certeza…pq to devagar hj…

rogelgarcia

Vou olhar um padrao ali mais fácil de aplicar no seu sistema web…

Por enquanto faz o DAO… que é bem fácil…

O DAO é simplesmente uma classe que contém as suas consultas ao banco de dados…

Uma DAO para cada entidade

ArianeRebellato

eu só tenho a entidade contas…então só faço um dao p ela né? com tds os métodos lá?? ai posso tirar os métodos de dentro dos jsp e só fazer uma chamada por um objeto dao?

rogelgarcia

isso… vc pode fazer o seu DAO ser um singleton tb… só pra enfeitar…

ArianeRebellato

ahahaha…boa…vou tentar fazer aqui e posto…já usei o dao, mas em projetos que não utilizava o hibernate…e sem ser para web tbm…então, complicou…

ArianeRebellato

ai…
to fazendo sem saber o que to fazendo…heeheh…mas inseriu…mas não pode ser…

public class ContasDAO {

    EntityManager manager = HibernateUtil.getInstance().getManager();

    public ContasDAO() {
    }

    public void inserirConta( Contas conta) {
        
        manager.getTransaction().begin();
        manager.persist(conta);
        manager.getTransaction().commit();
    }

pq td o resto tem que tar na página jsp…

rogelgarcia

É isso mesmo… já tem um DAO… agora é só colocar as outras funcionalidades…

O DAO é um design pattern bem simples…

ArianeRebellato

acho que não consigo fazer um dao pro listar né?? me ajuda a dar uma olhada…

<%-- 
    Document   : listarTodas
    Created on : 12/06/2011, 16:04:21
    Author     : SONY
--%>

<%@page import="entidades.Contas"%>
<%@page import="java.util.ArrayList"%>
<%@page import="javax.persistence.Query"%>
<%@page import="util.HibernateUtil"%>
<%@page import="javax.persistence.EntityManager"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SISTEMAS DE CONTAS</title>
    </head>
     <body style="color: cornsilk">
        
         
        <p> <%@ include file="cabecalho.jsp" %></p>
        <p align="center">Lista de Contas</p>
        <table border="1" align="center">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Descrição</th>
                    <th>Dt Lançamento</th>
                    <th>Dt Baixa</th>
                    <th>Tipo</th>
                    <th>Valor</th>
                </tr>
            </thead>
            <tbody>
                <%
                    EntityManager manager = HibernateUtil.getManager();

                    Query query = manager.createQuery("select c from Contas c");

                    ArrayList<Contas> lista = (ArrayList<Contas>) query.getResultList();
                    for (Contas conta : lista) {


                %>

                <tr>
                    <td><%= conta.getId()%></td>
                    <td><%= conta.getDescricao()%></td>
                    <td><%= conta.getDt_lancamento()%></td>
                    <td><%= conta.getDt_baixa()%></td>
                    <td><%= conta.getTipo()%></td>
                    <td><%= conta.getValor()%></td>
                    <td> <a style="text-decoration: none; color: aliceblue" href="editar.jsp?id=<%=conta.getId()%>">Editar</a> &nbsp;&nbsp;</td>
                    <td> <a style="text-decoration: none; color: aliceblue" href="excluir.jsp?id=<%=conta.getId()%>">Excluir</a> &nbsp;&nbsp;</td>


                </tr>
                <%  }

                    manager.close();

                %>
            </tbody>
        </table>
     <center>
        <a  style="text-decoration: none; color: aliceblue" href="listar.jsp">>>Voltar paras opções de listagem </a></center>


        <p> <%@ include file="rodape.jsp" %></p>
    </body> 
</html>

o inserir e o editar de boa…são iguais até, ehehehe…mas o excluir deu pau…mas fiz a mesma coisa…

<%@page import="DAO.ContasDAO"%>
<%@page import="java.text.DateFormat"%>
<%@page import="entidades.Contas"%>
<%@page import="java.util.ArrayList"%>
<%@page import="javax.persistence.Query"%>
<%@page import="javax.persistence.EntityManager"%>
<%@page import="util.HibernateUtil"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<%
    EntityManager manager = HibernateUtil.getInstance().getManager();
    Contas contas = new Contas();
    ContasDAO cDAO = new ContasDAO();


    if (request.getParameter("id") != null) {
        contas = manager.find(Contas.class, Integer.parseInt(request.getParameter("id")));

        cDAO.excluirConta(contas);
        //manager.getTransaction().begin();
        //manager.remove(contas);
        //manager.getTransaction().commit();

    }

%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Gerenciar Estados</title>
    </head>
    <body style="color: cornsilk">
        <p> <%@ include file="cabecalho.jsp" %></p>
        <p align="center">Excluir Conta </p>
        <table border="1" align="center">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Descrição</th>
                    <th>Dt Lançamento</th>
                    <th>Dt Baixa</th>
                    <th>Tipo</th>
                    <th>Valor</th>
                </tr>
            </thead>
            <tbody>
                <%
                    Query query = manager.createQuery("select c from Contas c");

                    ArrayList<Contas> lista = (ArrayList<Contas>) query.getResultList();
                    for (Contas conta : lista) {


                %>

                <tr>
                    <td><%= conta.getId()%></td>
                    <td><%= conta.getDescricao()%></td>
                    <td><%= conta.getDt_lancamento()%></td>
                    <td><%= conta.getDt_baixa()%></td>
                    <td><%= conta.getTipo()%></td>
                    <td><%= conta.getValor()%></td>
                    <td>
                        <a style="text-decoration: none; color: aliceblue" href="excluir.jsp?id=<%=conta.getId()%>">Excluir </a></td>

                </tr>
                <%  }

                    contas = new Contas();
                    manager.close();

                %>
            </tbody>
        </table>
        <br>
        <center> <a style="text-decoration: none; color: aliceblue" href="index.jsp">>>Voltar para página inicial</a></center>

        <p> <%@ include file="rodape.jsp" %></p>

    </body>
</html>

e o dao

public void excluirConta(Contas conta) {
        manager.getTransaction().begin();
        manager.remove(conta);
        manager.getTransaction().commit();
    }
rogelgarcia

No DAO… o método para listar deve conter esse código:

EntityManager manager = HibernateUtil.getManager();  
  
                    Query query = manager.createQuery("select c from Contas c");  
  
                    List<Contas> lista = (List<Contas>) query.getResultList();
return lista;

Obs: CAST para List

ArianeRebellato

eu estou amannndo isso td!! ahahah…nunca mais vou fazer nadaaaaaaaaaaaaa sem pensar antes nos padrões que eu posso usar…quero aplicar os padrões de projeto na minha vida!! o DAO ta prontinho tbm…lindo, td lindo…eu já vou apresentar este até na outra matéria…a mentira…td lindo não pq excluir eu não consegui pelo dao…não sei oq ue houve…
dá que eu to tentando fazer a remoção de uma instancia desconectada… ??? vai saber…

ArianeRebellato

mas é correto utilizar o PP DAO em aplicações em que eu to usando um framework? o hibernate já não tá atuando como uma camada DAO? entrei em crise agora…

J

ArianeRebellato:
mas é correto utilizar o PP DAO em aplicações em que eu to usando um framework? o hibernate já não tá atuando como uma camada DAO? entrei em crise agora…

Você utiliza hibernate dentro do DAO. No seu, por exemplo, você usou o Entitty Manager, que apesar de ser uma interface da JPA, é implementado pelo hibernate. Você pode fazer um DAO só com JDBC também. O DAO serve para deixar separado os métodos de persistência, insert, update e selects, independente se você utiliza Hibernate, EclipseLink, JDBC, NoSQL e etc. Por isso a sigla quer dizer Data Acess Object.

Tendeu?

ArianeRebellato

entendi, ehehehe…mas não me convenci… :smiley:

rogelgarcia

Hehehe… já que você está toda empolgada com os padrões… eu vou dar algumas diretivas para guiar o seu pensamento…

Não necessariamente você deve pensar em padrões para usar… inclusive, o uso excessivo de padrões pode ser prejudicial.

Dois conceitos que você deve ter ao modelar o seu sistema são:

  • Program to interface, not an implementation (Programe para a interface, não uma implementação)

Isso quer dizer que você deve programar pensando nas funcionalidade um objeto deve prover, e não como ele provê essas funcionalidades.
Programar para interfaces não é simplesmente criar um Interface Java. Com o tempo você vai ver essa frases várias vezes e talvez aja discussão sobre o assunto.
Lembre-se que deve se programar pensando no que um objeto faz, e não como.

O outro conceito…

  • Favor object composition over class inheritance

Favoreça a composição de objetos ao invés de fazer herança. Traduzindo, ao invés de sair fazendo herança, tente modelar o seu sistema de forma que juntando dois objetos ou mais você consiga a funcionalidade desejada.

Essas duas frases são a base de TODOS os design patterns. E também de uma boa modularização de software.

Seguindo esses conceitos os Design Patterns aparecem…
Talvez seja um pouco confuso compreender isso agora, mas com o tempo as coisas vão fazendo sentido…


Sobre o DAO… ele é tão simples assim mesmo, que não tem cara de design pattern mesmo não…(ele não faz parte dos design patterns listados no livro do GOF… o singleton por exemplo faz)

J

Veja sua classe ContaDAO. Ela é uma classe que você criou e você deu alguns comportamentos pra ela (métodos). Inserir Conta, e provavelmente outros como selecionar conta, listar contas e etc. Esse é o seu DAO. Dentro dele, você usa o EntityManager do JPA certo? Mas você não concorda comigo, que você poderia trocar pelo JDBC? E mesmo assim, o comportamento do seu DAO estaria igual, não é mesmo? Inserindo contas, selecionando contas e etc. Ou seja, você tirou o hibernate, colocou o JDBC, mas o seu DAO continua lá, com o mesmo comportamento. E a sua classe de negócios vai chamar o método InserirConta do seu DAO, independente se ele usa hibernate ou JDBC, entendeu?

Por exemplo, estou usando JDBC no código abaixo....e mesmo assim usando DAO concorda? Fiz um exemplo bobo só para você entender...

public class ContasDAO {  
      

      
        public ContasDAO() {  
        }  
      
        public void inserirConta( Contas conta) {  
              Connection conn = getConnection(); //abstracao
             PreparedStatement stmt = conn.prepareStatement(
              "insert into conta (...) values (....) ");
           stmt.setInteger( 1, conta1.getId() );
           stmt.setInteger( 2, conta1.getTitular() );
           //outros sets dentro PreparedStatement
           stmt.executeUpdate();
            stmt.close();
          conn.commit(); 
            conn.close();
            
        }

Agora um exemplo da classe de negócios...veja que pra ela, indifere se você usa o Hibernate ou o JDBC....ela chama o método e o DAO que se vire para fazer o que tem que fazer =)

public class Negocios {

	public void metodoNegocio(Conta conta) {
		ContaDao dao = new ContaDAO();
		dao.inserirConta(conta);
	
	}  


}

Ficou mais claro?

ArianeRebellato

Eu entendi sim…muito obrigada pelo esclarecimento…eu já usava o dao, mas com o JDBC…estamos a pouco tempo trabalhando com o hibernate…sb cm é dentro de sala de aula né…se tu não vai atras por fora acaba não aprendendo nada…e além disso precisamos praticar…eu costumo comparar com uma língua nova…tem que ouvir, falar e escrever…não se sai falando uma língua nova de um dia pro outro e muito menos sem praticar e estudar…

rogelgarcia…

Sobre o DAO… ele é tão simples assim mesmo, que não tem cara de design pattern mesmo não…(ele não faz parte dos design patterns listados no livro do GOF… o singleton por exemplo faz)

devo me preocupar com isso? ou um design pattern é um design pattern e ponto final? não vimos o dao em aula, acho que justamente por ele ser conhecido e fácil de implementar…mas em nenhum momento o professor falou “não usem o DAO!!”, eheheh, então acho que td bem, né?

Tu podia me dar maaais uma forcinha e me indicar algum outro PP que eu posso aplicar neste mesmo projeto né? ehehe…Acredito que pra ti seja mais fácil visualizar…eu dos poucos que conheço não vejo aonde eles se encaixariam sabe? cm tu disse,

Talvez seja um pouco confuso compreender isso agora, mas com o tempo as coisas vão fazendo sentido…

rogelgarcia

Não… precisa preocupar nao… DAO é um design pattern… mas pergunte o seu professor se ele quer um design pattern qualquer… ou um do GOF…

Pergunta se ele aceita o DAO…

Você sabe usar servlets?

Mude a sua aplicação de forma que todas as requisições vão direto para algum servlet… e esse servlet redireciona para o JSP… (isso possibilitará outro design pattern)

ArianeRebellato

ai deus…servlet é um servidorzinho? vi pouca coisa sobre o assunto…mas posso aprender…

rogelgarcia

aprenda entao… e faça essa modificacao no seu projeto…

primeiro vai no servlet… e o servlet redireciona (forward) para o jsp

ArianeRebellato

Bom dia…achei um exemplo interessante…de validação de campos que acho que encaixaria com o meu projeto de alguma forma…a dúvida é se eu consigo aplicar isso nos meus formulários em html…

http://javafree.uol.com.br/artigo/873709/Padroes-de-projeto-e-OO-Um-exemplo-pratico-de-utilizacao.html

rogelgarcia

Não recomendaria esse no seu projeto…
1- É em swing e seu projeto é web
2 - Nao li direito mas achei complexo demais… iria causar confusão

ArianeRebellato

pzé…eu vi que é em swing…tava tentando adaptar…mas não consegui mesmo…porém, ia ser legal…

peczenyj

Gostei muito desta palestra do @vquaiato

http://viniciusquaiato.com/blog/yagni-no-dnad11-videos-da-palestra/

http://viniciusquaiato.com/blog/slides-palestra-yagni-kiss-e-over-patternization-no-dnad11/

ArianeRebellato

Li um monte, dentro do possível dei uma estudada e resolvi aplicar o pp filter neste projeto…tinha visto um exemplo bom e só adaptei pro meu projeto em jsp…principalmente por não ter conseguido achar nenhum que se encaixasse com o meu trabalho…mas, assim como os outros padrões, ainda não compreendi 100% o filter…preciso de ajuda pra entender o que ta acontecendo realmente…quis fazer um sistema de login de usuário que utiliza filtros (utilização do padrão Filter) de controle para definir o tipo de acesso que cada usuário terá no sistema. O usuário administrador terá acesso total e o usuário padrão restrito.

Tenho um formulário que chama a página:

logarUsuario.jsp

<%
            Usuario usuario = new Usuario();
            usuario.setLogin(request.getParameter("login"));
            usuario.setSenha(request.getParameter("senha"));

            LoginConcreto login = new LoginConcreto();
            if (login.autentica(usuario)) {
                if (login.getTipo(usuario.getLogin()) == LoginFilter.ADM) {
                    LoginFilter lFilter = new LoginAdm(login);
                    lFilter.getOperacao();
                    out.println("<script>document.location.href='index.jsp';</script>"); //Exibe um código javascript para redireionar ao painel

                } else {
                    LoginFilter lFilter = new LoginPadrao(login);
                    lFilter.getOperacao();
                    out.println("<script>document.location.href='index2.jsp';</script>"); //Exibe um código javascript para redireionar ao painel

                }
            } else {
                JOptionPane.showMessageDialog(null, "Usuário não cadastrado");
                out.println("<script>document.location.href='login.jsp';</script>"); //Exibe um código javascript para redireionar ao painel

            }


        %>

LoginFilter.java

public class LoginFilter extends Login {
    
    public final static int ADM = 1;
    public final static int PADRAO = 2;
    //private ArrayList<Object> list = new ArrayList<Object>();
    private Login login;
    
    public LoginFilter(Login login){
        this.login = login;
    }

    public ArrayList<Operacao> getOperacao(){
        return login.getOperacao();
    }
}

se alguém por gentileza puder fazer o favor de dar uma olhada…eu me perdi já…se eu logo como administrador dá td certinho…mas se eu tento logar como padrão me diz que o usuário não existe…eu não to sabendo testar isso…eu achei que só o que ta no logarUsuario.jsp bastasse…

Criado 18 de junho de 2011
Ultima resposta 26 de jun. de 2011
Respostas 79
Participantes 6