GARANTIR DESCONTO

Fórum Passar parametros de uma página JSP para um Jasper Report #389960

04/11/2010

0


Boa tarde galera, já postei essa dúvida em outro fórum, mas decidi perguntar a vocês também.

Procurei, procurei e não achei uma solução para o meu problema, espero que vocês consigam me ajudar! 

É o seguinte... 

Fiz um aplicativo em Grails, e consegui integrá-lo perfeitamente com o JasperReports. 
Acontece que o meu cliente agora, quer a mesma versão do aplicativo em Spring MVC. 
Consegui migrar quase tudo (pense num sufoco!), e agora 'impaquei' na combinação Spring + Jasper. 

TODOS os meus relatórios estão prontos, com todas as entradas de parâmetros definidas. Só que não consigo 
achar um meio de passar os parâmetros do meu form pro relatório. 

Pra ser mais claro: Tenho selects e inputs, e gostaria de passar os valores selecionados/digitados pra dentro do jasperreport, simplesmente 
clicando no submit de uma página jsp, como acontecia no Grails. 

Alguém tem idéia de como me ajudar? Tem algum sample que eu possa ver? Pois tudo que achei na internet foram códigos que envolviam pojos, controllers e o escambau, não vi o código de uma JSP sequer... Será que realmente precisa disso tudo? 

No Grails, eu simplesmente fazia assim: 

Preencher a select, e simplesmente dar ao "name" dela, o nome do parametro que tá lá no relatório 
view plaincopy to clipboardprint?"festa_participantes_id" from="${Participantes.list()}" optionKey="id"  noSelection="${['0':'TODOS']}" />  

Colocar na tag qual o relatório que vai receber os parâmetros 
view plaincopy to clipboardprint?"eventos" format="PDF" name="Eventos">  



Agradeço desde já pela atenção, pessoal! 

Valeu! 

Marcelo. 
Marcelo Gomes

Marcelo Gomes

Responder

Posts

04/11/2010

Davi Costa

Vc consegue pegar os parâmetros da tua jsp de alguma forma..
Então, vai ter que criar um serviço que receba esses parâmtros e execute teu relatório.

Existe uma thread sobre isso que é:
https://www.devmedia.com.br/forum/java/389723-iReport-+-JSF-classes-para-gerar-relatorio-na-pagina-jsf.html

Dá uma olhada minuciosa nos código que eu coloquei lá c certeza vão te servir

Att Davi
Responder

Gostei + 0

04/11/2010

Marcelo Gomes

Cara, valeu pela ajuda! Vou dar uma conferida e já volto aqui se tiver alguma dúvida!
Valeu mesmo!
Responder

Gostei + 0

05/11/2010

Davi Costa

E aí Marcelo deu certo?

Att DAvi
Responder

Gostei + 0

05/11/2010

Marcelo Gomes

Li tudo mas ainda nao tive tempo pra implementar. Hoje volto pra casa, faço os testes e te digo.
Desculpa a ignorancia, mas uma coisa que eu notei, é que no link que voce me passou nao tem nenhum exemplo de pagina JSP passando parametros, sò o serviço.
Mas vou ler o codigo direitinho quando chegar em casa, e vejo se resolvo o problema.
Mais uma vez, valeu pela força!
Responder

Gostei + 0

05/11/2010

Davi Costa

Realmente não tem código de jsp não,
o que sugeri foi vc pegar seus atributos da jsp, como pega para outras necessidades e depois vc pega esses valores e joga no serviço que tem naqueles exemplos.

att Davi
Responder

Gostei + 0

08/11/2010

Marcelo Gomes

Serà que voce poderia me mandar o codigo da classe TipoFormatoRelatorio e ReportException?
E além disso, voce cria uma instancia da FacesContext, mas nao to trabalhando com JSF. Tem alguma coisa errada, ou entendi errado alguma coisa?
Mais um vez desculpa a ignorancia.. Eu nunca trabalhei com faces, e to meio perdido aqui.
Responder

Gostei + 0

08/11/2010

Davi Costa



/**
 * @author davi.costa
 *
 */
public class ReportException extends RuntimeException {

    /**
     *
     */
    private static final long serialVersionUID = -1795222147940543003L;

    public ReportException(String msg) {
        super(msg);
    }
    
    public ReportException(String msg, Throwable throwable) {
        super(msg, throwable);
    }

}

/**
 * Enumeração que defini os tipos de formato para
 * a geração de um relatório.
 *
 * @author Davi Costa
 * @since  03/08/2010
 *
 */
public enum TipoFormatoRelatorio {

    ACROBAT_PDF("Acrobat PDF"),
    TEXTO("Texto"),
    PLANILHA("Planilha"),
    PAGINA_HTML("Página HTML");
   
    protected String nomeRelatorio = null;
   
    private TipoFormatoRelatorio(String nomeRelatorio) {
        this.nomeRelatorio = nomeRelatorio;
    }
}

Em relação ao FacesContext, eu usei para instanciar:

FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

O response instancia:

ServletOutputStream servletOutputStream = response.getOutputStream();

Mas como vc não está usando jsf, vai ter que ver como fazer isso, é o que falei vai ter q pesquisar umaforma de instanciar HttpServletResponse.

Att Davi


Responder

Gostei + 0

08/11/2010

Marcelo Gomes

Exatamente, travei nessa parte ai...
Responder

Gostei + 0

08/11/2010

Dyego Carmo

Tentou jogar as opcoes dentro do mapa de sessão ?

Assim voce pode recuperar via servlet >:)
Responder

Gostei + 0

08/11/2010

Marcelo Gomes

Bom, tentei de outra maneira, o meu codigo é esse:

Relatorio.Controller
	@RequestMapping(value = "/relatorio/avaliacoesEficaciaTreinamentoEventoParticipante", method = RequestMethod.POST)	public String avaliacoesEficaciaTreinamentoEventoParticipante(@ModelAttribute("avaliacoesEficaciaTreinamentoEventoParticipante") AvaliacoesEficaciaTreinamentoEventoParticipante avaliacoesEficaciaTreinamentoEventoParticipante, ModelMap modelMap, ServletRequest request, ServletResponse response) throws IOException {		modelMap.addAttribute("avaliacoesEficaciaTreinamentoEventoParticipante", avaliacoesEficaciaTreinamentoEventoParticipante);				List avaliacoesEficaciaTreinamentoEventoParticipanteList = sess.createCriteria(AvaliacoesEficaciaTreinamentoEventoParticipante.class)		.add(Restrictions.eq("cpf", request.getParameter("cpf")))		.add(Restrictions.eq("dataInicio1", request.getParameter("dataInicio1")))		.add(Restrictions.eq("dataInicio2", request.getParameter("dataInicio2")))		.add(Restrictions.eq("eventoId", request.getParameter("eventoId")))		.list();				modelMap.addAttribute("avaliacoesEficaciaTreinamentoEventoParticipanteList", avaliacoesEficaciaTreinamentoEventoParticipanteList);		return "relatorio/avaliacoesEficaciaTreinamentoEventoParticipante";	}





POJO:
package br.com.portal.relatorio;

public class AvaliacoesEficaciaTreinamentoEventoParticipante {
	private String cpf;	private String dataInicio1;	private String dataInicio2;	private Integer eventoId;		public String getCpf() {		return cpf;	}	public void setCpf(String cpf) {		this.cpf = cpf;	}	public String getDataInicio1() {		return dataInicio1;	}	public void setDataInicio1(String dataInicio1) {		this.dataInicio1 = dataInicio1;	}	public String getDataInicio2() {		return dataInicio2;	}	public void setDataInicio2(String dataInicio2) {		this.dataInicio2 = dataInicio2;	}	public Integer getEventoId() {		return eventoId;	}	public void setEventoId(Integer eventoId) {		this.eventoId = eventoId;	}	}






JSP onde vou inserir os parametros que serao inseridos no relatorio:
<%@ include file="../includes.jsp"%>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="layout" content="main" /><title><spring:message code="default.add.label" /></title></head><body><div class="nav"><span class="menuButton"><a	href="<c:url value="/relatorio/avaliacoesEficaciaTreinamentoEventoParticipante/"/>" class="list"><spring:message	code="default.button.list.label" /></a></span></div><div class="body"><h1>Relatório de avaliações de Eficácia do Chefe porEvento/Participante</h1><c:url var="url" value="/relatorio/avaliacoesEficaciaTreinamentoEventoParticipante/" /> <form:form action="$"	method="POST" modelAttribute="relatorio">	<div class="dialog">	<table>		<tbody>			<tr>				<td><label for="cpf">CPF do Participante (Obrigatório)</label>				</td>				<td valign="top" class="cpf"><form:input path="cpf" alt="cpf" id="cpf" /></td>			</tr>			<tr class="prop">				<td valign="top" class="name"><label for="periodorealizacao">Período				Realização</label></td>				<td valign="top"><form:input path="dataInicio" id="dataInicio1" alt="date"/> a <form:input					path="dataInicio" id="dataInicio2" alt="date"/></td>			</tr>			<tr class="prop">				<td valign="top" class="name"><label for="evento"><spring:message					code="avaliacao.evento.label" /></label></td>				<td valign="top"><form:select path="eventoId" id="evento_titulo" />				</td>			</tr>					</tbody>	</table>	</div></form:form></div></body></html>


Agora fica dando erro
type Status reportmessage Request method 'GET' not supporteddescription The specified HTTP method is not allowed for the requested resource (Request method 'GET' not supported).


Sò que nao tenho NENHUM GET em NENHUM LUGAR do meu codigo... =/
Responder

Gostei + 0

11/11/2010

Dyego Carmo

O GET que está sendo mencionado é o GET da requisicao http... nao comando GET :)
Responder

Gostei + 0

11/11/2010

Davi Costa

Tem como vc instanciar :
 ServletOutputStream servletOutputStream = response.getOutputStream();

no método da sua servlet já vem o response, qualquer coisa como não está usando JSF basta passá-la como parâmtro para aquela classe utilitária resolve seu problema. Simples simples

Testa aí.

att Davi

Responder

Gostei + 0

18/11/2010

Dyego Carmo

Opa !

Conseguiu resolver ?
Responder

Gostei + 0

19/11/2010

Marcelo Gomes

Opa, desculpa a ausência aqui!
O problema foi resolvido sim, e já já posto como eu consegui aqui!
Já que tô aqui aproveito pra tirar mais uma dúvida:

Consigo passar os parâmetros pro relatório, chamando eles dos POJOs que fiz pra cada relatório.
Eis a minha dúvida: Assim como em Grails, existe algo como o "params"?
Gostaria de passar os parametros por POST, e não necessariamente passando por um POJO.É que não gosto muito da idéia de criar uma classe pra cada relatório...
Agradeço desde já, e já já posto a minha solução!
Valeu!
Responder

Gostei + 0

19/11/2010

Marcelo Gomes

Bom, vou consegui passar parâmetros para um JasperReport, eis o que fiz:
Criei um simples POJO pra cada relatório, contendo os campos que uso como parâmetros:(Vou usar como exemplo o relatório "Gastos")
RelGastos.java
package br.com.portal.relatorio;
public class RelGastos {

	// CRIE VARIAVEIS COM OS MESMOS NOMES DOS PARAMETROS QUE VOCE DECLAROU NO JASPER	private String cpf;
	// GETTER E SETTER	public String getCpf() {		return cpf;	}	public void setCpf(String cpf) {		this.cpf = cpf;	}
	}


Fiz um Controller para TODOS os relatórios:
RelatorioController.java
package br.com.portal.web;
import br.com.portal.relatorio.RelGastos;
@Controller@RequestMapping("/relatorio/**")public class RelatorioController {
	// CRIE UMA VARIAVEL DE TIPO BYTE[], QUE SERA CHAMADA MAIS TARDE. SERA O SEU RELATORIO .JASPER	private byte[] relatorio;
	// MAPEAMENTO DA PAGINA ONDE TEM O FORM QUE SERA UTILIZADO PRA PASSAR OS PARAMETROS	@RequestMapping(value = "/relatorio/gastos", method = RequestMethod.GET)	public String gastos(ModelMap modelMap) {		modelMap.addAttribute("relgastos", new RelGastos());		return "relatorio/gastos";	}	
	// ACAO AO CLICAR NO BOTAO QUE EXECUTA A PASSAGEM DE PASSAR OS PARAMETROS	@RequestMapping(value = "/relatorio/gastos", method = RequestMethod.POST)	public void gastos(ModelMap modelMap, ServletRequest request,			HttpServletResponse response) throws IOException {
		// LOCALIZACAO DO ARQUIVO .JASPER		InputStream is = this.getClass().getClassLoader()				.getResourceAsStream("reports/gastos.jasper");
		// HASHMAP COM OS PARAMETROS A SEREM PASSADOS.		HashMap<String, Object> parameters = new HashMap<String, Object>();		parameters.put("cpf", request.getParameter("cpf"));
		// CHAMAR O RELATORIO ATRAVES DOS METODOS ABAIXO		byte[] relatorio = chamarRelatorio(is, parameters);		abrirPdf(relatorio, "gastos", response);	}			public byte[] chamarRelatorio(final InputStream is,			final HashMap<String, Object> parameters) {
		// CHAMADA DO RELATORIO		Session sess = (Session) genericDao.getEntityManager().getDelegate();				sess.doWork(new Work() {
			public void execute(Connection connection) {								try {					// LEMBRANDO QUE VOCE PRECISA INSTALAR O JASPERREPORTS PARA PODER					// UTILIZAR ESTAS CLASSES					relatorio = JasperRunManager.runReportToPdf(is,							parameters, connection);				} catch (JRException e) {					// TODO Auto-generated catch block					e.printStackTrace();				}
			}		});		return relatorio;					}			public static void abrirPdf( byte[] relatorio, String nomeRelatorio, HttpServletResponse response)	{	   response.addHeader("content-disposition","attachment;filename="+nomeRelatorio+".pdf");	   response.setContentType("application/pdf");	   OutputStream ops = null;	   // ACOES A SEREM TOMADAS CASO O RELATORIO RETORNE VAZIO	   try	   {	      if (relatorio != null) 	      {             ops = response.getOutputStream();             ops.write(relatorio);          }	   }	   catch (Exception e) 	   {	      e.printStackTrace();	   }	   finally 	   {          if (ops != null)           {             try              {		ops.flush();		ops.close();	     }              catch (IOException e)              {		e.printStackTrace();	     }          }       }    }}


E finalmente a parte do arquivo JSP que passa os parâmetros para o relatório:
gastos.jsp
<h1>Relatório de Gastos</h1><c:url var="url" value="/relatorio/gastos/" /> <form:form action="$" method="POST" modelAttribute="relgastos">	<div class="dialog">	<table>		<tbody>			<tr>				<td><label for="cpf">CPF</label></td>				<td valign="top" class="cpf"><form:input path="cpf" alt="cpf" id="cpf" /></td>			</tr>			<tr>                    		<td><input id="filtrar" type="submit" class="filtrar" value="Filtrar" /></td>                    		<td></td>                  	</tr>		</tbody>	</table>	</div></form:form>

Nessa página não fiz nada demais, só criei um form que passasse o parâmetro desejado, ou seja, o $P{} que criei dentro do relatório jasper.
Já que estou aqui, aproveito para reiterar a dúvida que postei anteriormente:
Eis a minha dúvida: Assim como em Grails, existe algo como o "params"?
Gostaria de passar os parametros por POST, e não necessariamente passando por um POJO.É que não gosto muito da idéia de criar uma classe pra cada relatório...

Agradeço a todos pela ajuda, e espero que isso aqui sirva de ajuda caso alguém tenha o mesmo problema que eu tive.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar