Bom acho que nunca postei no guj
Mas enfim vamo lá:
Tenho esse método que pega um jasperPrint e joga num array de bytes e joga esse array no ServletOutputStream
private void generateReportPdf(JasperPrint jp) throws Exception {
byte[] bytes = JasperExportManager.exportReportToPdf(jp);
HttpServletResponse res = FacesContextUtil.getInstance().getResponse();
res.setContentType(APP_PDF);
res.setContentLength(bytes.length);
ServletOutputStream os = res.getOutputStream();
os.write(bytes, 0, bytes.length);
os.flush();
os.close();
os = null;
res = null;
bytes = null;
}
Com esse método eu gero o DataSource e mando para impressão, chamando o método anterior /.
protected void generateReport(Map<String, String> parameters) {
GenericDataSource<GenericReportQuery<B>, B> ds = new GenericDataSource<GenericReportQuery<B>, B>();
if ( this.getBean() != null && this.getBean().getId() != null ) {
this.afterOperation();
ds.setQuery(new GenericReportQuery<B>(this.clazz, this.session));
ds.setFilter(this.getBean());
ds.doConsultByCriteria();
} else {
List <B> f = new ArrayList<B>();
f.add(this.newBean());
ds.setBeans(f);
f = null;
}
GenericReportDataSource<GenericDataSource<GenericReportQuery<B>, B>, B> rs =
new GenericReportDataSource<GenericDataSource<GenericReportQuery<B>, B>, B>(ds);
try {
JasperPrint jp = JasperFillManager.fillReport(FacesContextUtil.getInstance().getContext().getRealPath(this.getPathReport()), parameters, rs);
if ( this.getTypeReport().equals(EXT_PDF) )
this.generateReportPdf(jp);
} catch (Exception e) {
e.printStackTrace();
}
parameters.clear();
rs = null;
FacesContextUtil.getInstance().getFacesContext().responseComplete();
}
Este método é public e é utilizado para chama o responsável por gerar o relatório, ou seja o método anterior /, ele fica em um managed bean.
public void generateReport() {
Map<String, String> parameters = new HashMap<String, String>();
ServletContext sc = FacesContextUtil.getInstance().getContext();
parameters.put("FichaSistema", sc.getRealPath("WEB-INF/classes/br/com/S177/report/FichaSistema.jasper"));
parameters.put("FichaFuncionario", sc.getRealPath("WEB-INF/classes/br/com/S177/report/FichaFuncionario.jasper"));
parameters.put("ImageFolder", sc.getRealPath("WEB-INF/classes/br/com/S177/report/images"));
this.generateReport(parameters);
}
Para visualizar o relatório eu criei uma view, responsável por mostrar o mesmo.
<?xml version="1.0" encoding="ISO-8859-1"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<html>
<head>
<script type="text/javascript" src="../js/jquery.js"></script>
</head>
<body onload="jQuery('#generate_button').trigger('click')">
<h:form rendered="#{applicationController.logged}" id="generate_form" prependId="false">
<h:commandButton id="generate_button" action="#{applicationController.controller.generateReport}" value="x" style="display:none;" />
</h:form>
</body>
</html>
</ui:composition>
Aqui tive que fazer uma pequena gambiarra, pelo seguinte em JSF nativamente, não existe como fazer uma página carregar um action no onload dela, ATÉ ONDE EU SEI, eu sei que deve exister algum projeto open source por ai que se proponha a fazer isso para o JSF, só que eu estava sem saco para isso, então não me venha “A porque não utilizo XYZ componente”.
bom o eu fiz é o seguinte, coloquei um form ai, como você pode ver, com um botão escondido, com jQuery eu emulo um onclick nele ao final do load da página, o action que eu chamo no botão como você pode ver é o de gerar o relátorio.
Bom é isso
se ficar confuso posta de novo que eu tento explicar
Vlw []´s