FeaturesPluginsDocs & SupportCommunityPartners

>> Visual Web Pack のほかのドキュメント

Web アプリケーションからのレポートと PDF の生成

2007 年 5 月 [Revision number: V5.5.1-1]    

Web アプリケーションからレポート、グラフ、または PDF ファイルを生成する必要がある場合、オープンソースの JasperReports フレームワークなど、作業を行うのに役立つ他社製品が数多くあります。JasperReports は、レポートを HTML、PDF、XLS、CSV、および XML 形式のレポートを出力する、レポート作成ツールです。このチュートリアルは、JasperReports フレームワークを、NetBeans Visual Web Pack を使用して構築した Web アプリケーションに統合する方法を示します。

このチュートリアルでは、Travel データベースから情報を表示して印刷する Web アプリケーションを作成します。Web アプリケーションを使用すると、旅行レポートを HTML 形式または PDF 形式で表示できます。

目次

JasperReports ライブラリの作成
JRXML 編集環境の設定
プロジェクトの作成
レポートリソースの設定
JasperReports ImageServlet のマッピング
レポート生成ロジックの追加
データベースクエリーの作成
旅行レポートページの作成
  このページの情報は NetBeans 5.5 および 5.5.1 の Visual Web Pack が対象です。

JavaServer Faces コンポーネント /
Java EE プラットフォーム
動作可能Java EE 5* の場合、1.2
動作可能J2EE 1.4 の場合、1.1
Travel データベース 必須必須
BluePrints AJAX コンポーネントライブラリ 任意任意

* このチュートリアルの公開時点で Java EE 5 をサポートしていたのは Sun Java System Application Server だけです。

このチュートリアルは、Sun Java System Application Server PE 9.0 Update Release 1 と Tomcat 5.5.17 を使用することを想定しています。別のサーバーを使用している場合は、「リリースノート」と「FAQ」(または「日本語 FAQ」) で既知の問題やその回避策を確認してください。サポートされているサーバーと Java EE プラットフォームについては、「リリースノート」を参照してください。

JasperReports ライブラリの作成

プロジェクトの構築を始める前に、IDE の「ライブラリマネージャー」を使用して、JasperReports Java レポートライブラリ をどのプロジェクトからも簡単に使用できるようにします。
  1. http://www.jasperforge.org から jasperreports-1.3.0-project.zip をダウンロードし、ファイルを展開します。zip ファイルをダウンロードするには、JasperForge にユーザー登録する必要があります。

    注: このチュートリアルの例では、JasperReports 1.3.0 およびこのバージョンで提供される、関連する JAR ファイルを使用します。違うバージョンを使用している場合は、JAR ライブラリ名およびバージョン番号が異なる場合があります。また、追加する JAR ライブラリのリストも違うことがあります。
  2. IDE で、メインメニューから「ツール」>「ライブラリマネージャー」を選択します。
  3. 「新規ライブラリ」をクリックし、「ライブラリ名」テキストボックスに「JasperReports130」と入力して「了解」をクリックします。
  4. 「JAR/フォルダを追加」をクリックして、jasperreports-1.3.0-project.zip ファイルを展開したディレクトリに移動します。
  5. dist ディレクトリに移動し、jasperreports-1.3.0.jar を選択して Enter キーを押します。
  6. ふたたび「JAR/フォルダを追加」をクリックして、../lib ディレクトリに移動します (1 つ上のディレクトリへ移動して、その下の lib ディレクトリへ移動)。
  7. Ctrl キーを押しながら、次の JAR ファイルをクリックして選択し、Enter キーを押します。1.3.0 以外のバージョンを使用している場合は、JasperForge の Web サイトで、選択する JAR ファイルを確認します。

    • commons-beanutils-1.7.jar
    • commons-collections-2.1.jar
    • commons-digester-1.7.jar
    • commons-logging-1.0.2.jar
    • itext-1.3.1.jar
    これらは JasperReports フレームワークを使用する Web アプリケーションに必要な、最小限のライブラリです。さらに高度な機能を使用するには、その他のライブラリの追加が必要になることがあります。たとえば、サブレポート機能を使用している場合、commons-javaflow-20060411.jar を追加する必要がある場合があります。
  8. 次の図に示すように、6 つのライブラリを追加したことを確認します。

    図 1:JasperReports130 ライブラリを表示した「ライブラリマネージャ−」ウィンドウ
    図 1:JasperReports130 ライブラリを表示した「ライブラリマネージャー」ウィンドウ
  9. Java エディタで JavaReports Javadoc を使用可能にするには、Javadoc タブをクリックし、「ZIP/フォルダを追加」をクリックして、jasperreports-1.3.0-project.zip ファイルを展開したディレクトリに移動したあと、dist/javadoc サブディレクトリを選択して Enter キーを押します。
  10. (省略可能) デバッグセッション中に JasperReport クラスにステップインするには、「ソース」タブをクリックし、「JAR/フォルダを追加」をクリックして、jasperreports-1.3.0-project.zip ファイルを展開したディレクトリに移動したあと、src サブディレクトリを選択して Enter キーを押します。
  11. 「了解」をクリックしてライブラリマネージャーを閉じます。

JRXML 編集環境の設定

JavaReport テンプレートを XML 形式で記述します。IDE のエディタが JavaReport XML ファイル (JRXML) を XML ファイルとして認識できるようにするには、次の図に示すように、「オプション」ダイアログを使用して、jrxml を XML オブジェクトの「拡張子と MIME タイプ」プロパティーに追加します。

図 2:XML オブジェクトへの JRXML ファイルの関連付け
図 2:XML オブジェクトへの JRXML ファイルの関連付け
  1. 「ツール」>「オプション」を選択し、「オプション」ダイアログを開きます。
  2. 「詳細オプション」をクリックします。
  3. 「IDE 構成」>「システム」>「オブジェクトの種類」の順に展開して、「XML オブジェクト」を選択します (「XML スキーマ」ではない)。
  4. 「拡張子と MIME タイプ」プロパティーの省略符号 (...) ボタンをクリックし、カスタマイザエディタを開きます。
  5. 「項目」テキストボックスに「jrxml」と入力し、「追加」をクリックします。
  6. 「了解」をクリックして、さらに「オプション」ダイアログを閉じます。

プロジェクトの作成

次の手順に従い、プロジェクトを作成し、設定します。
  1. 「実行時」ウィンドウで、「データベース」ノードを展開します。
  2. Travel データベースの jdbc ノードを右クリックし、ポップアップメニューから「接続」を選択します。

    Travel データベースが使用できない場合は、「NetBeans Visual Web Pack 5.5 インストール」の「構成情報」の節を参照してください。
  3. 「接続」ダイアログが表示されたら、パスワードに「travel」と入力して、「セッション中はパスワードを保存」を選択します。
  4. IDE のメインメニューから「ファイル」>「新規プロジェクト」を選択します。
  5. 「新規プロジェクト」ウィザードで、「カテゴリ」リストから「Web」を選択し、「プロジェクト」リストから「Visual Web アプリケーション」を選択します。
  6. 「次へ」をクリックします。
  7. プロジェクトの名前を「TravelReport」にします。
  8. 必要なサーバーと Java EE のバージョンを選択し、「完了」をクリックします。

    ビジュアルデザイナーに最初のページ (Page1) が表示された状態でプロジェクトが開きます。

    Sun Java System Application Server 以外のサーバーを使用している場合は、そのサーバーでデータベースドライバを使用可能にする必要があります。詳細は、インストールガイドの「ビジュアル Web プロジェクトの構成」の節を参照してください。

  9. 「プロジェクト」ウィンドウで、「TravelReport」>「ライブラリ」を右クリックし、「ライブラリを追加」を選択します。
  10. 次の図に示すように、「ライブラリを追加」ウィンドウで「JasperReports130」を選択し、「ライブラリを追加」をクリックします。

    図 3:JasperReports126 ライブラリの追加
    図 3:JasperReports130 ライブラリの追加

レポートリソースの設定

この節では、画像のディレクトリを追加して、そのディレクトリに企業のロゴを配置します。次に、旅行レポート用の JRXML テンプレートを追加して、その JRXML テンプレートが Jasper バイナリレポートテンプレートにコンパイルされるように、プロジェクトの構築ファイルを変更します。

JRXML テンプレートは、次の図に示すようなレポートを生成します。

図 4:旅行レポート
図 4:旅行レポート
  1. 「プロジェクト」ウィンドウで「Web ページ」を展開します。
  2. 「resources」ノードを右クリックし、「新規」>「フォルダ」を選択します。
  3. 「フォルダ名」テキストボックスに「images」と入力し、Enter キーを押します。
  4. 次の画像を右クリックしてブラウザのコマンドを使用し、画像をディスクに保存します。 画像を <Web プロジェクトへのパス>/TravelReport/web/resosurces/images フォルダに保存します。

    図 1:Hibernate ライブラリを表示した「ライブラリマネージャ−」ウィンドウ
    図 5:企業のロゴ
  5. 「プロジェクト」ウィンドウの横に表示される「ファイル」タブをクリックし、「ファイル」ウィンドウを表示します。
  6. 「ファイル」ウィンドウで「TravelReport」を展開します。
  7. 「src」ノードを右クリックし、「新規」>「フォルダ」を選択します。
  8. 「フォルダ名」テキストボックスに「reports」と入力します。
  9. 親フォルダが src に設定されていることを確認して、Enter キーを押します。
  10. 「ファイル」ウィンドウで「TravelReport」を右クリックし、「プロパティー」を選択します。
  11. 「カテゴリ」区画で「ソース」を選択します。
  12. 「ソースパッケージフォルダ」の一覧の右側に表示される、「フォルダを追加」ボタンをクリックします。
  13. 「src」フォルダに移動し、「reports」を選択して、「開く」をクリックします。
  14. 「src/reports」行の「ラベル」テキストボックスで、値を「JasperReports の定義」に変更して Enter キーを押します。

    Enter キーを押さないと、IDE によって変更内容が保存されません。
  15. 「了解」をクリックします。
  16. 「プロジェクト」タブをクリックして、「<デフォルトパッケージ>」サブノードを持つ新しい「JasperReports の定義」ノードを確認します。

    次の手順で、このデフォルトパッケージにレポートの定義を配置します。あとで、構築スクリプトを変更して、このフォルダのレポート定義を build/web/WEB-INF/reports フォルダにコンパイルして、ApplicationBean1 の実行時コードがその場所からレポート定義を検出できるようにします。
  17. 「JasperReports の定義」ノードを右クリックし、「新規」>「ファイル/フォルダ」を選択します。
  18. 「カテゴリ」区画の「その他」を選択し、「ファイルの種類」区画で「空のファイル」を選択して、「次へ」をクリックします。
  19. 「ファイル名」テキストボックスに「TripReportByPerson.jrxml」と入力し、Enter キーを押します。新しいファイルが XML エディタで開きます。
  20. 次の XML タグをコピーして、空の XML ファイルにペーストします。

    コード例 1:JasperReport テンプレートの TripReportByPerson.jrxml
    <?xml version="1.0"?>
    <!DOCTYPE jasperReport
      PUBLIC "-//JasperReports//DTD Report Design//EN"
      "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
    <jasperReport name="TripReportByPerson">
    
    <style name="Arial_Normal" isDefault="true" fontName="Arial" fontSize="12"
      isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"
      pdfFontName="Helvetica" pdfEncoding="Cp1252" isPdfEmbedded="false"/>
    <style name="Arial_Bold" fontName="Arial" isDefault="false"  isBold="true"
      pdfFontName="Helvetica-Bold"/>
    <style name="Arial_Header1"  fontName="Arial" isDefault="false" fontSize="22"
      isBold="true" pdfFontName="Helvetica-Bold"/>
    
    <style name="Arial_Bold_White" fontName="Arial" forecolor="white"
      isDefault="false" fontSize="12" isBold="true" pdfFontName="Helvetica-Bold"/>
    
    <parameter name="LogoURL" class="java.net.URL"/>
    
    <field name="NAME" class="java.lang.String"/>
    <field name="TRIPID" class="java.lang.Integer"/>
    <field name="DEPDATE" class="java.util.Date"/>
    <field name="DEPCITY" class="java.lang.String"/>
    <field name="DESTCITY" class="java.lang.String"/>
    <field name="DESCRIPTION" class="java.lang.String"/>
    
    <group name="PersonGroup" minHeightToStartNewPage="84">
      <groupExpression>
      <![CDATA[$F{NAME}]]>
      </groupExpression>
      <groupHeader>
        <band height="64">
          <textField>
            <reportElement style="Arial_Bold" mode="Opaque" x="0" y="24"
              width="550" height="15" backcolor="#e0e0e0" />
            <textFieldExpression class="java.lang.String">
              <![CDATA["Scheduled Trips for " + $F{NAME}]]>
            </textFieldExpression>
          </textField>
        <line>
          <reportElement x="0" y="39" width="550" height="1" />
          <graphicElement />
        </line>
        <frame>
          <reportElement x="0" y="40" width="550" height="20"
            mode="Opaque" backcolor="lightGray"/>
          <staticText>
            <reportElement style="Arial_Bold_White" x="20" y="2" width="130" height="15"  />
            <text><![CDATA[Departure Date]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White" x="150" y="2" width="130" height="15"  />
            <text><![CDATA[Departure City]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White"  x="280" y="2" width="130" height="15" />
            <text><![CDATA[Destination City]]></text>
          </staticText>
          <staticText>
            <reportElement style="Arial_Bold_White" x="410" y="2" width="130" height="15" />
            <textElement textAlignment="Left" />
            <text><![CDATA[Purpose]]></text>
          </staticText>
          </frame>
        </band>
      </groupHeader>
    </group>
    
    <pageHeader>
      <band height="94">
        <image>
          <reportElement x="0" y="0" width="441" height="60"/>
          <graphicElement/>
          <imageExpression class="java.net.URL">
            <![CDATA[$P{LogoURL}]]>
          </imageExpression>
        </image>
        <line>
          <reportElement x="0" y="60" width="550" height="1"/>
          <graphicElement/>
        </line>
        <staticText>
          <reportElement style="Arial_Header1" x="0" y="60" width="445" height="30" />
          <text><![CDATA[Trip Report by Employee]]></text>
        </staticText>
      </band>
    </pageHeader>
    
    <detail>
      <band height="20">
        <textField pattern="dd/MM/yyyy">
          <reportElement x="20" y="0" width="100" height="20"/>
          <textFieldExpression class="java.util.Date">
            <![CDATA[$F{DEPDATE}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="150" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DEPCITY}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="280" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DESTCITY}]]>
          </textFieldExpression>
        </textField>
        <textField isBlankWhenNull="true">
          <reportElement x="410" y="0" width="100" height="20"/>
          <textFieldExpression class="java.lang.String">
            <![CDATA[$F{DESCRIPTION}]]>
          </textFieldExpression>
        </textField>
      </band>
    </detail>
    </jasperReport>
  21. ファイルを閉じて保存します。
  22. 「ファイル」ウィンドウで、「TravelReport」を展開し、build.xml をダブルクリックして編集領域に開きます。
  23. 次のスクリプトを </project> タグの前に追加します。

    スクリプトによって、Java ソースをコンパイルしたあとに IDE が呼び出す -post-compile ターゲットがオーバーライドされます。ターゲットスクリプトは src/reports フォルダ内で検出した任意の JRXML ファイルをコンパイルし、コンパイルしたレポートを build/WEB-INF/reports フォルダに配置します。

    コード例 2:build.xml レポートコンパイルスクリプト
        <!-- Customize the following property to point to the folder
             in which you unpacked your Jasper Reports release -->
        <property name="jrc.home"
                  value="JasperReports-Install-Dir/jasperreports-1.3.0"/>
        <!-- Define the classpath used for report compilation -->
        <path id="jrc.classpath">
            <fileset dir="${jrc.home}/dist"
                         includes="*.jar"/>
            <fileset dir="${jrc.home}/lib"
                         includes="*.jar"/>
        </path>
        <!-- Define the custom Ant task that compiles report definitions -->
        <taskdef name="jrc"
                 classname="net.sf.jasperreports.ant.JRAntCompileTask">
            <classpath refid="jrc.classpath"/>
        </taskdef>
        <!-- Define the target that will compile reports, after Java compiles
             have been completed -->
        <target name="-post-compile"
                        description="Compile all Jasper Reports Definitions">
            <!-- Create the output directory first -->
            <mkdir dir="${build.web.dir}/WEB-INF/reports"/>
            <!-- Compile report definition -->
            <jrc srcdir="src/reports"
                      destdir="${build.web.dir}/WEB-INF/reports">
                <classpath
                    refid="jrc.classpath"/>
                <include
                    name="*.jrxml"/>
            </jrc>
            <!-- Omit the report definition sources from the webapp -->
            <delete>
                <fileset dir="${build.web.dir}/WEB-INF/classes"
                         includes="*.jrxml"/>
            </delete>
        </target>
    
  24. jrc.home プロパティーの値 (「JasperReports-Install-Dir」) を、JasperReports.zip ファイルを展開したフォルダを参照するように変更します。
  25. ファイルを閉じて保存します。
  26. 「構築」>「主プロジェクトを」構築を選択して、build.xml スクリプトを呼び出します。
  27. 「ファイル」ウィンドウで、「build」>「web」>「WEB-INF」>「レポート」の順に展開し、IDE によって TripReportByPerson.jasper バイナリが生成されたことを確認します。

    「出力」ウィンドウに構築エラーがある場合、またはバイナリが生成されていなかった場合は、build.xml ファイルの jrc.home プロパティーが正しく設定されているか確認します。

JasperReports ImageServlet のマッピング

JasperReports フレームワークには、生成された HTML レポートに画像を表示するための ImageServlet という名前のサーブレットが含まれています。レポートに画像が含まれていない場合でも、JasperReports は間隔に空白画像を使用するため、このサーブレットのマッピングを追加する必要があります。

次の手順に従い、ImageServlet に画像 URI をマップできます。画像 URI は、あとでレポートを HTML にエクスポートするためのコードを追加するときに使用します。
  1. 「ファイル」ウィンドウで、「web」>「WEB-INF」を展開し、web.xml ノードをダブルクリックして XML エディタで開きます。

    「web」>「WEB-INF」の下の web.xml ファイルを編集していることを確認してください。「build」>「web」>「WEB-INF」の下のファイルではありません。「build」>「web」>「WEB-INF」の下の web.xml を編集すると、次にプロジェクトを構築するときに、変更内容が失われます。
  2. 編集ツールバーで、「サーブレット」をクリックしてサーブレットエディタを開きます。
  3. サーブレットエディタで、「サーブレット要素を追加」をクリックします。

    次の図に示すように、「サーブレットを追加」ダイアログが表示されます。

    図 5:「サーブレットを追加」ダイアログ 図 6:「サーブレットを追加」ダイアログ
  4. 「サーブレットを追加」ダイアログで次の値を入力し、「了解」をクリックします。

    テキストボックス
    サーブレット名   ImageServlet
    サーブレットクラス   net.sf.jasperreports.j2ee.servlets.ImageServlet
    URL パターン   /image
  5. web.xml を閉じて変更を保存します。

    これでアプリケーションは、画像にアドレスされた要求を受け取ると、その要求を ImageServlet インスタンスに送信する必要があることを認識するようになります。

レポート生成ロジックの追加

次の手順に従って、レポートを生成するロジックをアプリケーション Bean に追加します。
  1. 「プロジェクト」ウィンドウで、「アプリケーション Bean」ノードをダブルクリックし、編集領域で ApplicationBean1.java を開きます。
  2. ファイルの末尾、最後の終了中括弧の前に、次のコードを追加します。

    コード例 3:レポート生成コード
    /**
     * <p>Prefix to the resource name for compiled reports.</p>
     */
    private static final String PREFIX = "/WEB-INF/reports/";
    
    
    /**
     * <p>Suffix to the resource name for compiled reports.</p>
     */
    private static final String SUFFIX = ".jasper";
    
    
    /**
     * <p>Valid content types for reports that we can produce.</p>
     */
    private static final String[] VALID_TYPES =
    { "text/html",            // Standard HTML representation
      "application/pdf",      // Adobe Portable Document Format
    };
    
    
    /**
     * <p>Generate the specified report, in the specified output
     * format, based on the specified data.</p>
     *
     * @param name Report name to be rendered
     * @param type Content type of the requested report ("application/pdf"
     *  or "text/html")
     * @param data <code>ResultSet</code> containing
     *  the data to report
     *
     * @exception IllegalArgumentException if the specified
     *  content type is not recognized
     * @exception IllegalArgumentException if no compiled report definition
     * for the specified name can be found
     */
    public void jasperReport(String name, String type,
                             ResultSet data) {
        jasperReport(name, type, data, new HashMap());
    }
    
    /**
     * <p>Generate the specified report, in the specified output
     * format, based on the specified data.</p>
     *
     * @param name Report name to be rendered
     * @param type Content type of the requested report ("application/pdf"
     *  or "text/html")
     * @param data <code>ResultSet</code> containing the data to report
     * @param params <code>Map</code> of additional
     *   report parameters
     *
     * @exception IllegalArgumentException if the specified
     *  content type is not recognized
     * @exception IllegalArgumentException if no compiled report definition
     * for the specified name can be found
     */
    public void jasperReport(String name, String type,
            ResultSet data, Map params) {
    
        // Validate that we recognize the report type
        // before potentially wasting time filling the
        // report with data
        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("Invalid report type '"
                    + type
                    + "' requested");
        }
    
        // Look up the compiled report design resource
        ExternalContext econtext = getExternalContext();
        InputStream stream = econtext.getResourceAsStream(PREFIX + name
                    + SUFFIX);
        if (stream == null) {
            throw new IllegalArgumentException("Unknown report name '"
                    + name
                    + "' requested");
        }
    
        try {
            data.beforeFirst();
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Fill the requested report with the specified data
        JRResultSetDataSource ds = new JRResultSetDataSource(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 the exporter to be used, along with the custom
        // parameters specific to the exporter type
        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());
              // Make images available for the HTML output
              HttpServletRequest request =
                (HttpServletRequest)
                fcontext.getExternalContext().getRequest();
              request.getSession().setAttribute(
                ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
                jasperPrint);
              exporter.setParameter(
                JRHtmlExporterParameter.IMAGES_MAP, new HashMap());
              // The following statement requires mapping /image
              // to the imageServlet in the web.xml.
              //
              // This servlet serves up images including the px
              // images for spacing.
              //
              // Serve up the images directly so we
              // don't incur the extra overhead associated with
              // with a JSF request for a non-JSF entity.
              exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
                request.getContextPath() + "/image?image=");
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Enough with the preliminaries ...
        // export the report already
        try {
            exporter.exportReport();
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new FacesException(e);
        }
    
        // Tell JavaServer Faces that no output is required
        fcontext.responseComplete();
    
    }
  3. ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。「インポートを修正」ダイアログで、InputStream クラスの「完全修飾名」フィールドに java.io.InputStream が、また ResultSet クラスの「完全修飾名」フィールドに java.sql.ResultSet が表示されていることを確認します。
  4. 「了解」をクリックします。
  5. ファイルを閉じて保存します。

データベースクエリーの作成

このアプリケーションでは、Web ページ上および生成したレポート内に表示される旅行情報に、同じデータベースクエリーの結果セットを使用します。次の図に示すように、「クエリーエディタ」を使用してデータベースクエリーを設計します。

図 6:TRIP 結果セットのクエリーエディタ設定
図 7:旅行結果セットのクエリーエディタ設定
  1. 編集領域で「Page1」タブをクリックし、ビジュアルデザイナーのページを表示します。
  2. 「実行時」ウィンドウで、「データベース」を展開し、Travel データベースの jdbc ノードを展開してから、「表」を展開します。
  3. 「TRIP」ノードをページの空白部分にドラッグ&ドロップします。
  4. 「アウトライン」ウィンドウで「SessionBean1」を展開し、「tripRowSet」をダブルクリックしてクエリーエディタを開きます。
  5. 最上位の区画の「TRIP」表で、PERSONID、TRIPTYPEID、および LASTUPDATED のチェックボックスを選択解除します。
  6. 「実行時」ウィンドウから「PERSON」ノードをドラッグし、最上位の区画にある「TRIP」の横にドロップします。
  7. 「PERSON」表で、PERSONID、JOBTITLE、FREQUENTFLYER、および LASTUPDATED のチェックボックスを選択解除します。
  8. 「実行時」ウィンドウから「TRIPTYPE」ノードをドラッグし、最上位の区画にある「PERSON」の横にドロップします。
  9. 「TRIPTYPE」表で、TRIPTYPEID、NAME、および LASTUPDATED のチェックボックスを選択解除します。
  10. 「TRAVEL.PERSON」表の「NAME」行で、「ソート方法」列のドロップダウンリストから「昇順」を選択します。

    IDE によって「ソートの順序」が「1」に設定されます。
  11. 「TRAVEL.TRIP」表の「DEPDATE」行で、「ソート方法」列のドロップダウンリストから「昇順」を選択します。

    IDE によって「ソートの順序」が「2」に設定されます。
  12. tripRowSet のクエリーエディタを閉じます。

旅行レポートページの作成

この節では、次の図に示すように、旅行データを表示するために Page1 に表を追加し、さらに、レポートを HTML 形式および PDF 形式で生成するためのボタンを追加します。

図 8:Page1
図 8:Page1
  1. ビジュアルデザイナーで Page1 を表示します。
  2. 「パレット」から「表」コンポーネントをドラッグし、ページにドロップします。
  3. 「表」コンポーネントを右クリックし、ポップアップメニューから「表レイアウト」を選択します。
  4. 「表レイアウト」ダイアログで、「データの入手先」ドロップダウンリストから「tripDataProvider」を選択します。
  5. 「選択」リストの「PERSON.NAME」を選択し、「上へ」ボタンを繰り返しクリックして「PERSON.NAME」をリストの一番上まで移動します。
  6. 「オプション」タブをクリックします。
  7. 「タイトル」テキストボックスに「旅行」と入力します。
  8. 「ページ付けを有効」を選択します。
  9. 「了解」をクリックしてダイアログを閉じます。
  10. 「表」コンポーネントの上に「ボタン」コンポーネントをドロップし、「View Report」と入力して、Enter キーを押します。
  11. 「プロパティー」ウィンドウで、「id」プロパティーを「viewReportBtn」に設定します。
  12. action」プロパティーの省略符号ボタン (...) をクリックし、ドロップダウンリストから「viewReportBtn_action」を選択して「了解」をクリックします。
  13. 「レポートを表示」ボタンの横に「ボタン」コンポーネントをドロップし、「PDF を生成」と入力して、Enter キーを押します。
  14. 「プロパティー」ウィンドウで、「id」プロパティーを「createPdfBtn」に設定します。
  15. action」プロパティーの省略符号ボタン (...) をクリックし、ドロップダウンリストから「createPdfBtn_action」を選択して「了解」をクリックします。
  16. 「レポートを表示」ボタンをダブルクリックして、viewReportBtn_action メソッドの Java ソースを表示します。
  17. viewReportBtn_action メソッドに次の太字のコードを追加します。

    コード例 4:viewReportBtn_action メソッド
        public String viewReportBtn_action() {
            // Free up the rowset resources
            tripDataProvider.close();
            Map fillParams = new HashMap();
            // The above statement generates warnings with Java SE 1.5
            // To eliminate the warnings, replace with the
            // following statement:
            // Map<String, URL> fillParams =
            //   new HashMap<String, URL.>>();
            try {
                fillParams.put
                  ("LogoURL",
                   getExternalContext().getResource("/resources/images/logo.gif"));
                getApplicationBean1().jasperReport
                  ("TripReportByPerson", "text/html",
                   getSessionBean1().getTripRowSet(), fillParams);
            } catch (Exception e) {
                log("Exception generating report", e);
                error("Exception generating report: " + e);
            }
            return null;
        }
    
  18. createPdfBtn_action メソッドまでスクロールし、次のコード (太字部分) を追加します。

    コード例 5:createPdfBtn_action メソッド
        public String createPdfButton_action() {
            // Free up the rowset resources
            tripDataProvider.close();
            Map fillParams = new HashMap();
            try {
                fillParams.put
                  ("LogoURL",
                   getExternalContext().getResource("/resources/images/logo.gif"));
                getApplicationBean1().jasperReport
                  ("TripReportByPerson", "application/pdf",
                   getSessionBean1().getTripRowSet(), fillParams);
            } catch (Exception e) {
                log("Exception generating report", e);
                error("Exception generating report: " + e);
            }
            return null;
        }
    
  19. ソース内で右クリックし、ポップアップメニューから「インポートを修正」を選択します。
  20. メインツールバーで「主プロジェクトを実行」をクリックして、Web アプリケーションを構築、配備、および実行します。
  21. Web アプリケーションで、「レポートを表示」をクリックするとレポートが HTML 形式で表示されます。

    画像が壊れている場合、「web」>「WEB-INF」>「web.xml」を開いて、「ImageServlet」のエントリがあることを確認してください。IDE は、新しく追加したエントリを保存しないことがあります。
  22. 「戻る」ボタンをクリックして「PDF を生成」をクリックすると、レポートが PDF 形式で表示されます。

まとめ

NetBeans Visual Web Pack のプロジェクトから JasperReports フレームワークを使用する手順の概略は次のとおりです。
  1. http://www.jasperforge.org から JasperReports フレームワークをダウンロードして展開します。
  2. 「ライブラリマネージャー」を使用して JasperReports ライブラリを作成します。これにより、 Web アプリケーションに必要な JasperReports JAR ファイルを簡単に追加できます。
  3. JasperReports ライブラリを Web アプリケーションに追加するには、「プロジェクト」ウィンドウで「ライブラリ」ノードを右クリックし、「ライブラリを追加」を選択します。
  4. 「オプション」ダイアログで XML オブジェクトの「拡張子と MIME タイプ」プロパティーを使用して、XML オブジェクトの一覧に jrxml を追加します。これにより、IDE は jrxml ファイルを XML エディタに開くようになります。
  5. web.xml ファイルで net.sf.jasperreports.j2ee.servlets.ImageServlet へのマッピングを追加します。
  6. レポートを生成するロジックをアプリケーション Bean に追加します。
  7. レポートを作成したあと、facesContext.responseComplete() を呼び出して現在の要求ライフサイクルを終了します。
  8. HTML レポートを生成する場合、IMAGES_URI パラメータを使用して ImageServlet クラスの URI を渡します。たとえば、URI を /image に設定した場合、IMAGES_URI パラメータを request.getContextPath() + "/image?image=" と設定します。
  9. レポートを記入するためのデータソースとして、データプロバイダをページに追加するときに IDE が作成するキャッシュされた行セットのような、キャッシュされた行セットを使用できます。レポートを記入する前に、必ずデータプロバイダの close メソッドを呼び出してください。

関連項目:


更新日: 2007 年 5 月 24 日


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by