JSTL Consultando dados no MySQL

13 respostas
alexandre.marques

Caros, Bom Dia!

Primeiramente um Feliz Natal a todos!

alguém pode me ajudar?

Eu preciso mostrar os dados de uma tabela chamada produtos no JSP, porém, tem um campo chamado categoria que faz parte de outra tabela, eu preciso mostrar o nome da categoria também.
Qual a melhor forma de fazer isso?

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
 <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>   
<!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=ISO-8859-1">
<title>Editar Produtos</title>
<style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
}
-->
</style>
<link href="file:///D|/Aplicações_Web/php/aplicações_php/css.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="760" border="0" align="center" cellpadding="0" cellspacing="0" style="border:#006699 solid 1px">
  <tr>
    <td height="62" colspan="2" bgcolor="#eeeeee" class="titulo1">&nbsp;&nbsp;Administração - Ver/editar produtos</td>
  </tr>
  <tr>
    <td width="161" valign="top" style="border-right:#006699 solid 1px"></td>
    <td width="597" valign="top">
    <br></br>
      <table width="100%" border="1" cellpadding="0" cellspacing="0">
     [b]<jsp:useBean id="dao_prod" class = "Controle.Produto_DAO" />[/b]
            <tr bgcolor="#eeeeee" class="menuadm">
            <td width="8%" height="30">Cod produto</td>
            <td width="35%" height="30">nome</td>
            <td width="8%" height="30">Qtd estoque</td>
            <td width="5%" height="30">Ativo</td>
            <td width="13%" height="30">Categoria</td>
          </tr>
            <tr>
            <c:forEach var = "produtos" items = "${dao_prod.lista}">
              <td width="8%">${produtos.id_prod}</td>
              <td width="35%" height="25%">${produtos.nome}</td>
              <td width="8%">${produtos.qt_estoque}</td>
              <td width="5%">${produtos.prod_ativo}</td>
              <td width="13%">${???.categoria}</td>
            </c:forEach>
          </tr>
          <tr>
          <td><a href="index.html">Voltar</a></td>
          </tr>
          </table>
    <br></br>    
<br></br></td>
  </tr>
  <tr>
    <td colspan="2" bgcolor="#eeeeee">&nbsp;</td>
  </tr>
</table>

</body>
</html>
:oops:

13 Respostas

A

dependendo de como você esteja fazendo a consulta, você poderia formatar a query chamada. Se na tabela do produto você tem o código do produto, é só fazer um join:

select m.*, n.categoria from produto as m, categoria as n where m.cod_categoria = n.id

caso não seja este o caso, você disse que quer fazer em jstl, veja se este link aqui te ajuda

Hebert_Coelho

Como você está trazendo essa informação? Você está utilizando JPA? Hibernate? JDBC?

Se for JDBC só fazer como o andre.froes falou.

alexandre.marques

Valeu Amigão! eu dei uma olhada no SQL e tinha um errinho mesmo, porém o problema está na hora de exibir usando JSTL da uma olhada no Foreach da pagina abaixo.

<table width="100%" border="1" cellpadding="0" cellspacing="0">  
          <jsp:useBean id="dao_prod" class = "Controle.Produto_DAO" />
            <tr bgcolor="#eeeeee" class="menuadm">  
            <td width="8%" height="30">Cod produto</td>  
            <td width="35%" height="30">nome</td>  
            <td width="8%" height="30">Qtd estoque</td>  
            <td width="5%" height="30">Ativo</td>  
            <td width="13%" height="30">Categoria</td>  
          </tr>  
            <tr>  
            <c:forEach var = "produtos" items = "${dao_prod.lista}">  
              <td width="8%">${produtos.id_prod}</td>  
              <td width="35%" height="25%">${produtos.nome}</td>  
              <td width="8%">${produtos.qt_estoque}</td>  
              <td width="5%">${produtos.prod_ativo}</td>  
              <td width="13%">${produtos.categoria}</td>  
            </c:forEach>  
          </tr>  
          <tr>  
          <td><a href="index.html">Voltar</a></td>  
          </tr>  
          </table>

A classe abaixo monta a consulta!

package Controle;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.PreparedStatement;

import Modelo.Categorias;
import Modelo.Produtos;

public class Produto_DAO {
	
	private Connection connection;
	
	public Produto_DAO(){
		this.connection = new Fabrica_Conexao().getConnection();
	}
	
	public void adiciona(Produtos produtos){
		
	 String sql = "insert into produtos(id_produto, id_categoria, nome, descricao, peso, qtd_estoque, prod_ativo, preco, " +
				"imagem_produto) values (?,?,?,?,?,?,?,?,?)";
	 
	 try {
		
		 PreparedStatement stmt = connection.prepareStatement(sql);
		 
		 stmt.setLong(1, produtos.getId_prod());
		 stmt.setLong(2, produtos.getId_categoria());
		 stmt.setString(3, produtos.getNome());
		 stmt.setString(4, produtos.getDescricao());
		 stmt.setFloat(5, produtos.getPeso());
		 stmt.setInt(6, produtos.getQt_estoque());
		 stmt.setString(7, produtos.getProd_ativo());
		 stmt.setFloat(8, produtos.getPreco());
		 stmt.setString(9, produtos.getImagem_prod());
		 
		 stmt.execute();
		 stmt.close();
		
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public List<Produtos> getLista(){
		
		try{
			List<Produtos> lista_prod = new ArrayList<Produtos>();
			PreparedStatement stmt = this.connection.prepareStatement("Select produtos.id_produto, produtos.id_categoria, produtos.nome," +
					"produtos.peso, produtos.qtd_estoque,produtos.prod_ativo, produtos.preco, produtos.imagem_produto, categorias.nome_categoria" +
					"from produtos inner join categorias on produtos.id_produto = categorias.id_categoria");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				Produtos produtos = new Produtos();
				Categorias categorias = new Categorias();
				produtos.setId_prod(rs.getLong("id_produto"));
				produtos.setId_categoria(rs.getLong("id_categoria"));
				produtos.setNome(rs.getString("nome"));
				produtos.setPeso(rs.getFloat("peso"));
				produtos.setQt_estoque(rs.getInt("qtd_estoque"));
                produtos.setProd_ativo(rs.getString("prod_ativo"));
                produtos.setPreco(rs.getFloat("preco"));
                produtos.setImagem_prod(rs.getString("imagem_produto"));
                categorias.setCategoria(rs.getString("nome_categoria"));
                
                lista_prod.add(produtos);	
			}	
			rs.close();
			stmt.close();		
			return lista_prod;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
   }

}
Hebert_Coelho

E qual o problema que você está tendo? Alguma mensagem de erro?

alexandre.marques

[b]Agora foi, o problema era no sql mesmo, quando eu chamava a pagina para exibir os podutos cadastrados ela não trazia os valores

Só para eu entender, caso eu queira mostrar na pagina o resultado de uma consulta que envolve varias tabelas, eu monto o SQL com o inner join e formato o resultado com JSTL independente da ordem que o resultado (SQL gerado) estiver, Correto? Minha dúvida é a seguinte:

eu tenho 3 tabelas

produtos
categorias
clientes

baseado no código abaixo, é correto eu fazer dessa forma? Lembrando que essa parte não foi implementada ainda.[/b]

<table width="100%" border="1" cellpadding="0" cellspacing="0">     
    <jsp:useBean id="dao_prod" class = "Controle.Produto_DAO" />   
      <tr bgcolor="#eeeeee" class="menuadm">     
      <td width="8%" height="30">Cliente</td>     
      <td width="35%" height="30">Produto</td>     
      <td width="8%" height="30">Qtd</td>     
      <td width="5%" height="30">preço</td>     
      <td width="13%" height="30">Categoria</td>     
    </tr>     
      <tr>     
      <c:forEach var = "produtos" items = "${dao_prod.lista}">     
        <td width="8%">${produtos.cliente}</td>     
        <td width="35%" height="25%">${produtos.nome_produto}</td>     
        <td width="8%">${produtos.qt_produto}</td>     
        <td width="5%">${produtos.preco_prod}</td>     
        <td width="13%">${produtos.nome_categoria}</td>     
      </c:forEach>     
    </tr>     
    <tr>     
    <td><a href="index.html">Voltar</a></td>     
    </tr>     
    </table>
alexandre.marques

jakefrog:
Como você está trazendo essa informação? Você está utilizando JPA? Hibernate? JDBC?

Se for JDBC só fazer como o andre.froes falou.

Hebert_Coelho

Acho que seu problema aí esta em orientação objeto.

você deveria ter algo do tipo:

Categoria categoria = // algum valor do DB... produto.setCategoria(categoria);
E na JSP

${produto.categoria.nome}
alexandre.marques

[b]Acho que agora você matou minha dúvida amigão, seria + ou _ isso?

Após o resultado do SQL [/b]

while(rs.next()){  
 
                Produtos produtos = new Produtos();   
                Categorias categorias = new Categorias();
                Clientes cliente = new clientes();

                cliente .setNome(rs.getString("nome"));   
                produtos.setNome_prod(rs.getString("nome_prod"));      
                produtos.setQt_estoque(rs.getInt("qtd_estoque"));    
                produtos.setPreco(rs.getFloat("preco"));    
                categorias.setCategoria(rs.getString("nome_categoria")); 
               
               lista_prod.add(produtos);     
            }     
               rs.close();   
               stmt.close();         
               return lista_prod;   
        }catch(SQLException e){   
            throw new RuntimeException(e);   
        }

Em seguida no JSP

<table width="100%" border="1" cellpadding="0" cellspacing="0">       
    <jsp:useBean id="dao_prod" class = "Controle.Produto_DAO" />     
      <tr bgcolor="#eeeeee" class="menuadm">       
      <td width="8%" height="30">Cliente</td>       
      <td width="35%" height="30">Produto</td>       
      <td width="8%" height="30">Qtd</td>       
      <td width="5%" height="30">preço</td>       
      <td width="13%" height="30">Categoria</td>       
    </tr>       
      <tr>       
      <c:forEach var = "produtos" items = "${dao_prod.lista}">       
        <td width="8%">${produtos.cliente}</td>       
        <td width="35%" height="25%">${produtos.nome_produto}</td>       
        <td width="8%">${produtos.qt_produto}</td>       
        <td width="5%">${produtos.preco_prod}</td>       
        <td width="13%">${produtos.nome_categoria}</td>       
      </c:forEach>       
    </tr>       
    <tr>       
    <td><a href="index.html">Voltar</a></td>       
    </tr>       
    </table>
Hebert_Coelho

Categorias categorias = new Categorias();
Clientes cliente = new clientes();

Esses dois caras estão atoas aí. Repare que você está fazendo cliente .setNome(rs.getLong(“nome”)); mas oq vc faz com ele depois?

W

Ae só uma dica, estuda hibernate, e depois spring, garante a segurança, qualidade, correção de entidades que estão sendo percistidas, controle das classes com a conecxão, e é muito legal a forma de utiliza-los.

alexandre.marques

O código contia erro, eu simulei uma aplicação que futuramente eu irei implementar, só que eu preciso mostrar o conteudo de 3 tabelas, o código abaixo será montado pelo INNER JOIN, como eu faria para apresentar esse resultado na tela? É isso que eu não consegui compreender ainda, entendeu? rsrsrs

while(rs.next()){     
  
        Produtos produtos = new Produtos();     
        Categorias categorias = new Categorias();   
        Clientes cliente = new clientes();   
  
        cliente .setNome(rs.getString("nome"));     
        produtos.setNome_prod(rs.getString("nome_prod"));         
        produtos.setQt_estoque(rs.getInt("qtd_estoque"));       
        produtos.setPreco(rs.getFloat("preco"));       
        categorias.setCategoria(rs.getString("nome_categoria"));   
         
       lista_prod.add(produtos);       
    }       
       rs.close();     
       stmt.close();           
       return lista_prod;     
}catch(SQLException e){     
    throw new RuntimeException(e);     
}

Mostrando no JSP

<table width="100%" border="1" cellpadding="0" cellspacing="0">         
    <jsp:useBean id="dao_prod" class = "Controle.Produto_DAO" />       
      <tr bgcolor="#eeeeee" class="menuadm">         
      <td width="8%" height="30">Cliente</td>         
      <td width="35%" height="30">Produto</td>         
      <td width="8%" height="30">Qtd</td>         
      <td width="5%" height="30">preço</td>         
      <td width="13%" height="30">Categoria</td>         
    </tr>         
      <tr>         
      <c:forEach var = "produtos" items = "${dao_prod.lista}">         
        <td width="8%">${produtos.cliente}</td>         
        <td width="35%" height="25%">${produtos.nome_produto}</td>         
        <td width="8%">${produtos.qt_produto}</td>         
        <td width="5%">${produtos.preco_prod}</td>         
        <td width="13%">${produtos.nome_categoria}</td>         
      </c:forEach>         
    </tr>         
    <tr>         
    <td><a href="index.html">Voltar</a></td>         
    </tr>         
    </table>
alexandre.marques

jakefrog:
Categorias categorias = new Categorias();
Clientes cliente = new clientes();

Esses dois caras estão atoas aí. Repare que você está fazendo cliente .setNome(rs.getLong(“nome”)); mas oq vc faz com ele depois?

O código foi com erro, pois eu simulei o que eu vou fazer futuramente, entendeu?

Eu tenho 3 javabean Clientes, Produtos e Categorias e tenho 3 tabelas com as mesmas informações, eu preciso unir as 3 tabelas no SQL (inner join), preciso montar o resultado para depois passar para o JSP.

alexandre.marques
Criado 25 de dezembro de 2011
Ultima resposta 28 de dez. de 2011
Respostas 13
Participantes 4