ドキュメントビュー(PDF/Excel)


14.6.ドキュメントビュー(PDF/Excel)
14.6.1.概要
モデルデータの出力を見るユーザーにとって、HTMLページを返すのは必ずしも最善の方法ではありません.Springは、モデルデータに基づいてPDFドキュメントまたはExcelスプレッドシートを動的に出力する作業を簡略化します.これらのドキュメントは、サーバから適切なコンテンツタイプでストリームとして出力され、それに応じてクライアントPCでPDFまたはスプレッドシートブラウザが起動される最終ビューである(所望).
Excelビューを使用するには、classpathに「poi」ライブラリを追加する必要があります.PDFを使うにはiTextが必要です.jar. Springのメインリリースパッケージに含まれています.
14.6.2.構成とインストール
ドキュメントベースのビューは、XSLTビューの処理とほぼ同じです.以下では、XSLTの例のコントローラが同じモデルデータをレンダリングするためにどのように使用され、PDFまたはExcel出力がそれぞれ生成されるかについて説明します(出力ドキュメントはOpenOfficeで閲覧および編集できます).
14.6.2.1.ドキュメントビュー定義
まず、viewを修正します.properties(または等価なxmlファイル)では、2つのドキュメントタイプのビュー定義を追加します.ファイル全体がこのように見えます.
home.class=xslt.HomePage
home.stylesheetLocation=/WEB-INF/xsl/home.xslt
home.root=words

xl.class=excel.HomePage

pdf.class=pdf.HomePage

スプレッドシートテンプレートにモデルデータを追加する場合は、ビュー定義で「url」プロパティのファイル位置を指定できます.
14.6.2.2.コントローラコード
ここで用いるコントロールコードは,ビュー名以外はXSLT例と全く同じである.もちろん、URLパラメータや他の方法でビュー名を選択するより賢い方法があるかもしれません.これは、Spirngがコントローラとビューのデカップリングにおいて確かに優れていることを証明しています.
14.6.2.3.Excelビューサブクラス
XSLTの例と同様に、ドキュメントを出力する動作を実現するために、適切な抽象クラスから特定のクラスを拡張する必要があります.Excelにとって、これはorgを作成することを意味します.springframework.web.servlet.view.document.AbstraactExcelView(POI使用)またはorg.springframework.web.servlet.view.document.AbstraactJExcelView(JExcelApiを使用)のサブクラスであり、buildExcelDocumentメソッドを実装します.
次の段落は、POIを使用してExcelビューを生成する完全なコードです.モデルデータから語のリストを取得し、スプレッドシートの1番目の欄に連続する行として表示します.
package excel;

// imports omitted for brevity

public class HomePage extends AbstractExcelView {

    protected void buildExcelDocument(
        Map model,
        HSSFWorkbook wb,
        HttpServletRequest req,
        HttpServletResponse resp)
        throws Exception {
    
        HSSFSheet sheet;
        HSSFRow sheetRow;
        HSSFCell cell;

        // Go to the first sheet
        // getSheetAt: only if wb is created from an existing document
        //sheet = wb.getSheetAt( 0 );
        sheet = wb.createSheet("Spring");
        sheet.setDefaultColumnWidth((short)12);

        // write a text at A1
        cell = getCell( sheet, 0, 0 );
        setText(cell,"Spring-Excel test");

        List words = (List ) model.get("wordList");
        for (int i=0; i < words.size(); i++) {
            cell = getCell( sheet, 2+i, 0 );
            setText(cell, (String) words.get(i));

        }
    }
}

 
これはJExcelApiを使用したバージョンで、同じExcelファイルを生成します.
package excel;
				
// imports omitted for brevity

public class HomePage extends AbstractExcelView {

    protected void buildExcelDocument(Map model,
        WritableWorkbook wb,
        HttpServletRequest request,
        HttpServletResponse response)
    throws Exception {
			
        WritableSheet sheet = wb.createSheet("Spring");

        sheet.addCell(new Label(0, 0, "Spring-Excel test");
		
        List words  = (List)model.get("wordList");
        for (int i = -; i < words.size(); i++) {
            sheet.addCell(new Label(2+i, 0, (String)words.get(i));
        }
    }
}

 
これらのAPI間の違いに注意してください.JExcelApiはより直感的で画像処理に優れていることが分かった.ただし、JExcelApiを使用して大きなファイルを処理する場合、メモリの問題もあります.
コントロールのコードを変更してxlという名前のビューに戻すと、アプリケーションを再実行すると、同じページを要求すると、Excelスプレッドシートが作成され、自動的にダウンロードが開始されることがわかります.
14.6.2.4.PDFビューサブクラス
PDFバージョンの語リストを作成すると簡単になります.今、orgを作成します.springframework.web.servlet.view.document.AbstraactPdfViewのサブクラスは、以下のようにbuildPdfDocument()メソッドを実装します.
package pdf;

// imports omitted for brevity

public class PDFPage extends AbstractPdfView {

    protected void buildPdfDocument(
        Map model,
        Document doc,
        PdfWriter writer,
        HttpServletRequest req,
        HttpServletResponse resp)
        throws Exception {
        
        List words = (List) model.get("wordList");
        
        for (int i=0; i<words.size(); i++)
            doc.add( new Paragraph((String) words.get(i)));
    
    }
}

同様に、コントロールを変更し、pdfという名前のビューを返すようにします(return new ModelAndView(「pdf」,map);).アプリケーションを実行して同じURLを要求すると、モデルデータの各語をリストするPDFドキュメントが開きます.