Gabriel Fernandes Salomão escreveu:
Murilo,
Se entendi corretamete, você já tem um relatório gerado e deseja exibi-lo dentro de uma página do seu portal, correto?
O Jasper Report gera uma página completa, por isso para ser exibi-la dentro de uma página do Lumis você pode usar um IFrame, que pode ser definido estaticamete usando uma interface do serviço de HTML (http://linx.lumis.com.br/doc/lumisportal/6.0.3.111130/help/index.htm?html.htm) do Lumis, ou customizando um controle para renderizar o IFrame.
O web.xml do Lumis Portal já está definido:
<servlet>
<servlet-name>ReportImageServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>
...
<servlet-mapping>
<servlet-name>ReportImageServlet</servlet-name>
<url-pattern>/lumis/service/report/img</url-pattern>
</servlet-mapping>
onde /lumis/service/report/img é o path que contém as imagens usadas pelo Jasper Report.
Você pode criar um JSP, que aponte para o relatório desejado, esta implementação usa a API do Jasper Report quase que exclusivamente, além de java obviamente.
showMyReport.jsp:
<%@ page import="Showmyrepotcontrollerpath.*" %><%
ShowMyReportControllerHtml controller = new ShowMyReportControllerHtml(request, response);
controller.handleRequest();
%>
Segue a implementação do controller:
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lumis.portal.PortalException;
import lumis.portal.UnexpectedException;
import lumis.portal.controller.ControllerHtml;
import lumis.portal.dao.jdbc.ITransactionJdbc;
import lumis.portal.manager.ManagerFactory;
import lumis.portal.transaction.PortalTransactionFactory;
import lumis.util.ITransaction;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.util.JRProperties;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
/**
* Renders a JasperReport.
*/
public class ShowMyReportControllerHtml extends ControllerHtml
{
static
{
// properties for the jdt-compiler to use J2SE 5 source level
JRProperties.setProperty("org.eclipse.jdt.core.compiler.source", "1.5");
JRProperties.setProperty("org.eclipse.jdt.core.compiler.compliance", "1.5");
JRProperties.setProperty("org.eclipse.jdt.core.compiler.codegen.TargetPlatform", "1.5");
// ignore missing fonts
JRProperties.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");
}
public ShowMyReportControllerHtml(HttpServletRequest request, HttpServletResponse response) throws PortalException
{
super(request, response, false);
}
@SuppressWarnings("unchecked")
public void handleRequest() throws PortalException
{
if (!"GET".equals(request.getMethod()) && !"POST".equals(request.getMethod()))
return;
try
{
JasperPrint jasperPrint;
ITransaction transaction = PortalTransactionFactory.createTransaction();
try
{
transaction.begin();
// create map with parameters for the report
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(JRParameter.REPORT_LOCALE, sessionConfig.getLocale());
// set runtime parameters
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements())
{
String parameterName = parameterNames.nextElement();
String parameterValue = request.getParameter(parameterName);
parameters.put(parameterName, parameterValue);
}
// fill the report
JasperReport jasperReport = getJasperReport("reportPath");
{
Connection connection = ((ITransactionJdbc)transaction).getConnection();
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
}
transaction.commit();
}
finally
{
transaction.dispose();
}
outputReport(jasperPrint);
}
catch (PortalException e)
{
throw e;
}
catch (Exception e)
{
throw new UnexpectedException(e);
}
}
/**
* Returns the JasperReport object for the report in the specified path.
* @param reportPath the path to the report.
* @return the JasperReport object.
*/
private JasperReport getJasperReport(String reportPath) throws JRException
{
// compile the report
//TODO: create an inputStream for your report file, this implementation can access only files relative to lumisdata/def, implement yours if want other path.
InputStream reportInputStream = ManagerFactory.getDeploymentManager().getClassLoader().getResourceAsStream(reportPath);
if(reportInputStream == null)
throw new IllegalArgumentException("Cannot find " + reportPath);
JasperReport jasperReport = JasperCompileManager.compileReport(reportInputStream);
return jasperReport;
}
/**
* Writes the page after set the right header to the HttpServletResponse.
* @param jasperPrint the compiled report.
*/
private void outputReport(JasperPrint jasperPrint) throws IOException, JRException
{
JRExporter exporter;
String reportFormat = request.getParameter("reportFormat");
if ("pdf".equals(reportFormat))
{
exporter = new JRPdfExporter();
response.setContentType("application/pdf");
response.addHeader("content-disposition", "attachment; filename=report.pdf");
}
else if ("rtf".equals(reportFormat))
{
exporter = new JRRtfExporter();
response.setContentType("application/rtf");
response.addHeader("content-disposition", "attachment; filename=report.rtf");
}
else if ("xml".equals(reportFormat))
{
exporter = new JRXmlExporter();
response.setContentType("text/xml");
response.addHeader("content-disposition", "attachment; filename=report.xml");
}
else if ("odt".equals(reportFormat))
{
exporter = new JROdtExporter();
response.setContentType("application/vnd.oasis.opendocument.text");
response.addHeader("content-disposition", "attachment; filename=report.odt");
}
else if ("xls".equals(reportFormat))
{
exporter = new JRXlsExporter();
response.setContentType("application/vnd.ms-excel");
response.addHeader("content-disposition", "attachment; filename=report.xls");
}
else
{
// create an HTML exporter
exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);
exporter.setParameter(JRHtmlExporterParameter.IS_WRAP_BREAK_WORD, Boolean.TRUE);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
// path for report image repository defined in web.xml
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/lumis/service/report/img?" + ImageServlet.IMAGE_NAME_REQUEST_PARAMETER + "=");
response.setCharacterEncoding("UTF-8");
}
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream());
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
}
}
abraço,
Gabriel, fico muito agradecido pela ajuda. Mas meu problema é o seguinte. Tenho no meu doiu a seguinte interface:
<interface id="relatorio">
<controls>
<control:lum_form>
<control:lum_interfaceHeader />
<control:lum_controlGroup>
<control:lum_interfaceButtons>
<control:lum_okButton text="Ok">
<onClick type="script"><script><![CDATA[LumisPortal.isSubmitting = false;]]></script></onClick>
<onClick type="processAction" processActionId="relatorio" />
<onClick type="script"><script><![CDATA[LumisPortal.isSubmitting = false;]]></script></onClick>
</control:lum_okButton>
</control:lum_interfaceButtons>
</control:lum_controlGroup>
</control:lum_form>
</controls>
<processActions>
<processAction id="relatorio" type="generic" className="br.org.fenae.service.apcefspjogosintegracao2012finais.RelatorioProcessAction">
<response type="doui_message" />
</processAction>
</processActions>
</interface>
Que tem a seguinte classe:
package br.org.fenae.service.apcefspjogosintegracao2012finais;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.portlet.PortletSession;
import lumis.doui.processaction.ProcessActionHandler;
import lumis.portal.PortalContext;
import lumis.portal.PortalException;
import lumis.portal.dao.DaoException;
import lumis.portal.dao.jdbc.ITransactionJdbc;
import lumis.util.PortalUtil;
public class RelatorioProcessAction extends ProcessActionHandler {
// Identificador do Conteudo a ser exportado
private String id = PortalUtil.generateNewGuid();
private StringBuilder relName = new StringBuilder();
private StringBuilder filePath = new StringBuilder();
public void processAction() throws PortalException {
pesquisarConvenios();
relName.append(PortalContext.getDefinitionPath("/FenaeApcefs/service/apcefspjogosintegracao2012finais/jasper/AtletasFinais"));
relName.append(".jasper");
filePath.append("downloadRelatorio.jsp?id=");
filePath.append(id);
douiContext.getRequest().getPortletSession().setAttribute("relName", relName.toString(), PortletSession.APPLICATION_SCOPE);
}
private void pesquisarConvenios() throws DaoException {
String sql = "SELECT"
+ " apcef_sp_jogos_inter2012_finais.`apsp_tipo` AS apcef_sp_jogos_inter2012_finais_apsp_tipo,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_nome` AS apcef_sp_jogos_inter2012_finais_apsp_nome,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_matricula` AS apcef_sp_jogos_inter2012_finais_apsp_matricula,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_lotacao` AS apcef_sp_jogos_inter2012_finais_apsp_lotacao,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_rg` AS apcef_sp_jogos_inter2012_finais_apsp_rg,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_sexo` AS apcef_sp_jogos_inter2012_finais_apsp_sexo,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_data_nascimento` AS apcef_sp_jogos_inter2012_finais_apsp_data_nascimento,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_cidade` AS apcef_sp_jogos_inter2012_finais_apsp_cidade,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_telefone` AS apcef_sp_jogos_inter2012_finais_apsp_telefone,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_celular` AS apcef_sp_jogos_inter2012_finais_apsp_celular,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_email` AS apcef_sp_jogos_inter2012_finais_apsp_email,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_sr` AS apcef_sp_jogos_inter2012_finais_apsp_sr,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_atletismo_feminino` AS apcef_sp_jogos_inter2012_finais_apsp_atletismo_feminino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_atletismo_masculino` AS apcef_sp_jogos_inter2012_finais_apsp_atletismo_masculino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_natacao_absoluto_feminino` AS apcef_sp_jogos_inter2012_finais_apsp_natacao_absoluto_feminino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_natacao_absoluto_masculino` AS apcef_sp_jogos_inter2012_finais_apsp_natacao_absoluto_masculino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_natacao_master_feminino` AS apcef_sp_jogos_inter2012_finais_apsp_natacao_master_feminino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_natacao_master_masculino` AS apcef_sp_jogos_inter2012_finais_apsp_natacao_master_masculino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_corrida_5km_feminino` AS apcef_sp_jogos_inter2012_finais_apsp_corrida_5km_feminino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_corrida_5km_masculino` AS apcef_sp_jogos_inter2012_finais_apsp_corrida_5km_masculino,"
+ " apcef_sp_jogos_inter2012_finais.`apsp_observacao` AS apcef_sp_jogos_inter2012_finais_apsp_observacao"
+ " FROM"
+ " `apcef_sp_jogos_inter2012_finais` apcef_sp_jogos_inter2012_finais";
ITransactionJdbc daoTransactionJdbc = (ITransactionJdbc) transaction;
Connection connection = daoTransactionJdbc.getConnection();
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
} catch (SQLException e1) {
e1.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (Exception e) {
}
try {
if (connection != null) {
connection.close();
}
} catch (Exception e) {
}
}
}
}
e
package br.org.fenae.service.apcefspjogosintegracao2012finais;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lumis.portal.PortalException;
import lumis.portal.transaction.PortalTransactionFactory;
import lumis.util.ITransaction;
import lumis.util.log.ILogger;
import lumis.util.log.LoggerFactory;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
public class DownloadRelatorio {
private static ILogger logger = LoggerFactory.getLogger(DownloadRelatorio.class);
/** Identificador do contéudo a ser baixado alocado na sessão * */
HttpServletRequest request;
HttpServletResponse response;
private String id;
private String relName;
private String relType;
private ITransaction transaction;
private JasperPrint jasperPrint;
private String nameRel[] = null;
public DownloadRelatorio(HttpServletRequest request, HttpServletResponse response) throws PortalException {
this.request = request;
this.response = response;
id = request.getParameter("id");
// Referencia o objeto Excel presente na sessão
relName = (String) request.getSession().getAttribute("relName");
nameRel = relName.split("jasper/");
relType = (String) request.getSession().getAttribute("relType");
}
/**
* Carrega e efetuada o download do arquivo
*
* @throws PortalException
*/
public void gerarRelatorio() throws PortalException {
try {
try {
transaction = PortalTransactionFactory.getTransaction();
transaction.begin();
Map parameters = null;
jasperPrint = JasperFillManager.fillReport(id, parameters);
outPutReport(jasperPrint);
transaction.dispose();
} catch (Exception e) {
throw new PortalException(e.getMessage());
}
} finally {
request.getSession().removeAttribute(id);
request.getSession().removeAttribute("relName");
request.getSession().removeAttribute("relType");
request.getSession().removeAttribute("parametros");
}
}
private void outPutReport(JasperPrint jasperPrint) throws IOException, JRException {
JRExporter exporter;
exporter = new JRPdfExporter();
response.setContentType("application/pdf");
response.addHeader("content-disposition", "attachment; filename=report.pdf");
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, response.getOutputStream());
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
}
}
Preciso, que quando clicar no botão o PDF é renderizado na tela, o usuário pode imprimir ou salvar. A dificuldade é como fazer isso. Entedeu?
Grato.