Spring-MVC/ステップ・バイ・ステップ

2008/04/08からのアクセス回数 13512

PDFを生成するための準備

Spring-MVCでは、ビューの戻り値としてHTML以外にExcelシート、PDF等を サポートしています。

今回は、PDFの生成方法を例に、HTML以外のビュー出力の手順を紹介します。

必要なライブラリの追加

PDFの生成には、iTextを使用します(日本語を使用するには、別途iTextAsian.jarが必要ですが、今回は省略します)

MVN RepositoryでiTextを検索し、以下のdependecyタグをpom.xmlに追加します。

	<dependency>
	  <groupId>com.lowagie</groupId>
	  <artifactId>itext</artifactId>
	  <version>1.4</version>
	</dependency>

いつものように、クラスパスを変更します。

$ rm .project .classpath
$ mvn eclipse:eclipse -DdownloadSources=true

PDF出力用のViewの作成

PDFを生成するためには、AbstractPdfViewのサブクラスを作成し、buildPdfDocumentメソッド 定義します。

RecipeのリストをPDFに出力するRecipePDFViewクラスを以下の定義します。

package org.springframework.showcase.coverc.web;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.showcase.coverc.domain.Recipe;
import org.springframework.web.servlet.view.document.AbstractPdfView;

import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class RecipePDFView extends AbstractPdfView {

	protected void buildPdfDocument(Map model, Document document, 
		      PdfWriter pdfWriter, HttpServletRequest request, 
		      HttpServletResponse response) throws Exception { 
		List recpeList = (List)model.get("recipeList");
		
		for(int i = 0; i < recpeList.size(); i++) {
			String name = ((Recipe)recpeList.get(i)).getName();
			document.add(new Paragraph(name));
		}
	}

}

プラグラムの処理としては、

です。これでRecipePDFViewは完成です。

コントローラのメソッドの追加

Recipeのリスト出力は、SwitchBoardControllerクラスで処理しますので、同様に listPDFメソッドを追加します。

    public ModelAndView listPDF(HttpServletRequest request, HttpServletResponse response)
    throws Exception {
        return new ModelAndView("listPDF").addObject(this.recipeManager.findAll());
    }

listRecipesメソッドでは、ModelAndViewの生成に引数を指定しませんでしたが、RecipePDFViewを 使用するには、ビューを指定する必要があります。そこで、ModelAndViewのコンストラクターの 引数として"listPDF"を渡します。

これで、listPDFメソッドで返されるModelAndViewのビューに"listPDF"が設定されました。

モデルは、listRecipesと同じです。addObjectでモデル名を省略した場合、そのオブジェクトの クラス名がモデル名になります。それが、配列またはリストの場合には「クラス名+List」という 名前で登録されます。

これで、先ほどのRecipePDFViewでモデルを取り出す時、"recipeList" と指定した理由が 納得できたと思います。

view名称とViewを処理するクラスのマッピング

最後にviewの名前とviewを処理クラスの関連付けを行います。

Spring-MVCでは複数のViewResolverを使用することができます。

この場合、order属性を指定して、名前解析の順序を指定します。

coverc-servlet.xmlに、resourceBundleViewResolverを以下のように追加します。

	<bean id="resourceBundleViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
		<property name="basename" value="views" /> 
		<property name="order" value="1" /> 
	</bean> 

viewとView処理クラスの関係を記述したリソースファイルviews.propertiesは以下の通りです。

listPDF.class=org.springframework.showcase.coverc.web.RecipePDFView

ブラウザーでの確認

mavenのjettyプラグインを起動した後、

$ mvn jetty:run

ブラウザーで

http://localhost:8080/mvc-convention/switchboard/listPDF.htm

と入力してください。

以下のような画面が出力されます。

listPdf.jpg

コメント

この記事は、

選択肢 投票
おもしろかった 3  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc