Passar parametros de uma página JSP para um Jasper Report
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
Curtidas 0
Respostas
Davi Costa
04/11/2010
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
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
GOSTEI 0
Marcelo Gomes
04/11/2010
Cara, valeu pela ajuda! Vou dar uma conferida e já volto aqui se tiver alguma dúvida!
Valeu mesmo!
Valeu mesmo!
GOSTEI 0
Davi Costa
04/11/2010
E aí Marcelo deu certo?
Att DAvi
Att DAvi
GOSTEI 0
Marcelo Gomes
04/11/2010
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!
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!
GOSTEI 0
Davi Costa
04/11/2010
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
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
GOSTEI 0
Marcelo Gomes
04/11/2010
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.
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.
GOSTEI 0
Davi Costa
04/11/2010
/**
* @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
GOSTEI 0
Marcelo Gomes
04/11/2010
Exatamente, travei nessa parte ai...
GOSTEI 0
Dyego Carmo
04/11/2010
Tentou jogar as opcoes dentro do mapa de sessão ?
Assim voce pode recuperar via servlet >:)
Assim voce pode recuperar via servlet >:)
GOSTEI 0
Marcelo Gomes
04/11/2010
Bom, tentei de outra maneira, o meu codigo é esse:
Relatorio.Controller
POJO:
JSP onde vou inserir os parametros que serao inseridos no relatorio:
Agora fica dando erro
Sò que nao tenho NENHUM GET em NENHUM LUGAR do meu codigo... =/
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... =/
GOSTEI 0
Dyego Carmo
04/11/2010
O GET que está sendo mencionado é o GET da requisicao http... nao comando GET :)
GOSTEI 0
Davi Costa
04/11/2010
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
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
GOSTEI 0
Dyego Carmo
04/11/2010
Opa !
Conseguiu resolver ?
Conseguiu resolver ?
GOSTEI 0
Marcelo Gomes
04/11/2010
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!
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!
GOSTEI 0
Marcelo Gomes
04/11/2010
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
Fiz um Controller para TODOS os relatórios:
RelatorioController.java
E finalmente a parte do arquivo JSP que passa os parâmetros para o relatório:
gastos.jsp
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.
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.
GOSTEI 0
Dyego Carmo
04/11/2010
Opa !
resolvido ?
Poderia marcar como resolvido ?
resolvido ?
Poderia marcar como resolvido ?
GOSTEI 0