DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 4/11/2010 4:41:42 PM


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 
  1. "festa_participantes_id" from="${Participantes.list()}" optionKey="id"  noSelection="${['0':'TODOS']}" />  


Colocar na tag qual o relatório que vai receber os parâmetros 
  1. "eventos" format="PDF" name="Eventos">  




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

Valeu! 

Marcelo.
 
Davi Gomes da Costa
 
 


País: Brasil
Estado: CE
Cidade: Fortaleza
Mensagens: 1770
 Postado em: 4/11/2010 4:50:39 PM
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 é:
http://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

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 4/11/2010 4:51:35 PM
Cara, valeu pela ajuda! Vou dar uma conferida e já volto aqui se tiver alguma dúvida!

Valeu mesmo!

 
Davi Gomes da Costa
 
 


País: Brasil
Estado: CE
Cidade: Fortaleza
Mensagens: 1770
 Postado em: 5/11/2010 9:58:16 AM
E aí Marcelo deu certo?

Att DAvi

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 5/11/2010 12:32:48 PM
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!

 
Davi Gomes da Costa
 
 


País: Brasil
Estado: CE
Cidade: Fortaleza
Mensagens: 1770
 Postado em: 5/11/2010 12:41:06 PM
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

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 8/11/2010 12:55:10 PM
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.


 
Davi Gomes da Costa
 
 


País: Brasil
Estado: CE
Cidade: Fortaleza
Mensagens: 1770
 Postado em: 8/11/2010 1:07:04 PM


/**
 * @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



 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 8/11/2010 3:15:21 PM
Exatamente, travei nessa parte ai...

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 8/11/2010 4:13:30 PM
Tentou jogar as opcoes dentro do mapa de sessão ?

Assim voce pode recuperar via servlet >:)

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 8/11/2010 4:53:04 PM
Bom, tentei de outra maneira, o meu codigo é esse:


Relatorio.Controller
#Código
@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:
#Código
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:
#Código
<%@ 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 por
Evento/Participante</h1>
<c:url var="url" value="/relatorio/avaliacoesEficaciaTreinamentoEventoParticipante/" /> <form:form action="${url}"
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
#Código

type Status report

message Request method 'GET' not supported

description 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... =/

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 11/11/2010 4:14:55 PM
O GET que está sendo mencionado é o GET da requisicao http... nao comando GET :)

 
Davi Gomes da Costa
 
 


País: Brasil
Estado: CE
Cidade: Fortaleza
Mensagens: 1770
 Postado em: 11/11/2010 4:31:48 PM
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


 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 18/11/2010 10:38:54 AM
Opa !

Conseguiu resolver ?

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 19/11/2010 7:02:07 PM
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!

 
Mr.Gomes
 

País: Brasil
Estado: PE
Cidade: Recife
Mensagens: 31
 Postado em: 19/11/2010 7:36:00 PM
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
#Código
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
#Código
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
#Código

<h1>Relatório de Gastos</h1>
<c:url var="url" value="/relatorio/gastos/" /> 
<form:form action="${url}" 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.

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 10/12/2010 4:41:35 PM
Opa !

resolvido ?

Poderia marcar como resolvido ?


 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03