Abrir PDF no Browse

41 respostas
F

Olá Pessoal!
Estou gerando relatórios no formato PDF com o IReport´s, isso conforme dicas e tutoriais encontrados neste fórum. Ontem peguei algumas dicas de como abrir o PDF direto no Browse, mas está apresentando erros e não consegui sacar o motivo.

O form abaixo aprensenta dois COMBOBOX e um botão GERAR Relatório.

cargahorariasem_rel.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" import="bean.*,dao.*,java.util.*" errorPage="erro.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Relação Carga Horária</title>
</head>
<body>
<div id="paginaCargaHorariaSem_Rel">

</div>

<p class="txtTitulo"> 
	Comparação Carga Horária Semestre<hr color="#000080"> 
</p>                      
    
<Script>
function carregaPagina(paramRegistro){
	if(window.ActiveXObject) //IE
		req = new ActiveXObject("Microsoft.XMLHTTP");
	else if (window.XMLHttpRequest) // não IE
		req = new XMLHttpRequest();
	if(paramRegistro==null){
		req.open("GET","cargahorariasem_rel.jsp",false);
		req.send(null);
	} else {
		req.open("POST","cargahorariasem_rel_emissor.jsp",false);
		req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		req.send(paramRegistro);
		
	}
	req.onreadystatechange = function()	{
		if(req.readyState==4){
            
			var retorno = req.responseText;

			var pagina = document.getElementById("paginaCargaHorariaSem_Rel");
			pagina.innerHTML = retorno;
            alert(retorno);
			//carrega novamente a listagem de carga horaria, caso o retorno esteja vazio
			if(retorno.trim() == ""){	
			  document.formCargaHorariaSem_Rel.gerar.focus();
			}
		}
			
	}
}
function gerarRelatorio(opcao){
		if (validarFormulario()){
	 	   semestreAtualId = document.formCargaHorariaSem_Rel.semestreAtualId.value;
		   indexAtualId = document.getElementById("semestreAtualId").selectedIndex;	 	   
	 	   semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;	 	   	 	   
	 	   semestreAntId = document.formCargaHorariaSem_Rel.semestreAntId.value;	 	   
		   indexAntId = document.getElementById("semestreAntId").selectedIndex;	 	   	 	   
	 	   semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;	 	   
    	   param = "semestreAtualId="+semestreAtualId;
		   param+= "&semestreAtualDescricao="+semestreAtualDescricao;    	   
		   param+= "&semestreAntId="+semestreAntId;
		   param+= "&semestreAntDescricao="+semestreAntDescricao;    	   		   
		   param+= "&opcao="+opcao;
		   carregaPagina(param);
		}
	}
	
function validarFormulario(){
	if(document.formCargaHorariaSem_Rel.semestreAtualId.value==document.formCargaHorariaSem_Rel.semestreAntId.value){
	   alert("Selecione Semestres diferentes");
	   document.formCargaHorariaSem_Rel.semestreAtualId.focus();
	   return false;
	}
	return true;
}


</Script>
<%
//Para o IE nao fazer cache do <div> ao usar AJAX
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

SemestreDao semestreDao = new SemestreDao();	    
List listaSemestre = semestreDao.getListaSemestres();

%>

<form method="post" name="formCargaHorariaSem_Rel" id="formCargaHorariaSem_Rel">
	<table width="100%" border="0" cellpadding="0" cellspacing="0">
	
		<tr>
		<td class="txtDestaque">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selecione: Semestre Atual:&nbsp;&nbsp;
	         <select name="semestreAtualId" class="forms">
				<%
				   Iterator iteratorSemAtual = listaSemestre.iterator();
				   while (iteratorSemAtual.hasNext()) {
						Semestre semestre = (Semestre)iteratorSemAtual.next();
						out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>"); 							
				   }
        		%>
	        	</select>
	        </td>
		</tr>
		<tr>
			<td>&nbsp;</td>
		</tr>
		<tr>
		<td class="txtDestaque">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Semestre Anterior:&nbsp;&nbsp;
	         <select name="semestreAntId" class="forms">
				<%
				   Iterator iteratorSemAnt = listaSemestre.iterator();
				   while (iteratorSemAnt.hasNext()) {
						Semestre semestre = (Semestre)iteratorSemAnt.next();
						out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>"); 							
				   }
        		%>
	        	</select>
	        </td>
		</tr>
		<tr>
			<td>&nbsp;</td>
		</tr>	
		<tr>
			<td>&nbsp;</td>
		</tr>		
		<tr>		
			<td colspan="2">
				<input name="gerar" value="Gerar Relatório" class="forms" type="button" onClick="gerarRelatorio('pdf')">
			</td>
		</tr>
		<tr>
			<td>&nbsp;</td>
		</tr>
	
	</table>

	<hr color="#000080">

	
</form>

</body>
</html>

Ao clicar em “Gerar Relatório” é chamado o cargahorariasem_rel_emissor.jsp:

<%@page import="net.sf.jasperreports.engine.JasperFillManager"%>
<%@page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@page import="net.sf.jasperreports.engine.JasperExportManager"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" import="dao.*,impressao.*,java.util.*,net.sf.*" errorPage="erro.jsp"%>

<%
//Para o IE nao fazer cache do <div> ao usar AJAX
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
int semestreAtualId = Integer.parseInt(request.getParameter("semestreAtualId"));
String semestreAtualDescricao = request.getParameter("semestreAtualDescricao");
int semestreAntId = Integer.parseInt(request.getParameter("semestreAntId"));
String semestreAntDescricao = request.getParameter("semestreAntDescricao");
AlocacaoDao alocacaoDao = new AlocacaoDao();
List listAlocacao = null;
try {			
	listAlocacao = alocacaoDao.getListaAlocacaoesSemestre(semestreAtualId,semestreAntId);	
}catch (Exception e){ 
	e.printStackTrace();			
}
Map par = new HashMap();
par.put("parSemAtual",semestreAtualDescricao);
par.put("parSemAnt",semestreAntDescricao);
String[] camposRel = new String[]{"professor_pfr_nome", "professor_pfr_qtdHoras", "sem_atual","sem_ant"};
byte[] bytes = null;
try {  
	//carrega arquivos Jasper  
 	String pathJasper = getServletContext().getRealPath("/relatorios/") + "/";            
	HibernateQueryRS jrRS = new HibernateQueryRS(listAlocacao, camposRel);
    Map parametros = new HashMap();                
	//direciona o relatorio para um stream  
    JasperPrint impressao = JasperFillManager.fillReport(pathJasper+"relCargaHorariaSemestre.jasper", parametros, jrRS);
    bytes = JasperExportManager.exportReportToPdf(impressao);
}
catch(Exception e){    
    e.printStackTrace();  
    throw new ServletException(e);  
}  
if(bytes != null && bytes.length > 0) {  
	//envia o relatorio em pdf para o browser  
    response.setContentType("application/pdf");  
    response.setContentLength(bytes.length);  
    ServletOutputStream outputStream = response.getOutputStream();  
    outputStream.write(bytes,0,bytes.length);  
    outputStream.flush();  
    outputStream.close(); 
}  
%>

O erro apresentado:

16:19:10,859 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:599)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195)
	at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
	at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
	at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
	at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
	at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
	at org.apache.jsp.cargahorariasem_005frel_005femissor_jsp._jspService(cargahorariasem_005frel_005femissor_jsp.java:119)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Qualquer dica é bem vinda.

41 Respostas

luiscesarinfo

Ola Flavio… Trabalho com relatorio no iReport e gero os relatorio em pdf abrindo do browser. So que eu abro direto do servlet como a seguir :

package report;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import frotas.FrotasDataBean;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;

public class MediaConsumoPorVeiculo extends HttpServlet 
{
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		FrotasDataBean conexao =  new FrotasDataBean(); // Faz a conexão
		
		Object placa = request.getParameter("comboVeiculo");
		String dataInicio = request.getParameter("textDataInicio");
		String dataFim = request.getParameter("textDataFim");
		
		//Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
		String pathJasper = getServletContext().getRealPath("/relatorios/") + "/";
		
		//A variavel path armazena o caminho real para o contexto
		//isso é util pois o seu web container pode estar instalado em lugares diferentes		
		String path = getServletContext().getRealPath("/");
		
		//Parametros do relatorio
		Map parametros = new HashMap();
		parametros.put("PathRelMediaConsumoPorVeiculoSub1", pathJasper + "RelatorioMediaConsumoPorVeiculoSUB1.jasper");		
		parametros.put("PathRelMediaConsumoPorVeiculoSub2", pathJasper + "RelatorioMediaConsumoPorVeiculoSUB2.jasper");
		parametros.put("PlacaVeiculo", placa);
		parametros.put("DataInicio", dataInicio);
		parametros.put("DataFim", dataFim);	
		
		try 
		{
			//Aqui ele cria o relatório
			JasperPrint impressao = JasperFillManager.fillReport(pathJasper
					+ "RelatorioMediaConsumoPorVeiculo.jasper", parametros, conexao.con);
			
			//Grava o relatório em disco em pdf
			JasperManager.printReportToPdfFile(impressao, path
					+ "/MediaConsumoPorVeiculo.pdf");
			
			//Redireciona para o pdf gerado
			response.sendRedirect("MediaConsumoPorVeiculo.pdf");
			
			//FECHA A CONEXÃO COM O BANCO DE DADOS
			conexao.con.close();
		}		
		catch (Exception e) 
		{
			response.getWriter().println("Erro ao gerar o relatório: " + e);
		}
	}

	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException 
	{
		doPost(arg0, arg1);
	}
}

é so uma forma de fazer… os meus estão funcionando…

qquer coisa faz outro post ai

[]'s Luis Cesar

F

Olá Luis!
Como fica a chamada desse Servlet? No meu caso, o Menu chama o cargahorariasem_rel.jsp que é onde o usuário faz a seleção, quando clica em gerar o relatório, o CARGAHORARIASEM_REL.JSP chama o CARGAHORARIASEM_EMISSOR.JSP passando os parâmetros que o usuário selecionou. Desculpa a ignorãcia, é que tô penando no assunto.
Grato.

luiscesarinfo

Flavio,

no meu caso eu faço assim :

faço um JSP que pega todas as informações necessarias para gerar o relatorio. Na hora de submeter o formulario eu faço um JavaScript como o seguinte :

function consistencia()
{
    .
    .
    .
    document.relCadastroDeVeiculosForm.action = "RelMediaConsumoPorVeiculo";
    document.relCadastroDeVeiculosForm.submit();
}//fim função consistencia()

esse “RelMediaConsumoPorVeiculo” é o servlet que tem q ser configurado no web.xml

entendeu ?

olha só, no site www.furutani.eti.br, tem um tutorial com o nome “Mini-Tutorial Relatorios Java JasperReports e iReport” que te ajuda a fazer isso. Não tenho o link direto, mas se vc tiver alguma dúvida, faz outro post e não esquenta com isso… :thumbup:

[]'s Luis Cesar

F

Luis,
Você pode postar a parte do WEB.XML que trata o RelMediaConsumoPorVeiculo.java?
Conforme entendi, devo proceder da seguinte forma:

  1. Criar um relcargahorariasem_emissor.java conforme o SERVLET que você postou.
  2. Configurar relcargahorariasem_emissor.java no WEB.XML
  3. No relcargahorariasem.jsp (tela que o usuário faz a seleção dos campos) implementar a uma função conforme abaixo:
function gerarRelatorio(){

document.relcargahorariasem.jsp.action = “RelMediaConsumoPorVeiculo”;

document.relcargahorariasem.jsp.submit();

}

É isso?

Agradeço muito a sua atenção.

luiscesarinfo

Exatamente isso… o XML está abaixo :

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>FrotasAGR</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-name>MediaConsumoPorVeiculo</servlet-name>
		<servlet-class>report.MediaConsumoPorVeiculo</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>MediaConsumoPorVeiculo</servlet-name>
		<url-pattern>/RelMediaConsumoPorVeiculo</url-pattern>
	</servlet-mapping>	
</web-app>

qquer coisa dá o grito ai…

[]'s

F

Luis,
Até parece mandinga, mas o “import net.sf.jasperreports.engine.JasperManager;” no “JasperManager;” aparece um traço (linha preta) com a seguinte mensagem de erro:“The type JasperManager is deprecated”.

package rel;
import dao.*;
import net.sf.jasperreports.engine.JasperFillManager;  
import net.sf.jasperreports.engine.JasperManager; --------------------> Nesse import aparece a mensagem e mais abaixo, no código também. 
import net.sf.jasperreports.engine.JasperPrint;  
import impressao.HibernateQueryRS;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RelCargaHorariaSem extends HttpServlet 
{
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		int semestreAtualId = Integer.parseInt(request.getParameter("semestreAtualId"));
		String semestreAtualDescricao = request.getParameter("semestreAtualDescricao");
		int semestreAntId = Integer.parseInt(request.getParameter("semestreAntId"));
		String semestreAntDescricao = request.getParameter("semestreAntDescricao");
		AlocacaoDao alocacaoDao = new AlocacaoDao();
		List listAlocacao = null;
		try {			
			listAlocacao = alocacaoDao.getListaAlocacaoesSemestre(semestreAtualId,semestreAntId);	
		}catch (Exception e){ 
			e.printStackTrace();			
		}		
		//Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
		String pathJasper = getServletContext().getRealPath("/relatorios/") + "/";
		
		//A variavel path armazena o caminho real para o contexto
		//isso é util pois o seu web container pode estar instalado em lugares diferentes		
		String path = getServletContext().getRealPath("/");
		
		//Parametros do relatorio
		Map par = new HashMap();
		par.put("parSemAtual",semestreAtualDescricao);
		par.put("parSemAnt",semestreAntDescricao);
		String[] camposRel = new String[]{"professor_pfr_nome", "professor_pfr_qtdHoras", "sem_atual","sem_ant"};
		
		try 
		{
			HibernateQueryRS jrRS = new HibernateQueryRS(listAlocacao, camposRel);			
			//Aqui ele cria o relatório
			JasperPrint impressao = JasperFillManager.fillReport(pathJasper
					+ "relCargaHorariaSemestre.jasper", par, jrRS);
			
			//Grava o relatório em disco em pdf
			JasperManager.printReportToPdfFile(impressao, path+"/relCargaHorariaSemestre.pdf");     ---> AQUI ELE FICA COM UMA LINHA PRETA CORTANDO O "JasperManager.printReportToPdfFile"  COM A MENSAGEM ABAIXO:

                          " The method printReportToPdfFile(JasperPrint, String) from the type JasperManager is deprecated "


			
			//Redireciona para o pdf gerado
			response.sendRedirect("MediaConsumoPorVeiculo.pdf");
		}		
		catch (Exception e) 
		{
			response.getWriter().println("Erro ao gerar o relatório: " + e);
		}
	}

	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException 
	{
		doPost(arg0, arg1);
	}
}
luiscesarinfo

Flavio, não se preocupe com isso, esse traço não impede o funcionamento…

“The type JasperManager is deprecated” significa que essa implementação do JasperManager está “deprecado”, ou seja, já tem uma implementação nova para ele na versão nova do JAVA. Mas ao invés de tirar essa implementação a SUN informa que está deprecated e que nas proximas versões, pode ser que essa implementação seja retirada do java.

entendeu ?

qquer coisa volta a postar…

[]'s Luis Cesar

F

Luis!
Apesar do Servlet estar com aquela mensagem no “import net.sf.jasperreports.engine.JasperManager;”, consegui executar e o relatório apareceu no browse…coisa linha… Só não consegui pegar os parâmetros. Veja como ficou o meu Servlet:

package rel;
import dao.*;
import net.sf.jasperreports.engine.JasperFillManager;  
import net.sf.jasperreports.engine.*;  
import net.sf.jasperreports.engine.JasperPrint;  
import impressao.HibernateQueryRS;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RelCargaHorariaSem extends HttpServlet 
{
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		int semestreAtualId = Integer.parseInt(request.getParameter("semestreAtualId"));		
		String semestreAtualDescricao = request.getParameter("semestreAtualDescricao");
		int semestreAntId = Integer.parseInt(request.getParameter("semestreAntId"));
		String semestreAntDescricao = request.getParameter("semestreAntDescricao");
		AlocacaoDao alocacaoDao = new AlocacaoDao();
		List listAlocacao = null;
		try {			
			listAlocacao = alocacaoDao.getListaAlocacaoesSemestre(semestreAtualId,semestreAntId);	
		}catch (Exception e){ 
			e.printStackTrace();			
		}		
		//Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
		String pathJasper = getServletContext().getRealPath("/relatorios/") + "/";
		
		//A variavel path armazena o caminho real para o contexto
		//isso é util pois o seu web container pode estar instalado em lugares diferentes		
		String path = getServletContext().getRealPath("/");
		
		//Parametros do relatorio
		Map par = new HashMap();
		par.put("parSemAtual",semestreAtualDescricao);
		par.put("parSemAnt",semestreAntDescricao);
		String[] camposRel = new String[]{"professor_pfr_nome", "professor_pfr_qtdHoras", "sem_atual","sem_ant"};
		
		try 
		{
			HibernateQueryRS jrRS = new HibernateQueryRS(listAlocacao, camposRel);			
			//Aqui ele cria o relatório
			JasperPrint impressao = JasperFillManager.fillReport(pathJasper
					+ "relCargaHorariaSemestre.jasper", par, jrRS);
			
			//Grava o relatório em disco em pdf			
			JasperManager.printReportToPdfFile(impressao, path+"/relCargaHorariaSemestre.pdf");
			
			//Redireciona para o pdf gerado
			response.sendRedirect("relCargaHorariaSemestre.pdf");
		}		
		catch (Exception e) 
		{
			response.getWriter().println("Erro ao gerar o relatório: " + e);
		}
	}

	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException 
	{
		doPost(arg0, arg1);
	}
}

Funcção que chama o Servlet:

function emitirRelatorio(opcao){
		if (validarFormulario()){
		   document.formCargaHorariaSem_Rel.action = "RelCargaHorariaSem";  
                   document.formCargaHorariaSem_Rel.submit();  		
		}
	}

Nesse caso, como envio os parâmetros do relatório?
Grato pela atenção.

luiscesarinfo

bom,

os parametro que vc está esperando no relatorio do iReport são parSemAtual e parSemAnt (lembrando que esse parametro tem q ter o mesmo nome no iReport e no Servlet)?

no seu codigo :

//Parametros do relatorio   
        Map par = new HashMap();   
        par.put("parSemAtual",semestreAtualDescricao);   
        par.put("parSemAnt",semestreAntDescricao);   
        String[] camposRel = new String[]{"professor_pfr_nome", "professor_pfr_qtdHoras", "sem_atual","sem_ant"};

não entendi o que é o atributo camposRel.

[]'s Luis Cesar

F

Como mencionei anteriormen, eu tinha dois JSP, um para Tela e outro para Emissão do Relatório. Como o de emissão não existe mais, pois foi substituído pelo Servlet que você postou, como eu faço para passar os parâmetros abaixo:

function gerarRelatorio(opcao){  
         if (validarFormulario()){  
            semestreAtualId = document.formCargaHorariaSem_Rel.semestreAtualId.value;  
            indexAtualId = document.getElementById("semestreAtualId").selectedIndex;          
            semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;                     
            semestreAntId = document.formCargaHorariaSem_Rel.semestreAntId.value;             
            indexAntId = document.getElementById("semestreAntId").selectedIndex;                  
            semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;           
            param = "semestreAtualId="+semestreAtualId;  
            param+= "&semestreAtualDescricao="+semestreAtualDescricao;            
            param+= "&semestreAntId="+semestreAntId;  
            param+= "&semestreAntDescricao="+semestreAntDescricao;                    
            param+= "&opcao="+opcao;  
            carregaPagina(param);  
         }  
     }

No seu exemplo você passa os seguinte parâmetros:

Object placa = request.getParameter("comboVeiculo");  
         String dataInicio = request.getParameter("textDataInicio");  
         String dataFim = request.getParameter("textDataFim");

O que não consegui captar é como enviar esses parâmetros do JSP para o Servlet.

Referente a variável “camposRel” , nela estão os campos utilizados no relatório. Estou utilizando o IReports com Hibernate e o HQL, que é o SQL do hibernate, é um pouco diferente do SQL tradicional.

luiscesarinfo

Os parametros são passados via request, exatamente como está no servlet que vc mostrou acima… tem q verificar se os nomes dos parametros estão corretos tanto no servlet quanto no iReport.

Outra coisa, verifique o conteúdo do action da tag form do seu jsp que chama o servlet.

ok ?

[]'s

F

Luis,
Você pode postar o trecho do JSP que envia os parâmetros pro Servlet? É que o relatório em questão já estava funcionando, só que o PDF não era aberto diretamente no browse, eu executava o AcrobatReader para ler o PDF e estava tudo Ok.
Grato pela atenção.

F

Luis!
Um detalhe, somente os parâmetros “semestreAtualDescricao” e “semestreAntDescricao” é que estão indo como NULL. Esses parãmetros são o “text” do Combobox os quais pego da seguinte forma:

indexAtualId = document.getElementById("semestreAtualId").selectedIndex;            
            semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;                       

            indexAntId = document.getElementById("semestreAntId").selectedIndex;                    
            semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;

Os outros dois parâmetros estão definidos como “name=‘semestreAtualId’” do ComboBox Semestre Atual e
“name=‘semestreAnt’” do ComboBox Semestre Anterior. Aí o request do Servlet localiza. Agora a descrição do SEMESTRE como posso passar pro servlet?
Grato.

luiscesarinfo

o parametro é passado via request sem maiores detalhes do jeito que eu postei acima…

um detalhe me chamou a atenção : a tag (combobox) do html não tem atributo text e sim um atributo value e é o value que é enviado no request.

<select name="comboVeiculo" class="txt">
    <option value="%" selected="selected">TODOS</option>
    <option value="KAP1234">CARRO1</option>
    <option value="KPA4321">CARRO2</option>
</select>

se a descrição do SEMESTRE estiver em uma combobox, é assim que o servlet vai achar no request, assim como qquer outra tag html, entendeu ?

qquer coisa posta ai…

Luis Cesar

F

Luis!
No meu combobox o meu value é o ID da tabela Semestre no Banco de Dados. Só que eu mostro para o Usuário a Descrição do Semestre e conforme ele seleciona eu tenho o ID. Sendo assim, no Servlet com request eu consigo pegá-lo sem problemas.
Abaixo está o Combobox:

<select name="semestreAtualId" class="forms">
				<%
				   Iterator iteratorSemAtual = listaSemestre.iterator();
				   while (iteratorSemAtual.hasNext()) {
						Semestre semestre = (Semestre)iteratorSemAtual.next();
						out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>"); 							
				   }
        		%>
</select>

Como fica depois de carregado:

<select name="semesteAtualId" class="txt">  
    <option value="0" >Todos</option>  
     <option value="1">2006/1</option>  
     <option value="2">2006/2</option>  
     <option value="3">2007/1</option>  
     <option value="4">2007/2</option>  
 </select>

Nesse caso, o Servlet pega somente o ID que está no “Value”, mas eu quero passar também a descrição que eu pego da seguinte forma:

indexAtualId = document.getElementById("semestreAtualId").selectedIndex;	 	   
   semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;

Existe alguma forma de passar também a Descricao pro Servlet?
Claro, eu poderia lá no Servlet pegar o ID e buscar no Banco, mas se tiver alguma forma de evitar isso, seria legal. Até porque podem surgir outras situações.
Grato.

luiscesarinfo

ah sim… desculpe a demora em entender o problema todo… bom, tive 2 problema parecido a um tempo atras. No primeiro eu peguei a descrição na propria consulta SQL atraves do codigo ou ID. No segundo problema fiz algo não muito elegante, mas funcional… eu peguei a descrição e mandei para um text oculto no formulario, entendeu ? ai eu fiz o request da mesma forma, mas com um atributo a mais… certo ?

Não tenho o codigo para te mostrar agora, pois foi um projeto q fiz em ksa qdo tava estudando JAVA, mas funcionou…

qquer coisa estou por ai…

Luis Cesar

F

Luis!
Meu combobox está dessa forma:

<select name="semestreAtualId" class="forms">
				<%
				   Iterator iteratorSemAtual = listaSemestre.iterator();
				   while (iteratorSemAtual.hasNext()) {
						Semestre semestre = (Semestre)iteratorSemAtual.next();
						out.print("<option value='" + semestre.getSmt_id()+"'>" + semestre.getSmt_descricao()+"</option>"); 							
				   }
        		%>
	        	</select>

No “value” eu tenho o ID da tabela Semestre. Mas quero passar a descrição a qual pego da seguinte forma:

indexAtualId = document.getElementById("semestreAtualId").selectedIndex;	 	   
   semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;

É possível passá-la se estar vinculada na TAG?
Grato.

F

Putz… desconsidera o últmo POST…
Bom, esse detalhe eu consigo pegando a Descrição no BD… Mas um assunto que ainda tá me tirando o sono é trocar NULL por Zeros no IReport… Foi um post que coloquei aqui e você deu algumas dicas. No Hibernate eu não consegui implementar o Coalesce, e como são duas colunas geradas por um SUM, ele retorna NULL quando não há valores…
Luis, muito obrigado pelas dicas… você ajudou bastante mesmo…
Um abraço e sucesso.

luiscesarinfo

Flavio, pode ser que seja possivel, mas eu nunca fiz algo parecido. Mas direto assim no request sinceramente não sei…

[]'s

luiscesarinfo

vixi… não vi seu post anterior…

bom a sintaxe do replace que eu falei no outro topico é o seginte :

replace(, “null”, “0”) onde “null” é o valor a ser substituido e o “0” é o valor substituto.
e já que o seu campo é o resultado de um SUM então vc tem que colocar no lugar de todo a expressão que deu origem ao resultado do SUM.

no mais… Estamos ai pra isso… Sucesso pra vc também…

Grande Abraço.

Luis Cesar

F

Luis,
Segue a passagem do parâmetro sem ter que estar vinculado a uma TAG:

if (validarFormulario()){
  indexAtualId = document.getElementById("semestreAtualId").selectedIndex;	 	   
   semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;	 	   	 	   		
   indexAntId = document.getElementById("semestreAntId").selectedIndex;	 	   	 	   
   semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;	 	   

   document.formCargaHorariaSem_Rel.action =     "RelCargaHorariaSem?semestreAtualDescricao="+semestreAtualDescricao+"&semestreAntDescricao="+semestreAntDescricao;   ----> Aqui passo o      parâmetro.                                        

           document.formCargaHorariaSem_Rel.submit();  		
		}

No servlet só execute os REQUEST´s e retornou os parâmetros corretos.

Testei e funcionou 100%… Não sei se é a forma mais elegante… mas funciona…rsrs
Abraço.

luiscesarinfo

putz… q vacilo… a solução tava tão clara…

vlw por postar a solução…

abraço…

F

Luis,
Só não está funcionando no FireFox, no IE e no IDE do Eclipse está funcionando. Tenho uma situação onde tenho que validar a matrícula do professor e usei o Ajax no evento ONBLUR, no FireFox não funciona também…
Até.

F

Luis,
Você abre todos os seus relatórios PDF diretamente no Browse? É que estou analisando o lado do usuário, o PDF é mostrado na mesma Janela ou Aba do browse no qual já está sistema, sendo necessário o usuário clicar no botão “Retornar página anterior” para voltar para aplicação, sem contar que pode ocorrer casos em que o usuário irá clicar no “X” da janela fechando assim o Browse e encerrando o sistema. Legal seria abrir uma Nova Aba ou Janela.

luiscesarinfo

Tranquilo… dá para fazer o relatorio abrir em outra pagina… na hora em que vc vai chamar o Servlet, usa o camando JavaScript window.opener(document.frm.action = “seuServlet”), se não me engano é isso mesmo…

Quanto ao problema do FireFox, o que acontece é o seguinte : o IE e o FireFox tem algumas “implementações” diferentes para o JavaScript. A Microsof não segue integralmente o padrão recomendado pela W3C, por isso algumas funções podem ter resultados diferente em cadas browser, entendeu…?

Mas pelo que eu li, se vc seguir os padrões de HTML e JavaScript da W3C, deveria funcionar em todos os browsers.

Se eu estiver errado, por favor me corrija.

[]'s Luis Cesar

F

Olá Luis!
Implementei a chamada: window.open(document.formCargaHorariaSem_Rel.action = “RelCargaHorariaSem”);
para abrir em outra janela. Mas dá o erro HTTP Status 500 e na sequência ele abre o PDF na mesma janela.
Alguma dica?
Grato.

luiscesarinfo

tente implementar essa função JavaScript :

function consultar(name, url, left,top,width,height,toolbar,menubar,statusbar,scrollbar,resizable)
{
    toolbar_str    	= toolbar 	? 'yes' : 'no';
    menubar_str 	= menubar ? 'yes' : 'no';
    statusbar_str 	= statusbar ? 'yes' : 'no';
    scrollbar_str 	= scrollbar ? 'yes' : 'no';
    resizable_str 	= resizable ? 'yes' : 'no';
    window.open(url , name , 'left='+left+',top='+top+',width='+width+',height='+height+',toolbar='+toolbar_str+', location=0, menubar='+menubar_str+',status='+statusbar_str+',scrollbars='+scrollbar_str+',resizable='+resizable_str);
}//fim função consultar()

acho q deve funcionar…

[]'s Luis Cesar

luiscesarinfo

ops… esqueci de postar a chamada da função…

consultar('TITULO','http://C-137:8080/FrotasAGR/RelMediaConsumoVeiculo',200,100,400,330,0,0,0,0,0)

a ultima sequencia de parametro, define o tamanha da janela que irá abrir… altere ao seu gosto…

[]'s Luis Cesar

F

Luis,
Implementei a chamada:

window.open(“http://localhost:8080/rel/RelCargaHorariaSem”);

E dá o erro abaixo:
HTTP Status 404 - /rel/RelCargaHorariaSem
type Status report
message /rel/RelCargaHorariaSem
description The requested resource (/rel/RelCargaHorariaSem) is not available.

No meu caso, estou usando o Eclipse e o nome do Projeto é AlocacaoProfessores e o servlet RelCargaHoariaSem está no:
Java Resources:src/rel/RelCargaHorariaSem.javal

luiscesarinfo

Voce configurou o caminho do servlet corretamente no web.xml ?

esse erro ta com kra de caminho errado… não está achando o servlet…

da uma olhadinha nisso ai…

[]'s Luis Cesar

F

Luis,
Antes já estava funcionando, porém abrindo na mesma janela. Segue abaixo o XML:

<servlet>  
        <servlet-name>RelCargaHorariaSem</servlet-name>  
        <servlet-class>rel.RelCargaHorariaSem</servlet-class>  
    </servlet>  
       
    <servlet-mapping>  
        <servlet-name>RelCargaHorariaSem</servlet-name>  
        <url-pattern>/RelCargaHorariaSem</url-pattern>  
    </servlet-mapping>
F

Luis!
Da forma abaixo consegui abrir o PDF em uma nova janela…

function emitirRelatorio(opcao){
		if (validarFormulario()){
		   indexAtualId = document.getElementById("semestreAtualId").selectedIndex;	 	   
	 	   semestreAtualDescricao = document.formCargaHorariaSem_Rel.semestreAtualId.options[indexAtualId].text;	 	   	 	   		
		   indexAntId = document.getElementById("semestreAntId").selectedIndex;	 	   	 	   
	 	   semestreAntDescricao = document.formCargaHorariaSem_Rel.semestreAntId.options[indexAntId].text;	 	   
	 	   window.open("http://localhost:8080/RelCargaHorariaSem");
// 		   document.formCargaHorariaSem_Rel.action = "RelCargaHorariaSem?semestreAtualDescricao="+semestreAtualDescricao+"&semestreAntDescricao="+semestreAntDescricao;  
//           document.formCargaHorariaSem_Rel.submit();  		
		}
	}

Ocorre que no servlet ele dá NULL exception ao executar o request dos campos:

int semestreAtualId = Integer.parseInt(request.getParameter("semestreAtualId"));
		int semestreAntId = Integer.parseInt(request.getParameter("semestreAntId"));

Atribuindo os valores conforme abaixo, o relatório é visualizado.

int semestreAtualId = 1;
		int semestreAntId = 2;

Convém mencionar que antes de implementar o window.open, ou seja,utilizando “document.formCargaHorariaSem_Rel.action” e “document.formCargaHorariaSem_Rel.submit();” estava funcionando 100%, porém abria o PDF na mesma janela.
Grato.

F

Luis,
Tudo certinho agora…estou passando o parâmetro conforme código abaixo:

if (validarFormulario()){
	 	   semestreAtualId = document.formCargaHorariaSem_Rel.semestreAtualId.value;
           semestreAtualDescricao=document.formCargaHorariaSem_Rel.semestreAtualId.options[document.getElementById("semestreAtualId").selectedIndex].text;           
	 	   semestreAntId = document.formCargaHorariaSem_Rel.semestreAntId.value;	 	   
           semestreAntDescricao=document.formCargaHorariaSem_Rel.semestreAntId.options[document.getElementById("semestreAntId").selectedIndex].text;           	 	   
    	   param = "semestreAtualId="+semestreAtualId;
		   param+= "&semestreAtualDescricao="+semestreAtualDescricao;    	   
		   param+= "&semestreAntId="+semestreAntId;
		   param+= "&semestreAntDescricao="+semestreAntDescricao;    	   		   
		   param+= "&opcao="+opcao;
  	 	   window.open("http://localhost:8080/RelCargaHorariaSem?"+param);
		}

O único detalhe é que no IE e no IDE do Eclipse funciona, no FF não. Ele não reconhece a linha abaixo:

semestreAtualDescricao=document.formCargaHorariaSem_Rel.semestreAtualId.options[document.getElementById("semestreAtualId").selectedIndex].text;

Grato pelas dicas.
Abraço.

luiscesarinfo

:thumbup:

F

Luis!
Um dúvida ainda que tenho, no código abaixo está o endereço “localhost” fixo. Caso eu venha colocar o sistema em provedor, como ficaria isso?

window.open("http://localhost:8080/RelCargaHorariaSem?"+param);

É que esse é o primeiro sistema WEB que estou fazendo, para o meu TCC, por isso essas dúvidas. Pra muitos podem parecer “toscas”, mas pra um iniciante…
Grato pela atenção.

luiscesarinfo

eu também não trabalhei com servidor externo ainda, mas pssivelmente ficaria assim :

window.open("http://www.seuserivodor.com.br/RelCargaHorariaSem?"+param);

isso vc pode pegar com certeza com o suporte de onde vc vai hospedar…

[]'s Luis Cesar

F

Olá Luiz!
Concluí meu TCC e o projeto ficou show de bola e foi aceito pela banca. Ele foi feito com Eclipse 3.2 + Merve e hoje eu baixei o Eclipse 3.3 e quero montar um ambiente de trabalho. Para novos projetos e plugin do Tomcat você recomenda o que?
Também quero agradecer a força que você me deu na parte dos relatórios, pois caso contrário não teria conseguido implementar o PDF no browse.
Grato.

luiscesarinfo

Parabéns Flavio… Fico feliz que vc tenha conseguido concluir seu TCC e também por ter sido útil…

Quanto ao seu ambiente de desenvolvimento, essa versão que vc baixou é a mesma que eu utilizo nos meus projetos e é muito boa… e não precisa preocupar com plugin para o TomCat… vc consegue baixar do site da apache e é facim facim de incorporar ao eclipse… quando vc estiver criando um novo projeto é so indicar onde o tomcat está instalado e ele vai funcionar dentro do eclipse…

se precisar de ajuda para fazer isso, faz um post ai que eu tento te ajudar…

abraço e sucesso !!!

Luis Cesar

F

Olá Luis!
Na versão 3.2 do Eclipse eu tenho instalado o Merve que é um plugin TomCat que agiliza bastante os testes do projeto, pois não preciso exportar para o TomCat e fazer o deploy etc… Porém, ele é compatível com o Eclipse até a versão 3.2, mesmo assim baixei e instalei mas não roda. Bom, segundo seu post, é seria só criar o projeto e configurar o TomCat, mas ao clicar em novo Projeto a versão 3.3 não disponibiliza projeto WEB.
Tenho o TomCat 5.5 instalado. Você pode me detalhar como é o seu ambiente?
Obrigado pela atenção.

F

Olá Luis!
Baixe a versão Eclipse IDE for Java EE Developers e funcionou facim, facim… Tive que refazer algumas configurações do Hibernate mas está tudo ok agora, inclusive o projeto do meu TCC já está no 3.3. Como estou iniciando no desenvolvimento WEB, andei pesquisando algumas rotinas em JS e achei o ExtJS e o DWR. Você usa algum desses componentes?
Grato pela atenção.

luiscesarinfo

blz heim… Kra eu li muito sobre esses item que vc me falou, mas ainda não trabalho com nenhum deles… possivelmente vou trabalhar com o DWR quando eu for iniciar em AJAX… mas ainda tenho que olhar sobre AJAX4JSF que deve ter um outro framework. to é sem tempo para mexer com isso. se vc tiver alguma coisa manda ai…

[]'s Luis Cesar

Criado 29 de novembro de 2007
Ultima resposta 17 de dez. de 2007
Respostas 41
Participantes 2