Ajuda com erro iReport + Java

3 respostas
Hadamanthys

Galera gostaria de saber o que tem de errado com o código, já postei outra coisa, agora quero tirar essa dúvida.

Eu tenho uma página com uma comboBox, ela trás do Banco de dados ( Data : Código : Titulo : etc. ) Eu quero pegar o Código e jogar para o request.getParameter e nisso gerar um PDF através desse código, isso é, jogando ele como parâmetro no iReport.

Alguém poderia me ajudar e verificar o que tem de errado no código ?

[color=red][size=18]
JSP
[/color] [/size]

<%@page import="java.awt.Button"%>
<%@ page import=" br.com.sein.dao.AnalysisDAO, br.com.sein.bean.PrintAnalysisBean, java.text.SimpleDateFormat, java.sql.Date " %>
<%@ page import="java.util.*, java.sql.SQLException" %>
<%@ page import="java.sql.*" %>   
<%@ page import="org.postgresql.Driver" %> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    

<!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>CETEM - Centro Tecnologico Mineral</title>
</head>
<body>
	<%    
		String url = "jdbc:postgresql://172.16.0.160:5432/sca"; //Informe a porta de conexão. Assim você garante todas as informações de conexão.  
		String username = "postgres";    
		String password = "";    
		Class.forName("org.postgresql.Driver");//Não precisa chamar o método newInstance, basta assim como coloquei.  
		Connection conn = DriverManager.getConnection( url, username, password );  
	 %>  
	<br />
	
	
	<table align="center">
	
		<tr>
		
			<td align="center"><a style="color:#FFD700"> Sistema para Controle de Análises Minerais</a></td>
			
		</tr>
	
		<tr align="center">
		
			<td><a style="color:black">Obs: No caso de TRAVAMENTO durante o processamento pressione a tecla 'SHIFT' <br />
					simultaneamente com o botão 'ATUALIZAR'</a>
                    
                
					
			</td>
		</tr>
					
	</table>
	
		<br />
		[color=red]<form action="GeraRelatorioPdf" method="post">[/color]
		<table  align="center"  style="background-color:#27408B;">
			<tr>
			<td align="center"><h4><a style="color:#FFD700">Boletins / Impressão de Boletins de Análise</a></h4>
			
			
				<input type="submit" value="Gerar Relatório" name="bottonSca"  style="font-size: 05 pt; font-family: arial" onClick="this.form.action=''"/>
			
		
		</td>
		
			</tr>
			
			<tr>
			
				<td><h5><a style="color:white;"><b>Boletins:</b> (Data de Geração, Código do Boletim, Código da SA, Sigla do Projeto e Nome do Cliente) *</a></h5>
				
			<select name="ImprimirAnalise">
			
			<%
			 	SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");   
 				//formato.format(new Date(System.currentTimeMillis()));   
					AnalysisDAO dao = new AnalysisDAO();
		
					List<PrintAnalysisBean> bean = dao.getComboBox();
					for(PrintAnalysisBean analysisBean: bean){
			
			 %>
				
					[color=red]<option value="<%=analysisBean.getCodeBulletin() %>" id="id" >[/color]
						
						<%
						
							out.print(formato.format(new Date(analysisBean.getDateGeneration().getTime())) + "  :  " + 
							analysisBean.getCodeBulletin() + "  : " +
							analysisBean.getCodeSa() + " :  " +
							analysisBean.getAcronym() + " : " + 
							analysisBean.getNameClient());
						
						
						 %>
					
					</option>
					
				<%
				
					
						}
				
				 %>
		
				</select>
				</td>
				
			
				
			</tr>
			
		</table>
		</form>
	</body>
</html>

[color=red][size=18]
Arquivo para Gerar o PDF
Isso eu peguei aqui no GUJ e tentei alterar para minha necessidade.
[/color] [/size]

package br.com.sein.relatorio;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;


public class GerarRelatorio extends HttpServlet{
		
		private final static long serialVersionUID = 1L;
		
		protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		String nomeDoRelatorio = (String)request.getAttribute("Sca-version4.jasper");
		@SuppressWarnings("rawtypes")
		List lista = (List)request.getAttribute("lista"); [color=red] Para que serve isso ? Eu peguei na net e tinha essa lista ai[/color]
		@SuppressWarnings("unchecked")
		[color=red]HashMap<String, String> parametros = (HashMap<String, String>)request.getAttribute("ImprimirAnalise");[/color]
		
		ServletContext contex = this.getServletContext();
		
		String nomeDoArquivoCopilado = contex.getRealPath(nomeDoRelatorio);
		
		File arquivo = new File(nomeDoArquivoCopilado);
		
		try{
			
			JasperReport relatorioCompilado = (JasperReport) JRLoader.loadObject(arquivo);
					  
		    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
		    
		    JasperPrint relatorioFinal = JasperFillManager.fillReport(relatorioCompilado, parametros, ds);
		    
		    response.setContentType("application/pdf;charset=UTF-8");
		    
		    //Adequado para se enviar dados binários para o browser.
		    ServletOutputStream out = response.getOutputStream();
		
		    JasperExportManager.exportReportToPdfStream(relatorioFinal,out);
		    out.flush();
		
		}catch(JRException e){
			response.setContentType("text/plain");
			PrintWriter printWriter = response.getWriter();
			e.printStackTrace(printWriter);
			throw new ServletException(e);
		}
		
		}
}

[color=red][size=18]
DAO - a única coisa que ele faz por enquanto é buscar as informações para jogar na ComboBox
[/color] [/size]

package br.com.sein.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;



import br.com.sein.bean.PrintAnalysisBean;
import br.com.sein.jdbc.ConnectionFactory;

public class AnalysisDAO {
	
	private Connection connection;
	
	/*
	 * Realiza a construção para conectar ao banco
	 */
	
	public AnalysisDAO() throws SQLException, ClassNotFoundException{
		
		this.connection = new ConnectionFactory().getConnection();
	}
	/**
	 * 
	 * Lista todas as análise e seta para seta na combo.
	 * 
	 * @return
	 */
	
	public List<PrintAnalysisBean> getComboBox(){
		
		try{
			
			StringBuffer sql = new StringBuffer();
			
			sql.append("SELECT Sa_Dba, Sa_Bol, Sa_Con, Con_Sigla, Cli_Nome FROM Sa,Contratos,Clientes ");
			sql.append("WHERE (SUBSTR(Sa_Con,1,4)='2011' OR SUBSTR(Sa_Con,1,4)='2012') AND");
			sql.append(" (SUBSTR(Sa_Con,1,8)=Con_Codigo) AND Sa_Sit=4  AND Con_Resp=Cli_Logon ");
			sql.append("ORDER BY Sa_Dba DESC,Sa_Bol;");
			
			
			
		List<PrintAnalysisBean> print = new ArrayList<PrintAnalysisBean>();
		PreparedStatement stmt = this.connection.prepareStatement(sql.toString());
		ResultSet rs = stmt.executeQuery();
		
		
		while(rs.next()){
			
			PrintAnalysisBean bean = new PrintAnalysisBean();
	
			bean.setDateGeneration(rs.getTimestamp("Sa_Dba"));
			bean.setCodeBulletin(rs.getString("sa_bol")); //Codigo do Boletin
			bean.setCodeSa(rs.getString("sa_con")); //Codigo SA
			bean.setAcronym(rs.getString("con_Sigla"));  //Sigla
			bean.setNameClient(rs.getString("cli_nome"));// nome do cliente
			
	
       
            
			print.add(bean);
			
		}
		
		rs.close();
		stmt.close();	
		
		return print;
		
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		
	}
	
	
}

3 Respostas

leonardons

Marcos,

Temos alguns pontos conceituais para acertar antes de se preocupar com o iReport.

1 - Você está utilizando um formulário html e está tentando recuperar os dados enviados em um método doGet no seu Servlet. Se no formulário você colocou o atributo METHOD como “POST” este não é o caminho. Observe:

<form action=“GeraRelatorioPdf” method=“post”>

Para isto funcionar o seu método utilizado no Servlet deve ser o doPost() e não o doGet().

2 - O seu form aponta para “GeraRelatorioPdf” e o nome do seu Servlet é “GerarRelatorio”. Você deve verificar se no seu arquivo de configuração “WEB.XML” está especificado este “apelido”.

3 - Você está utilizando o “request.getAttribute” dentro do seu doGet(). Lembre-se que o resultado da renderização de uma tela JSP nada mais é do que um HTML, então não espere receber um Atribute vindo dele. Para qualquer dado de um formulário enviado espere por request.getParameter(). O getAttribute você utilizará dentro de uma página JSP para receber objetos vindos de um SERVLET, por exemplo.

Apenas Obs. Para nomeclatura do campo html, por convenção, nome de campo HTML não deveria ser como uma classe java “ImprimirAnalise”, mas deveria ser algo como “imprimir_analise” ou com a terminação na frente como “cmb_imprimir_analise”. Isto torna clara a diferença das coisas e auxilia os desenvolvedores novos a separar o que é o que!

Tente primeiramente resolver estes três problemas iniciais.

Abraços, e boa sorte.

Hadamanthys

Fala Leo, fiz tudo que você falou e achei mais um detalhe no botão, esqueci de tirar onClick=“this.form.action=’’”, agora quando clico no botão ele gera uma pagina de erro e na URL fica assim “http://localhost:8080/ProjetoSca/GerarRelatorio”.

Mais eu aceitei tudo que você disse.

at.

leonardons

Cara, seu projeto está conceitualmente errado. Você está indo ao DAO diretamente na sua página JSP, pois estou vendo isto na construçao do combo. Trata-se de uma péssima prática!
Ali sim vc deveria estar usando o getAtribute para recuperar a lista do objeto desejado vinda do seu Servlet, e nunca acessar o seu DAO diretamente.

Vale ler um pouco sobre patterns como MVC, etc.

Outra coisa errada… o atributo id no <option>. Este atributo deve ser usado no <select> assim como o atributo “name”.
Observe o exemplo abaixo:

<option value="<%=valor_referencia_do_banco%>"><%=valor_textual_do_banco%> </option>

ou seja, se tivéssemos uma classe Carro:

<option value="<%=carro.getId%>"><%=carro.getNome%> </option>

O botão de submit também precisa ser revisto. O javascript no onClick está limando o action. Deve ser retirado!

<input type=“submit” value=“Gerar Relatório” name=“bottonSca” style=“font-size: 05 pt; font-family: arial” onClick=“this.form.action=’’”/>

Criado 15 de fevereiro de 2012
Ultima resposta 15 de fev. de 2012
Respostas 3
Participantes 2