Erro ao mostrar os dados com JSTL[RESOLVIDO]

6 respostas
harlequinn

Boa noite galera!
Gostaria de saber, porque não estou conseguindo imprimir os dados do banco com o jstl.
Segue o código.

public List<HistoricoProduto> pesquisaEntrada(long codProduto) {
		List<HistoricoProduto> lista = new ArrayList<HistoricoProduto>();
		try {
			PreparedStatement stmt = con
					.prepareStatement("select t1.cod_produto,t1.num_fornecedor,t1.num_funcionario,t1.dta_cadastro,"
							+ "t1.valor,t1.quantidade_entrada,t2.nom_produto,t3.nom_fornecedor,t4.nom_funcionario from entrada_produto t1,produto "
							+ "t2,fornecedor t3,funcionario t4 where t1.cod_produto=t2.cod_produto and t1.num_fornecedor=t3.num_fornecedor "
							+ "and t1.num_funcionario=t4.num_funcionario and t1.cod_produto = ?");

			stmt.setLong(1, codProduto);
			stmt.executeQuery();
			ResultSet rs = stmt.getResultSet();

			while(rs.next()) {
				
				HistoricoProduto historicoProduto = new HistoricoProduto();
				
				historicoProduto.setCodProduto(rs.getLong("cod_produto"));
				historicoProduto.setNumFornecedor(rs.getInt("num_fornecedor"));
				historicoProduto.setNumFuncionario(rs.getInt("num_funcionario"));
				historicoProduto.setDataEntrada(rs.getDate("dta_cadastro"));
				historicoProduto.setValor(rs.getDouble("valor"));
				historicoProduto.setQuantidade(rs.getInt("quantidade_entrada"));
				historicoProduto.setNomProduto(rs.getString("nom_produto"));
				historicoProduto.setNomFornecedor(rs.getString("nom_fornecedor"));
				historicoProduto.setNomFuncionario(rs.getString("nom_funcionario"));
						
			} 
			rs.close();
			stmt.close();
			
			return lista;
			
		} catch (SQLException e) {

			throw new RuntimeException(e);

		}

	}
<%@ 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>
<script language="JavaScript" type="text/javascript">
	function mascaraData(campoData) {
		var data = campoData.value;
		if (data.length == 2) {
			data = data + '/';
			document.forms[0].data.value = data;
			return true;
		}
		if (data.length == 5) {
			data = data + '/';
			document.forms[0].data.value = data;
			return true;
		}
	}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="layout2.css">
<title>Resultado Histórico Produto</title>
</head>
<body>
<jsp:useBean id="entradaProdutoDAO" class="DB.EntradaProdutoDAO"/>
<form action="entradaProduto" id="form1" name="form1" method="post">
<fieldset><legend>Resultado Histórico Produto</legend> <br>
<br>
<c:forEach var="listaResultato" items="${entradaProdutoDAO.pesquisaEntrada}">
<table width="100%" cellpadding="5" cellspacing="2">
		<tr>
			<td><label>Código Produto:</label></td>
			<td><input type="text" maxlength="50" name="codigoProduto"
				size="8" value="${listaResultato.codProduto}" />
		</tr>
		<tr>
			<td><label>Nome Produto:</label></td>
			<td><input type="text" maxlength="60" name="nomeProduto"
				size="50" value="${listaResultato.nomProduto}" /></td>

		</tr>
		<tr>
			<td><label>Número Funcionário:</label></td>
			<td><input name="numFuncionario" type="text" maxlength="4"
				size="10" value="${listaResultato.numFuncionario}" /></td>
		</tr>
		<tr>
			<td><label>Nome Funcionário:</label></td>
			<td><input name="nome" type="text" maxlength="70" size="56"
				value="${listaResultato.nomFuncionario}" /></td>
		</tr>
		<tr>
			<td><label>Número do Fornecedor:</label></td>
			<td><input type="text" maxlength="8" name="numFornecedor"
				size="20" value="${listaResultato.numFornecedor" />
		</tr>
		<tr>
			<td><label>Nome do Fornecedor:</label></td>
			<td><input type="text" maxlength="70" name="nomeFornecedor"
				size="50" value="${listaResultato.nomFornecedor}" /></td>
		</tr>
</table>
<table width="100%" cellpadding="5" cellspacing="2">
	<tr>
		<td><label>Data Cadastro:</label></td>
		<td><input type="text" name="data" onkeyup="mascaraData(this);"
			maxlength="10" size="10" value="${listaResultato.dataEntrada}" /></td>
		<td><label>Valor:</label></td>
		<td><input type="text" name="valor" maxlength="5" size="10"
			value="${listaResultato.valor}"></td>
		<td><label>Quantidade:</label></td>
		<td><input type="text" maxlength="4" name="quantidadeUnidade"
			size="10" value="${listaResultato.quantidade}" /></td>
	</tr>
</table>
</c:forEach>
</fieldset>
</form>
</body>
</html>

Então, o funcionamento é simples, vou ter uma página que irei colocar o código do produto, e depois enviarei esse código para o banco e ele me retornará uma lista e esta lista, eu quero imprimir, entretanto, quando eu tento imprimir aparece o seguinte erro...

exception 

org.apache.jasper.JasperException: An exception occurred processing JSP page /ResultadoHistoricoProduto.jsp at line 32

29: <form action="entradaProduto" id="form1" name="form1" method="post">
30: <fieldset><legend>Resultado Histórico Produto</legend> <br>
31: <br>
32: <c:forEach var="listaResultato" items="${entradaProdutoDAO.pesquisaEntrada}">
33: <table width="100%" cellpadding="5" cellspacing="2">
34: 		<tr>
35: 			<td><label>Código Produto:</label></td>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:363)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:306)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)


root cause 

org.apache.jasper.el.JspPropertyNotFoundException: /ResultadoHistoricoProduto.jsp(32,0) '${entradaProdutoDAO.pesquisaEntrada}' Property 'pesquisaEntrada' not found on type DB.EntradaProdutoDAO
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:109)
	org.apache.jsp.ResultadoHistoricoProduto_jsp._jspx_meth_c_005fforEach_005f0(ResultadoHistoricoProduto_jsp.java:123)
	org.apache.jsp.ResultadoHistoricoProduto_jsp._jspService(ResultadoHistoricoProduto_jsp.java:93)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:363)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:306)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Bom, pelo o que eu entendi, não está sendo encontrada o método "pesquisaEntrada", mas como vocês podem ver...ele existe. =]
Alguém consegue me explicar o erro?
Abraço.

6 Respostas

wbdsjunior

resumidamente, quando você faz items="${entradaProdutoDAO.pesquisaEntrada}", o JSTL procura pelo método de acesso (get) do atributo pesquisaEntrada da classe EntradaProdutoDAO, ou seja, EntradaProdutoDAO.getPesquisaEntrada().

altere o nome do método para getPesquisaEntrada().

entendeu?

o método também recebe um parâmetro, pesquisaEntrada(long codProduto), mas essa vou deixar para você pesquisar.

harlequinn

Opa! Obrigado por responder, entretanto, havia feito isso, e deu o mesmo erro.
Bom, tentei mudar e ficou assim...

Primeiro a minha servlet...

package Servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Classes.EntradaProduto;
import Classes.Produto;
import DB.EntradaProdutoDAO;
import DB.ProdutoDAO;

public class HistoricoProdutoServlet extends HttpServlet{
	
	Produto produto = new Produto();
	ProdutoDAO produtoDAO = new ProdutoDAO();
	EntradaProdutoDAO entradaProdutoDAO = new EntradaProdutoDAO();
	EntradaProduto entradaProduto =new EntradaProduto();
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String codProduto = request.getParameter("codigoProduto");
		String nomProduto = request.getParameter("nomeProduto");
		String botao = request.getParameter("botao");
		String tipoPesquisa = request.getParameter("tipoPesquisa");
	
		if(botao.equals("Histórico")){

			response.sendRedirect("ResultadoHistoricoProduto.jsp");
			
		}else if(botao.equals("Pesquisar")){
			
			if(tipoPesquisa.equals("cod")){
				
				Produto resultadoPesquisaProduto = produtoDAO.pesquisarProduto(Long.parseLong(codProduto));
				
				if(resultadoPesquisaProduto!=null){
					
					request.setAttribute("codigoProduto", resultadoPesquisaProduto.getCodProduto());
					request.setAttribute("nomeProduto", resultadoPesquisaProduto.getNomeProduto());
					
					RequestDispatcher rd = request.getRequestDispatcher("/HistoricoProduto.jsp");
					rd.forward(request,response);
					
				}else{
					
					request.setAttribute("mensagem", "O número do produto informado não consta no banco de dados.");
					request.setAttribute("botao", "Voltar Histórico");
					
					RequestDispatcher rd = request.getRequestDispatcher("/Resposta.jsp");
					rd.forward(request,response);
					
				}
				
			}else if(tipoPesquisa.equals("nom")){
				
				Produto resultadoPesquisaProduto = produtoDAO.pesquisarNomeProduto(nomProduto);
				
				if(resultadoPesquisaProduto!=null){
					
					request.setAttribute("codigoProduto", resultadoPesquisaProduto.getCodProduto());
					request.setAttribute("nomeProduto", resultadoPesquisaProduto.getNomeProduto());
					
					RequestDispatcher rd = request.getRequestDispatcher("/HistoricoProduto.jsp");
					rd.forward(request,response);
					
				}else{
					
					request.setAttribute("mensagem", "O nome do produto informado não consta no banco de dados.");
					request.setAttribute("botao", "Voltar Histórico");
					
					RequestDispatcher rd = request.getRequestDispatcher("/Resposta.jsp");
					rd.forward(request,response);
					
				}
				
			}
			
		}
		
	}
	
}

o trecho do banco com o "get"

public List<HistoricoProduto> getPesquisaEntrada(long codProduto) {
		List<HistoricoProduto> lista = new ArrayList<HistoricoProduto>();
		try {
			PreparedStatement stmt = con
					.prepareStatement("select t1.cod_produto,t1.num_fornecedor,t1.num_funcionario,t1.dta_cadastro,"
							+ "t1.valor,t1.quantidade_entrada,t2.nom_produto,t3.nom_fornecedor,t4.nom_funcionario from entrada_produto t1,produto "
							+ "t2,fornecedor t3,funcionario t4 where t1.cod_produto=t2.cod_produto and t1.num_fornecedor=t3.num_fornecedor "
							+ "and t1.num_funcionario=t4.num_funcionario and t1.cod_produto = ?");

			stmt.setLong(1, codProduto);
			stmt.executeQuery();
			ResultSet rs = stmt.getResultSet();

			while(rs.next()) {
				
				HistoricoProduto historicoProduto = new HistoricoProduto();
				
				historicoProduto.setCodProduto(rs.getLong("cod_produto"));
				historicoProduto.setNumFornecedor(rs.getInt("num_fornecedor"));
				historicoProduto.setNumFuncionario(rs.getInt("num_funcionario"));
				historicoProduto.setDataEntrada(rs.getDate("dta_cadastro"));
				historicoProduto.setValor(rs.getDouble("valor"));
				historicoProduto.setQuantidade(rs.getInt("quantidade_entrada"));
				historicoProduto.setNomProduto(rs.getString("nom_produto"));
				historicoProduto.setNomFornecedor(rs.getString("nom_fornecedor"));
				historicoProduto.setNomFuncionario(rs.getString("nom_funcionario"));
						
			} 
			rs.close();
			stmt.close();
			
			return lista;
			
		} catch (SQLException e) {

			throw new RuntimeException(e);

		}

	}

e por último a minha jstl.

<%@ 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>
<script language="JavaScript" type="text/javascript">
	function mascaraData(campoData) {
		var data = campoData.value;
		if (data.length == 2) {
			data = data + '/';
			document.forms[0].data.value = data;
			return true;
		}
		if (data.length == 5) {
			data = data + '/';
			document.forms[0].data.value = data;
			return true;
		}
	}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<LINK REL="STYLESHEET" TYPE="TEXT/CSS" HREF="layout2.css">
<title>Resultado Histórico Produto</title>
</head>
<body>
<jsp:useBean id="entradaProdutoDAO" class="DB.EntradaProdutoDAO"/>
<jsp:useBean id="produto" class="Classes.Produto"/>
<form action="entradaProduto" id="form1" name="form1" method="post">
<fieldset><legend>Resultado Histórico Produto</legend> <br>
<br>
<c:forEach var="listaResultato" items="${entradaProdutoDAO.pesquisaEntrada(produto.codProduto)}">
<table width="100%" cellpadding="5" cellspacing="2">
		<tr>
			<td><label>Código Produto:</label></td>
			<td><input type="text" maxlength="50" name="codigoProduto"
				size="8" value="${listaResultato.codProduto}" />
		</tr>
		<tr>
			<td><label>Nome Produto:</label></td>
			<td><input type="text" maxlength="60" name="nomeProduto"
				size="50" value="${listaResultato.nomProduto}" /></td>

		</tr>
		<tr>
			<td><label>Número Funcionário:</label></td>
			<td><input name="numFuncionario" type="text" maxlength="4"
				size="10" value="${listaResultato.numFuncionario}" /></td>
		</tr>
		<tr>
			<td><label>Nome Funcionário:</label></td>
			<td><input name="nome" type="text" maxlength="70" size="56"
				value="${listaResultato.nomFuncionario}" /></td>
		</tr>
		<tr>
			<td><label>Número do Fornecedor:</label></td>
			<td><input type="text" maxlength="8" name="numFornecedor"
				size="20" value="${listaResultato.numFornecedor" />
		</tr>
		<tr>
			<td><label>Nome do Fornecedor:</label></td>
			<td><input type="text" maxlength="70" name="nomeFornecedor"
				size="50" value="${listaResultato.nomFornecedor}" /></td>
		</tr>
</table>
<table width="100%" cellpadding="5" cellspacing="2">
	<tr>
		<td><label>Data Cadastro:</label></td>
		<td><input type="text" name="data" onkeyup="mascaraData(this);"
			maxlength="10" size="10" value="${listaResultato.dataEntrada}" /></td>
		<td><label>Valor:</label></td>
		<td><input type="text" name="valor" maxlength="5" size="10"
			value="${listaResultato.valor}"></td>
		<td><label>Quantidade:</label></td>
		<td><input type="text" maxlength="4" name="quantidadeUnidade"
			size="10" value="${listaResultato.quantidade}" /></td>
	</tr>
</table>
</c:forEach>
</fieldset>
</form>
</body>
</html>

Então, o que eu quis fazer, era mandar o "codigo do produto" para a beans e depois capturar o valor direto na jstl(havia feito de outra forma, porém, não deu certo).
O valor capturado é o parâmetro que o "getPesquisaEntrada" necessita.
Entretanto, não se dessa forma é possível. É?
Aonde eu ando pecando?
Abraço.

wbdsjunior

acho que você não pesquisou o que eu disse para você pesquisar.

http://java.itags.org/java-web-tier-apis/6096

harlequinn

Opa, foi mal, é que acabei me enrrolando.
Entretanto, consegui resolver o meu problema aqui…Bom, pelo menos uma parte dele. =]

Agora surgiu outro…Veja só.

Eu queria imprimir o histórico de “entrada produto” e consegui dessa forma…

<body>
<form action="entradaProduto" id="form1" name="form1" method="post">
<fieldset><legend>Resultado Histórico Produto</legend> <br>
<br>
<h3>Histórico Entrada Produto</h3>
<table width="100%" cellpadding="5" cellspacing="2">
	<c:forEach var="listaResultadoEntrada" items="${listaHistoricoEntrada}">
		<tr><td><label>-------------------</label></td></tr>
		<tr>
			<td><label>Código Produto:</label></td>
			<td>${listaResultadoEntrada.codProduto}</td>
			<td><label>Nome Produto:</label></td>
			<td>${listaResultadoEntrada.nomProduto}</td>

		</tr>
		<tr>
			<td><label>Número Funcionário:</label></td>
			<td>${listaResultadoEntrada.numFuncionario}</td>
			<td><label>Nome Funcionário:</label></td>
			<td>${listaResultadoEntrada.nomFuncionario}</td>
		</tr>	
		 <tr>
			<td><label>Número do Fornecedor:</label></td>
			<td>${listaResultadoEntrada.numFornecedor}</td>
			<td><label>Nome do Fornecedor:</label></td>
			<td>${listaResultadoEntrada.nomFornecedor}</td>
		</tr>
		<tr>
			<td><label>Data Cadastro:</label></td>
			<td>${listaResultadoEntrada.dataEntrada}</td>
			<td><label>Valor:</label></td>
			<td>${listaResultadoEntrada.valor}</td>
			<td><label>Quantidade:</label></td>
			<td>${listaResultadoEntrada.quantidade}</td>
		</tr>	
	</c:forEach>
</table>
<h3>Histórico Saída Produto</h3>
<table width="100%" cellpadding="5" cellspacing="2">
	<c:forEach var="listaResultadoSaida" items="${listaHistoricoSaida}">
		<tr><td><label>-------------------</label></td></tr>
		<tr>
			<td><label>Código Produto:</label></td>
			<td>${listaResultadoSaida.codProduto}</td>
			<td><label>Nome Produto:</label></td>
			<td>${listaResultadoSaida.nomProduto}</td>
		</tr>
		<tr>
			<td><label>Número Funcionário:</label></td>
			<td>${listaResultadoSaida.numFuncionario}</td>
			<td><label>Nome Funcionário:</label></td>
			<td>${listaResultatoSaida.nomFuncionario}</td>
		</tr>
		<tr>
			<td><label>Data Saida:</label></td>
			<td>${listaResultadoSaida.dataSaida}</td>
			<td><label>Quantidade Saida:</label></td>
			<td>${listaResultadoSaida.quantidadeSaida}</td>
		</tr>	
	</c:forEach>
</table>
</fieldset>
</form>
</body>

Minha servlet “HistóricoProduto”

ProdutoDAO produtoDAO = new ProdutoDAO();
			EntradaProdutoDAO entradaProdutoDAO = new EntradaProdutoDAO();
			
			request.setAttribute("listaHistoricoEntrada", entradaProdutoDAO.getPesquisaEntrada(new Long(codProduto)));
			request.setAttribute("listaHistoricoSaida", saidaProdutoDAO.getPesquisaSaida(new Long(codProduto)));
			
			RequestDispatcher rd = request.getRequestDispatcher("ResultadoHistoricoProduto.jsp");
			rd.forward(request,response);
			
			produtoDAO.fecharConexao();
			entradaProdutoDAO.fecharConexao();

Então, deu certinho para imprimir, mas, agora eu preciso imprimir o resto do histórico, que seria a saída do produto, e fiz o mesmo que fiz em entrada.
Porém, fui infeliz dessa vez, pois ele não me retornou o “nomFuncionario”,“dataSaida” e “quantidadeSaida”.
Olhei o código aqui, porém, ainda não descobri o erro, o que em teoria, esse for seria idêntico ao anterior.

Segue o trecho da classe DAO.

public List<HistoricoProduto> getPesquisaSaida(long codProduto) {
		List<HistoricoProduto> lista = new ArrayList<HistoricoProduto>();
		try {
			PreparedStatement stmt = con.prepareStatement("select t1.cod_produto, t1.num_funcionario, t1.data_saida, t1.quantidade_saida, "+
					"t2.nom_produto, t3.nom_funcionario from saida_produto t1, produto t2, funcionario t3 where t1.cod_produto=t2.cod_produto and "+
					"t1.num_funcionario=t3.num_funcionario and t1.cod_produto = ?");

			stmt.setLong(1, codProduto);
			stmt.executeQuery();
			ResultSet rs = stmt.getResultSet();

			while(rs.next()) {
				
				HistoricoProduto historicoProduto1 = new HistoricoProduto();
				
				historicoProduto1.setCodProduto(rs.getLong("cod_produto"));
				historicoProduto1.setNumFuncionario(rs.getInt("num_funcionario"));
				historicoProduto1.setDataEntrada(conversao.getDateUser(String.valueOf(rs.getDate("data_saida"))));
				historicoProduto1.setQuantidade(rs.getInt("quantidade_saida"));
				historicoProduto1.setNomProduto(rs.getString("nom_produto"));
				historicoProduto1.setNomFuncionario(rs.getString("nom_funcionario"));
					
				lista.add(historicoProduto1);
				
				System.out.println(historicoProduto1.getDataEntrada());
				System.out.println(historicoProduto1.getQuantidade());
			} 
			rs.close();
			stmt.close();
			
			return lista;
			
		} catch (SQLException e) {

			throw new RuntimeException(e);

		}

	}

Valeu. =]

wbdsjunior

você vê alguma mensagem de erro?

onde você declarou a instância de saidaProdutoDAO?
ProdutoDAO produtoDAO = new ProdutoDAO();  
EntradaProdutoDAO entradaProdutoDAO = new EntradaProdutoDAO();  

request.setAttribute("listaHistoricoEntrada", entradaProdutoDAO.getPesquisaEntrada(new Long(codProduto)));  
request.setAttribute("listaHistoricoSaida", saidaProdutoDAO.getPesquisaSaida(new Long(codProduto))); // esta linha aqui

RequestDispatcher rd = request.getRequestDispatcher("ResultadoHistoricoProduto.jsp");  
rd.forward(request,response);  

produtoDAO.fecharConexao();  
entradaProdutoDAO.fecharConexao();
harlequinn

Opa, valeu meu camarada!
Havia resolvido o problema, mas estava meio enrrolado e não deu para agradecer pela atenção antes! =]
Eu havia instanciado a classe na linha de cima, entretando, por falha minha não postei a linha.
Bom, resumindo, o erro estava na minha DAO quando eu enviava o resultado da minha classe DAO para a classe beans.
Estava enviando para o atributo errado. :roll:
Vou dar uma lida no tutorial que me passou.
Um grande abraço e mais uma vez obrigado.
Até.

Criado 6 de dezembro de 2010
Ultima resposta 10 de dez. de 2010
Respostas 6
Participantes 2