Chamar uma classe DAO na minha Servlet

Senhores,

Eu tinha uma aplicação em Swing na qual montava uma Jtable. Eram 4 classes na qual uma continha os metedos da minha Jtable, outra era a minha classe DAO onde continha todas as informações do banco e onde populava minha List, outra continha os campos da minha tabela e por ultima a minha classe principal onde construía minha tabela e exibia em um JPanel.

Bom, agora eu estou passando isso para Web. Quero fazer em JSP e servlet. No meu projeto, minha CLASSE DAO está assim:

public class DAO{

	static ResultSet rs;
	static Statement MeuState;
	static String SQL;
	public DAO(){
	}

	public static List<Campos> listarClientes() {
		List<Campos> lista = new ArrayList<Campos>();
		try {
 			String url = "url de conexão";
 			Class.forName("com.intersys.jdbc.CacheDriver");

 			Connection conn = DriverManager.getConnection(url);
 			MeuState = conn.createStatement();
 			SQL = "select campo1, " +//1
 				"campo2," +//2
 				"campo3," +//3
 				"campo4," +//4
        			"FROM Tabela";

                                rs = MeuState.executeQuery(SQL);                                                             
                                while (rs.next()){
 	        		lista.add(geraContato(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4)))
 	        	}

 	        }
		}
 	    catch (SQLException e) {
 			e.printStackTrace();
 		}

 		catch (ClassNotFoundException ex) {
 			System.out.println(ex.getMessage());
 		}

		return lista;
	}

	public static Campos geraContato(String a1, String a2, String a3, String a4) {
		Campos c = new Campos();
		c.setProduto(a1);
		c.setBitola(a2);
		c.setArmazem(a3);
		c.setEstoque(a4);
		return c;
	}
}

e minha classe aonde contém os CAMPOS da tabela é:

public class Campos implements  Serializable {

	private static final long serialVersionUID = 1L;
	private String Produto;
	private String Bitola;
	private String Armazem;
	private String Estoque;

	public String getProduto() {
		return Produto;
	}

	public void setProduto(String produto) {
		this.Produto = produto;
	}

	public String getBitola() {
		return Bitola;
	}

	public void setBitola(String bitola) {
		this.Bitola = bitola;
	}

	public String getArmazem() {
		return Armazem;
	}

	public void setArmazem(String Armazem) {
		this.Armazem = Armazem;
	}

	public String getEstoque() {
		return Estoque;
	}

	public void setEstoque(String estoque) {
		this.Estoque = estoque;
	}

}

Bom, a minha dúvida é como eu faço pra chamar a minha consulta da minha classe DAO na minha Servlet e distribuí-la em uma table html simples ??

Obrigado pela atenção!

Você deve chamar normalmente o método da classe DAO, populando um ArrayList ou um Vector ou qualquer tipo que permita coleção de dados e, colocar isto na sessão, por exemplo.
Aí você direciona para uma jsp e ali implementa um for que percorre a coleção e mostra os dados

E ai MarujoRafao, conseguiu resolver?

Ola,

Aproveitando sua classes voce faria desse jeito:

  1. em Servlet
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author luiz
 */
public class ListarCampos extends HttpServlet {
   

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            DAO dao = new DAO();
            List<Campos> listaCampos = dao.listarClientes();
            
            for (Campos campo : listaCampos){
                out.println("Campo Produto: " + campo.getProduto);
                out.println("Campo Bitola: " + campo.getBitola);
                out.println("Campo Armazem: " + campo.getArmazem);
                out.println("Campo Estoque: " + campo.getEstoque);
            }           
            
        } finally { 
            out.close();
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

}
  1. em JSP
<%-- 
    Document   : listaCamposJSP
    Created on : 13/11/2010, 11:35:28
    Author     : luiz
--%>

<%@page import="java.util.List"%>
<%@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">
        <title>Listar Campos</title>
    </head>
    <body>
        <h1>Listar Campos</h1>

        <%

                    try {
                        DAO dao = new DAO();
                        List<Campos> listaCampos = dao.listarClientes();

                        for (Campos campo : listaCampos) {
                            out.println("Campo Produto: " + campo.getProduto);
                            out.println("Campo Bitola: " + campo.getBitola);
                            out.println("Campo Armazem: " + campo.getArmazem);
                            out.println("Campo Estoque: " + campo.getEstoque);
                        }

                    } finally {
                        out.close();
                    }


        %>

    </body>
</html>

Abraços

Obrigado pelas respostas.

Henrique, eu entendi os seus exemplos. Mas ele nao me retornou a minha lista. O projeto nao deu erro nem nda. MAs a minha tabela está vindo vazia, só com o cabeçalho. Alguma idéia?

drsmachado, como eu coloco um arraylist na sessão e depois chamo isso no jsp? Fica mais rápido do que chamar direto no jsp como o Henrique exemplificou?

Mais uma vez, obrigado a todos pela ajuda

Vc está usando jstl?

posta seus codigos da servlet e da jsp pra eu ver.

Olá,

que tal fazer um teste com sua classe DAO no JUnit verificando se ela esta funcionando corretamente(pegando os dados do banco de dados…).

em relação a sessão você pode fazer algo desse jeito:


        List<Object> lista = new Arraylist<Object>();

         HttpSession sessao = request.getSession();  
         sessao.setAttribute("dados", lista);  
         RequestDispatcher rd =  request.getRequestDispatcher("suaJspQueVaiReceberosDados.jsp");  
         rd.forward(request, response);  

Abraços

marujorafao…
No exemplo abaixo mostra como vc pega a lista na jsp. Mas vc tem que usar as tags jstl.
So que nesse exemplo não é na sessao, mas se vc quiser colocar na sessao vc so muda essas linha:

request.setAttribute(“lista_para_tabela”, suaLista);
para
request.getSession(true).setAttribute(“lista_para_tabela”, suaLista);

e na jsp vc muda:

<c:forEach var=“objeto_lista” items="${requestScope.lista_para_tabela}">
para

<c:forEach var=“objeto_lista” items="${sessionScope.lista_para_tabela}">

na servlet…

public class SuaServlet extends HttpServlet {
      
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try
        {
            List<seuObjeto> suaLista = new ArrayList<seuObjeto>();
            suaLista = chama_aqui_o_metodo_que_retorna_lista();
            request.setAttribute("lista_para_tabela", suaLista);
            RequestDispatcher rd = request.getRequestDispatcher("/SuaJsp.jsp");
            rd.forward(request, response);
           
        }  catch(SQLException ex)
        {
           request.setAttribute("erro", ex.toString());
           RequestDispatcher rd = request.getRequestDispatcher("/PaginaErro.jsp");
           rd.forward(request, response);
        }
        catch(Exception ex)
        {
           request.setAttribute("erro", ex.toString());
           RequestDispatcher rd = request.getRequestDispatcher("/PaginaErro.jsp");
           rd.forward(request, response);
        } finally {
            out.close();
        }
    } 
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 
   
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
   
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

na sua jsp faz assim:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:useBean id="cli" class="SeuObjeto"/>

   <div id="titulo" align="center">
               <div id="dentro">
            <form action="SuaServlet " method="post">

                       

               <table>
                   <thead bgcolor='#0000FF'>
                        <tr>
                            <th><font color='#FFFFFF'>Campo1</font></th>
                            <th><font color='#FFFFFF'>Campo2</font></th>                           
                        </tr>
                    </thead>
                   <c:forEach var="objeto_lista" items="${requestScope.lista_para_tabela}">
                            <tr>
                              <td width="10px">
                                  <input type="text" name="nome" value="${objeto_lista.atributo1}"/></td>
                              <td width="10px">
                                  <input type="text" name="cpf" value="${objeto_lista.atributo2}"/>
                              </td>
                            </tr>
                    </c:forEach>
                </table>
               </form>

Se vc não intendeu pergunta ai.

ENtão Henrique, agora está funcionando. Havia um erro juvenil no meu html mesmo e por isso não mostrava os dados ¬¬

Então, em relação a sessão e esse código que vc citou:

Eu coloco ele aonde? Na minha classe DAO ? Ou eu crio uma servlet pra chamar a minha lista, jogar na sessão e então passar pro jsp?

E como eu faria pra resgatar a sessão no jsp? Pq eu percebi que pela Servlet ele vai mais rapido que pelo jsp. Mas nao da pra jogar o html la na servlet neh… fica muito confuso pra dar manutenção depois… =/

Ireny, obrigado pela ajuda. Eu nao vou ter tempo de estudar jstl. Vou fazer do jeito basico mesmo com jsp e servlet mesmo. Mas de qualquer jeito, muito obrigado pela atençao!

jstl é facil demais, é so vc adiciaonar as bibliotecas e colocar essas 2 linhas no codigo jsp

<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt” %>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

e pra falar a verdade eu nao conheço outra forma de fazer isso no jsp e servlet, quando eu tava estudando e precisei fazer isso me falaram q eu teria q usar jstl

vo te passar um link de onde vc pode baixar as bibliotecas, é rapidinho

http://www.guj.com.br/posts/list/30792.java
depois vc adiciona os 2 arquivos nas bibliotecas do seu projeto
e coloca aquelas 2 linhas q coloquei ali em cima
e pronto.

Como eu faço p´ra postar codigo fonte desse jeito ai que fica tudo formatadinho? Eu sou nova aqui.

Olá,

Realmente com o JSTL se tem um aumento significativo no desenvolvimento, com suas Tag’s, mas se for trabalhar com JSTL ja compensa começar a estudar também JSF

então vc chama a Servlet que chama o código da sessão (faz a operação com sua DAO, joga na sessão) e em seguida dispara pra JSP que vai disponibilizar os dados.
pense em uma arquitetura MVC,

Controler - Servlet (acessa a DAO e envia para a JSP)
Model - DAO (faz acesso ao banco de dados )
Visao - JSP (que mostra os dados)

basicamente seria isso.

abraços

Como eu faço p´ra postar codigo fonte desse jeito ai que fica tudo formatadinho? Eu sou nova aqui. [/quote]

ireny

leia isto aqui que vc vai entender como colocar as tags corretas

http://guj.com.br/posts/list/50115.java

é só colocar [code]

Olá

não entendi gmsilva.

qual o propósito de sua mensagem?

Abraços

henriquetec

ajudar o forum a ficar organizado

entende ???

entendido.

qualquer duvida conte cmg.

Abraços

Obrigado pelas respostas Henrique.

Exatamente, um MVC. Foi isso mesmo que eu pensei e li aqui a respeito em alguns tutoriais.

Mas vamos la:

  1. Eu tenho as minha classes DAO e CAMPOS que faz a conexão com o banco e joga o valor dos campos da tabela dentro de uma List.

  2. Aí eu tneho minha Servlet. Essa Servlet eu chamo a minha classe DAO:

import Classes.Campos;
import Classes.DAO;
public class (..........)
DAO dao = new DAO();
List<Campos> listaCampos = dao.listarClientes();

E depois jogo ela na sessão:

request.getSession().setAttribute("dados", listaCampos);

Dúvida 1: Como eu faço para que minha servlet chame o jsp para exibição dos dados?

Dúvida 2: Na minha jsp, como eu recupero os dados da minha sessão para montar um for? Seria assim:

List<Campos> listaCampos = (List<Campos>)request.getSession().getAttribute("dados");
for (Campos campo : listaCampos) {
out.println("<td align='center' width=''> " + campo.getProduto() + "</td>");
}

Não teria um jeito de montar tudo na Servlet e então o jsp só exibir, deixando toda a sobrecarga pro servidor? Senão, isso no cliente vai ficar pesado. Tenho uma tabela com 42 colunas e mais de 500 linhas ¬¬

Muito obrigado pela atenção

Ola ,
Primeira Resposta


        HttpSession session = request.getSession();
        session.setAttribute("cli", lista);

        RequestDispatcher rq = request.getRequestDispatcher("resultado.jsp");
        rq.forward(request, response);

Segunda

nesse caso ja compensa usar o JSTL (recurso foreach)

se precisar de exemplo me avise.

Abraços

Fala Henrique…

Entendi cara. Eh, acho que eu vou precisar usar jstl mesmo. Pq eu estou com um problema de desempenho. Vc poderia entao postar um exemplo pra mim? No caos, o meu trabalho soh iria aumentar em relação as tagslib que ue teria que colocar?

Apesar der que eu irei precisar manipular essa tabela, talvez até mesmo usando ajax. Tipo, se muda algo na linha (x1,y1) a coluna Y vai mudar de cor, ou de valro, ou vai fazer um novo calculo baseado nas informaçoes que ja constam… enfim. O jstl seria mesm oa melhor solução pra isso?

Abraço e obrigado