estou finalmente adicionando alguns relatórios à minha aplicação web.
Estou usando o Jasper Report e até então tudo tem se mostrado
satisfatório.. bem, quase tudo!
As minhas páginas são todas no padrão cabecalho/menu lateral/rodapé. Uso
jsp fragments para montar (é, deveria usar facelets, mas o VWP do
Netbeans me deixou preguiçoso).
Mas quando vou renderizar o relatório, nos exemplos que vi pelo menos,
ele basicamente obtem o response e joga o relatório lá. Blz, funciona
mas meu belo cabecalho vai p as cucuias.
Estou folheando o livro Jasper Reports For Java Developers e tem um
capitulo la no finalzinho para integrar com JSF, mas ele usa o mesmo
método... ou seja, o resultao final é uma página unicamente com o relatório.
Tem alguma maneira de eu... err... inserir meu relatorio numa página ou
fazer o meu cabeçalho/rodapé ser renderizado junto com o relatório (sem
ter que adicionar no relatório propriamente dito)?
Valeus,
--
Rodrigo Rosa
Desenvolvimento
Wonder Sistemas de Informações
Erechim - RS
eu fiz isso que vc pensou em uma aplicação por aqui, no entanto eu não
utilizo Jasper e sim o BIRT do Eclipse =)
o que eu fiz foi despachar um cabeçalho, juntando com o servlet do
relatorio, fazendo assim:
ServletContext sc = req.getSession().getServletContext();
sc.getRequestDispatcher("cabecalho.jspx").include(req,
resp);
agora, se a sua aplicação não vem por servlet, daí por enquanto vc
fica sem resposta =)
abraço,
by Carlos
Aí Rodrigo...
eu fiz isso que vc pensou em uma aplicação por aqui, no entanto eu não
utilizo Jasper e sim o BIRT do Eclipse =)
o que eu fiz foi despachar um cabeçalho, juntando com o servlet do
relatorio, fazendo assim:
ServletContext sc = req.getSession().getServletContext();
sc.getRequestDispatcher ("cabecalho.jspx").include(req,
resp);
agora, se a sua aplicação não vem por servlet, daí por enquanto vc
fica sem resposta =)
abraço,
by Carlos
Rafael Ponte
Estava aqui dando uma olhada nas alternativas sugeridas pelo Ponte
(valeu, Ponte!), mas o q eu realmente queria era algo assim como vc sugeriu!
Deixa eu tentar aqui p ver se funciona no meu contexto. Mas a idéia é
exatamente essa... anexar o cabecalho "na corrida".
=)
Carlos Gregoreki escreveu:
Hey Rafael...
vou explica rum pouco, já que não sou muito didático pra essas coisas
=D
a minha aplicação possui como visualzador de relatorios o BIRT do
eclipse...
para chamar um relatório, eu escolhi chamá-lo por servlet, ou seja, no
método doGet() do meu servlet eu tenho implementado as linhas de
código pra me renderizar um relatorio na tela.
Assim:
public void doGet(HttpServletRequest req,
HttpServletResponse resp) throws
ServletException,
IOException {
resp.setContentType("text/html");
ServletContext sc =
req.getSession().getServletContext();
sc.getRequestDispatcher("cabecalho.jspx").include(req,
resp);
this.birtReportEngine =
BirtEngine.getBirtEngine(sc); //cria a engine do birt...
HTMLRenderContext renderContext = new
HTMLRenderContext();
//... alguns codigos nao necessarios para essa
discussao
IReportRunnable design;
try {
String reportName = "relatorio.rptdesign";
design =
birtReportEngine.openReportDesign(reportName); //abre o design para
jogar os dados lah dentro
designFactory(design);
IRunAndRenderTask task =
birtReportEngine.createRunAndRenderTask(design);
task.setAppContext(contextMap);
HTMLRenderOption options = new HTMLRenderOption();
options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
options.setOutputStream(resp.getOutputStream());
task.setRenderOption(options);
// run report
task.run(); // aqui roda o relatorio e o mostra na
tela dentro do response
task.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
pronto...
como vc pode ver, eu tenho (cabecalho.jspx + relatorio) como response.
task.run() faz com que o relatorio seja mostrado na tela.
=)
espero ter sido claro o suficiente..
abraço,
by Carlos
task.run (); // aqui roda o relatorio e o mostra na
tela dentro do response
task.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
pronto...
como vc pode ver, eu tenho (cabecalho.jspx + relatorio) como response.
task.run() faz com que o relatorio seja mostrado na tela.
=)
espero ter sido claro o suficiente..
abraço,
by Carlos
quando eu coloco
resp.setContentType("text/html");
digo que o response vai ser apenas em text/html.
a seguinte parte do codigo diz para o relatorio ser em html, nao em
pdf..
options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
ou seja, meu relatorio nao vem em pdf, vem em html, que eh concatenado
depois de cabecalho.jspx com o seguinte codigo:
options.setOutputStream(resp.getOutputStream());
task.setRenderOption(options);
abraço,
by Carlos
abraço,
by Carlos
certo..
Usamos BIRT porque têm-se demonstrado bem ativo no quesito de
desenvolvimento... o pessoal do Eclipse é Fera! ;)
Deve-se levar em consideração que o Birt já é business inteligence
desde seu inicio, coisa que o jasper começou a falar e desenvolver no
2º bimestre desse ano.
Birt tem uma flexibilidade enorme quanto aos databindings e as
tabelas..
ainda não experimentei, mas há boatos que pode colocar códigos e
ELexpressions dentro de um design...
percebe-se que o jasper compila o xml, coisa que o birt nao faz, mas
sim o roda em cima de uma plataforma java, que quem sabe é por isso
que permite essa ligacao. (sim, é uma plataforma meio que separada,
sempre é instalada em WEB-INF/platform )
E outra coisa...
o M.c.P , que era o chefe, é que decidia essas coisas também =D
qualquer coisa dá um tapa nele ;)
abraço,
by Carlos
Rafael Ponte
System.out.println("Relatorio - 1!!");
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.
getExternalContext().getResponse();
InputStream reportStream =
context.getExternalContext().getResourceAsStream("sisacad/relatorio/
Documento.jasper");
response.setContentType("application/pdf");
response.setHeader("Content-disposition",
"attachment;filename=Documento.pdf");
ServletOutputStream servletOutputStream =
response.getOutputStream();
Map parameters = new HashMap();
parameters.put("titulo", "Relatório de Documentos");
JasperRunManager.runReportToPdfStream(reportStream,
servletOutputStream,parameters,new JREmptyDataSource());
System.out.println("Relatorio - 2!!");
context.responseComplete();
//servletOutputStream.flush();
//servletOutputStream.close();
System.out.println("Relatorio - 3!!");
Conforme o código ele exibe todas as mensagens mensagens no console,
só que não exibe o relatório.
Alguém pode me ajudar !!!
---------- Forwarded message ----------
From: "Rafael Ponte" <rpo...@gmail.com>
Date: 17 out 2007, 08:43
Subject: JSF e Jasper Report
To: javasf: JavaServer Faces International Group
O popup que ele fala é o conhecido window.popup(), saca?
Algumas pessoas chamam o modal (janelinha que abre sobre a principal e
bloquea a tela) de popup também. O popup do Tomahawk é um div, então
não
cairia bem para o lance do relatório, você precisa o usar o
window.popup().
On 10/17/07, Rodrigo Rosa <rodr...@wonder.com.br> wrote:
> Rogério,
> a título de teste quero implementar também dessa maneira que vc sugeriu,
> com popup. Mas, quando vc diz popup, é o componente do tomahawk? Por hora
> estou usando somente JSF e Woodstock por aqui... (e não, o woodstock não tem
> popup... =/ )
> Como assim, "abrir a janela"? Vc faz um outro form p conter o popup? Tem
> um exemplo rápido aí? Estou olhando o exemplo do tomahawk mas não entendi
> essa parte de "abrir a janela" q vc citou...
> Estou propenso a usar com popups mesmo, depois de pensar um pouco achei
> mais interessante.
> Valeu!
> rogerio.ara...@gmail.com escreveu:
> Sempre abro um popup para relatórios iReport, funciona legal, é só no
> onclick abrir a janela e setar o target do commandLink com o nome da
> janela aberta.
Cara eu estou fazendo relatórios com o JasperReport e não tive
problemas para exibir. Espere até amanhã, no trabalho eu envio o
códido para você.