Não consigo mostrar o relatório com ireport no Struts

7 respostas
pimentaft

Fala galera!
Estou tentando fazer meu primeiro relatório com ireport utilizando codigos do struts e do hibernate.
Eu criei dentro do ireport uma configuração de conexão em branco, e montei um relatorio simples para mostrar a lista que busquei no banco de dados.(não sei se fui mto claro, mas vamos prosseguir).
Pois bem, ao criar as classes, fiz conforme os codigos abaixo:

import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServlet;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;

public class RelProduto extends HttpServlet{
	public byte[] exibirRelatorio(List list) {
		// Caminho do .jasper
		String Relatorio = "Relatorio_Produto.jasper";
		
		// O datasource
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
		  
		byte[] bytes = null;	
		try {
		 	//ServletContext context =  getServletContext();
			JasperReport relatorioJasper1 = (JasperReport) JRLoader.loadObject("d:/tomcat/webapps/teste2/reports/Relatorio_produto.jasper");
			
			bytes = JasperRunManager.runReportToPdf (relatorioJasper1,new HashMap(), ds );  
			
		} catch (JRException e) {
			
			System.out.println(e.getMessage());
			
		}
		
		return bytes;
	}

}
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Session;

import br.unig.teste.dao.ProdutoDao;
import br.unig.teste.hibernate.HibernateFactory;
import br.unig.teste.modelo.Produto;
import br.unig.teste.relatorio.RelProduto;

public class ConsultaAction extends Action{
	public ActionForward execute(ActionMapping mapping,
									ActionForm form,
									HttpServletRequest req,
									HttpServletResponse res){
		
		
		Session session = new HibernateFactory().getSession();
		
		Produto produto = (Produto)form;
		List produtoEncontrado = new ProdutoDao(session).pesqNome(produto);
		req.setAttribute("PRODUTOENCONTRADO",produtoEncontrado);
		
		byte[] bytes = new RelProduto().exibirRelatorio(produtoEncontrado);
		System.out.println(bytes.length);
		//Gerando a Saída
		res.setContentType("application/pdf");
		res.setContentLength(bytes.length);  
		ServletOutputStream ouputStream;
		
		try {
			ouputStream = res.getOutputStream();
			ouputStream.write(bytes, 0, bytes.length);  
			ouputStream.flush();  
			ouputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mapping.findForward(null); 

	}

}

Acontece q qdo eu faço uma pesquisa em um jsp e dou um submit, ele abre uma janela para salvar “ConsultaAction.do”, ao inves do pdf que tentei montar para imprimir.
Se alguem puder me ajudar, agradeço!!!

7 Respostas

pimentaft

Valeu pela matéria. Eu já dei uma olhada, mas o que me deixa intrigado msm é que um amigo me passou essa maneira(a que eu postei) e conseguiu fazer relatorio.Mas ele não fez com struts.Ele fez da seguinte forma:

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;

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.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import br.unig.dao.ItemDao;

public class Relatorio extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	public byte[] exibirRelatorio(Collection collection) {
		// Caminho do .jasper
		String Relatorio = "JRItem.jasper";
		
		// O datasource
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(collection);
		  
		byte[] bytes = null;	
		try {
		 	ServletContext context = getServletContext();
			JasperReport relatorioJasper1 = (JasperReport) JRLoader.loadObject( context.getRealPath(Relatorio));
			
			bytes = JasperRunManager.runReportToPdf (relatorioJasper1,new HashMap(), ds );  
			
			/*
			InputStream relatorioJasper = getClass().getResourceAsStream(Relatorio);
			JasperPrint impressao = null;
			impressao = JasperFillManager.fillReport(relatorioJasper, new HashMap(), ds); 
			JasperViewer viewer = new JasperViewer(impressao, true);
			viewer.setVisible(true);
			*/		

		} catch (JRException e) {
			
			System.out.println(e.getMessage());
			
		}
		
		return bytes;
	}
	
	@Override
	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(arg0, arg1);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse arg1) throws ServletException, IOException {
		
		// Definindo Collection
		Collection ColecaoItem = new ItemDao().findAll();
		
		//Criando o Vetor de Bytes para PDF
		byte[] bytes = exibirRelatorio( ColecaoItem);
		
		//Gerando a Saída
		arg1.setContentType("application/pdf");
		arg1.setContentLength(bytes.length);  
		ServletOutputStream ouputStream;
		
		try {
			ouputStream = arg1.getOutputStream();
			ouputStream.write(bytes, 0, bytes.length);  
			ouputStream.flush();  
			ouputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

Deve ser algum detalhe, não sei…rs

pimentaft

Consegui…realmente era detalhe…reinstalei o acrobat reader e funcionou.

Passarinho

kra vc fez com Servlet e deu certo…

Mas vc conseguiu com Struts???

Estou numa duvida de colocar Servlet no Struts 1.

Se pode deixar um exemplo agradeço desde já!

pimentaft

me manda seu e-mail que depois te mando.

Passarinho

[email removido]

R

oi ai esta meu codigo

import java.io.*;           
            import java.util.HashMap;    
            import java.util.ArrayList;      
            import java.util.List;      
            import java.util.Map;      
            //import javax.swing.JOptionPane;     
          
          
                         
          public class Dados{               
                       
                  
              //"args" é um array de String onde cada elemento é um argumento passado pela linha de comando momento na "inicialização" da execução.    
              public static void main(String[] args){               
                      
                      
                 Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                 //leitura do ficheiro, prepara-o para ser aberto    
                 BufferedReader in = new BufferedReader(new FileReader("conteudo.txt"));               
                 String str;           
                 int i = 0;           
                 //vai percorrer todo o ficheiro    
                 while((str = in.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))    
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings imprimindo o seu resultado    
                          List<String> values = new ArrayList<String>();         
                              String words[] = str.split(";");             
                              for(String word : words) {             
                                  values.add(word);     
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui     
                 //JOptionPane.showMessageDialog(null, this.word, "NÂO FOI POSSÍVEL ABRIR O SEU FICHEIRO", JOptionPane.ERROR_MESSAGE);      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");            
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 }         
             }                  
             }     
              public static void main2(String[] args){               
                      
                      
                  Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                            
                 BufferedReader in2 = new BufferedReader(new FileReader("conteudo2.txt"));               
                 String str;           
                 int i = 0;           
                 while((str = in2.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))                     
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings    
                              List<String> values = new ArrayList<String>();         
                              String words[] = str.split(" ");             
                              for(String word : words) {             
                                  values.add(word);    
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in2.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");    
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 
                  }       
          
              }    
          }    
      }

e tenho por exemplo este ficheiro

961234567 253883377 24:05:2011 10:30:10 068 16 13    
       963456789 253883355 28:05:2011 12:15:17 088 12 09    
       963456789 253883377 29:05:2011 17:00:00 120 14 11    
       969876666 253883377 30:05:2011 10:05:34 070 11 09    
       961234567 253883377 31:05:2011 22:30:05 066 14 11    
       961234567 253883377 02:06:2011 14:19:41 076 15 13    
       963456789 253883377 05:06:2011 11:33:34 085 07 06

e queria que fosse pedido ao utilizador que dados e que ele quer imprimir. por exemplo...pedirmos para imprimir todos os dados com o numero 961234567

abraços

Kamikaze

De uma lida nesse artigo e veja se te ajuda:

parte 1
http://www.devmedia.com.br/articles/viewcomp.asp?comp=3163

parte 2
http://www.devmedia.com.br/articles/viewcomp.asp?comp=3226

att

Criado 20 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 7
Participantes 4