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-<version>.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() );
}

return null;

NetBeans CVS access with SSH

If your ssh key is secured with a password you need to run a ssh agent (e.g. PuTTY agent) on your client machine, because NetBeans has no support for ssh passwords.

Enter your CVS_ROOT in the following syntax:

:ext:<user>@<host>:<path-to-cvsroot>

You must use external shell command to execute ssh, e.g. for Putty under windows environment:

C:\Program files\Putty\plink.exe -ssh -i <path-to-ssh-keyfile>

Postfix setup for SSL and TLS

To use SSL and TLS with the postfix mailer daemon you must change settings in the /etc/postfix/main.cf configuration file:

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_CAfile = /etc/postfix/ssl/demoCA/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/server-crt.pem
smtpd_tls_key_file = /etc/postfix/ssl/server-key.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
tls_random_prng_update_period = 3600s

You also need a SSL certificate for your mail server. Create it with the following commands:

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/

# Create new local certification authority (if not already present)
/usr/share/ssl/misc/CA.pl -newca

# Create RSA certificate
openssl req -new -nodes -keyout server-key.pem -out server-req.pem -days 365
openssl ca -out server-crt.pem -infiles server-req.pem
chmod 644 server-crt.pem demoCA/cacert.pem
chmod 400 server-key.pem

Now you must remove the comment mark “#” for SMTPS and TLS manager in the /etc/postfix/master.cf configuration file:

smtps     inet  n       -       n       -       -       smtpd -o smtpd_tls_wrappermode=yes
tlsmgr    unix  -       -       n       1000?   1       tlsmgr

Center VWP components

There isn’t any standard function in the Visual Web Pack to center components on the page. You can only use absolute or flow layout.

If you want center your components horizontally or vertically, you need CSS. This is done with the style setting of your component.

position: absolute;
left: 50%;
top: 50%;

This setting would center the left upper corner of your component on the page, but not the whole component. To center the whole component you must adjust the margins. The margins can be negative, so substract the half of the vertical and horizontal size from the corresponding margin. In this sample assume that the component has a height of 100 pixels and a width of 200 pixels.

position: absolute;
left: 50%;
top: 50%;
margin-top: -50px;
margin-left: -100px;

IMAP server setup under SuSE Linux

First you must install the UW-Imap daemon with yast. UW-Imap uses the standard mail folder structure from Linux, so no additional configuration is needed.

Create SSL certificates

The certificates are stored in folder /etc/ssl/certs. Change to this directory:

cd /etc/ssl/certs

Now create the certificates for your system with the following command:

openssl req -new -x509 -nodes -out imapd.pem -keyout imapd.pem -days 365

You are asked about country name (2 letter code), state or province Name (full name), locality name (eg, city), organization name (eg, company), organizational unit name (eg, section), common name (eg, your name) and email address.

For «common name» you must enter the full DNS or IP address of your system ! If your system has more than one DNS name or IP addresses you must generate an own certificate for each DNS name or IP address.

Configuration of xinetd

Open the file /etc/xinetd.d/imap with a editor of your choice.

$EDITOR /etc/xinetd.d/imap

Add the section imaps if it doesn’t already exists:

service imaps
{
  disable         = no
  socket_type     = stream
  protocol        = tcp
  wait            = no
  user            = root
  server          = /usr/sbin/imapd
  flags           = IPv4
}

Save the changes and restart xinetd with the command

rcxinetd restart