Friday, February 29, 2008

Using Jasper Reports with Visual Web Pack

This tutorial illustrates the use of Jasper Reports with a Visual Web Pack application.
Register Jasper Reports library
Use the NetBeans Library Manager to create a library for the Jasper Reports class libraries. You need at least the following files from the distribution:
• dist/jasperreports-.jar
• lib/commons-beanutils-1.7.jar
• lib/commons-collections-2.1.jar
• lib/commons-digester-1.7.jar
• lib/commons-logging-1.0.2.jar
• lib/itext-1.3.1.jar
Register Jasper Reports image servlet
The image servlet is needed if you want html rendered reports (also without any graphical elements, because report placeholders uses images from this servlet). So you must register it in the web.xml configuration file. You can use the NetBeans web.xml editor to do so.
Servlet name : ImageServlet
Servlet class : net.sf.jasperreports.j2ee.servlets.ImageServlet
URL : /image
Insert methods for report output to application bean
The following methods in the application bean can be used to output a precompiled report as html or pdf. In this sample a collection of java objects is used as data source. For other data sources see the Jasper Reports documentation.
/**
* Output Jasper Report
*
* @param filename Precompiled report filename
* @param type Content type of report ("application/pdf" or "text/html")
* @param data Collection of value objects
*/
public void jasperReport( String filename, String type, Collection data ) {
jasperReport( filename, type, data, new HashMap() );
}

/**
* Output Jasper Report
*
* @param filename Precompiled report filename
* @param type Type of report ("application/pdf" or "text/html")
* @param data Collection of value objects
* @param params Map with parameters
*/
public void jasperReport( String filename, String type, Collection data, Map params ) {
final String[] VALID_TYPES = { "text/html", "application/pdf" };
// First check if type is supported
boolean found = false;
for ( int i = 0; i < VALID_TYPES.length; i++ ) {
if ( VALID_TYPES[i].equals( type ) ) {
found = true;
break;
}
}

if ( !found ) {
throw new IllegalArgumentException( "Report type '" + type + "' not supported." );
}

// InputStream for compiled report
ExternalContext econtext = getExternalContext();
InputStream stream = econtext.getResourceAsStream( filename );

if ( stream == null ) {
throw new IllegalArgumentException( "Report '" + filename + "' could not be opened." );
}

// Use collection as data source
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource( data );
JasperPrint jasperPrint = null;

try {
jasperPrint = JasperFillManager.fillReport( stream, params, ds );
} catch ( RuntimeException e ) {
throw e;
} catch ( Exception e ) {
throw new FacesException( e );
} finally {
try {
stream.close();
} catch ( IOException e ) {
}
}

// Configure exporter and set parameters
JRExporter exporter = null;
HttpServletResponse response = (HttpServletResponse) econtext.getResponse();
FacesContext fcontext = FacesContext.getCurrentInstance();

try {
response.setContentType( type );

if ( "application/pdf".equals( type ) ) {
exporter = new JRPdfExporter();
exporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
exporter.setParameter( JRExporterParameter.OUTPUT_STREAM,
response.getOutputStream() );
} else if ( "text/html".equals( type ) ) {
exporter = new JRHtmlExporter();
exporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
exporter.setParameter( JRExporterParameter.OUTPUT_WRITER, response.getWriter() );
HttpServletRequest request = (HttpServletRequest)
fcontext.getExternalContext().getRequest();
request.getSession().setAttribute(
ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint );
exporter.setParameter( JRHtmlExporterParameter.IMAGES_MAP, new HashMap() );
exporter.setParameter(
JRHtmlExporterParameter.IMAGES_URI,
request.getContextPath() + "/image?image=" );
}
} catch ( RuntimeException e ) {
throw e;
} catch ( Exception e ) {
throw new FacesException( e );
}

// Export report
try {
exporter.exportReport();
} catch ( RuntimeException e ) {
throw e;
} catch ( Exception e ) {
throw new FacesException( e );
}

// Tell JavaServer faces that no more processing is necessary
fcontext.responseComplete();
}
Start report output from page bean
The output of a report can initiated from a ActionEvent with the following code:
try {
getApplicationBean().jasperReport(
"/reports/report.jasper",
"application/pdf",
getSessionBean().getSuchergebnisDataProvider().getList() );
} catch ( Exception e ) {
Logger.getLogger(getClass().getName()).severe( e.getMessage() );

No comments: