Aplicando padrões de projeto

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…

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…

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

O DAO é um design pattern bem simples…

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();
    }

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

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…

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…

[quote=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…
[/quote]

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?

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

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)

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…

[code] 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();
        
    }[/code]  

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 =)

[code]public class Negocios {

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

}  

}[/code]

Ficou mais claro?

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…[quote]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)[/quote]

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,

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

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)

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

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

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

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

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

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

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/

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…