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
Curtir tópico
+ 0Posts
04/11/2010
Davi Costa
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
04/11/2010
Marcelo Gomes
Valeu mesmo!
Gostei + 0
05/11/2010
Davi Costa
Att DAvi
Gostei + 0
05/11/2010
Marcelo Gomes
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
05/11/2010
Davi Costa
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
08/11/2010
Marcelo Gomes
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
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
Gostei + 0
08/11/2010
Marcelo Gomes
Gostei + 0
08/11/2010
Dyego Carmo
Assim voce pode recuperar via servlet >:)
Gostei + 0
08/11/2010
Marcelo Gomes
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
11/11/2010
Dyego Carmo
Gostei + 0
11/11/2010
Davi Costa
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
18/11/2010
Dyego Carmo
Conseguiu resolver ?
Gostei + 0
19/11/2010
Marcelo Gomes
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
19/11/2010
Marcelo Gomes
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
Clique aqui para fazer login e interagir na Comunidade :)