Bisher hat meine Spring Anwendung ausschließlich Tiles2 als View Technologie benutzt. Dazu habe ich einen UrlBasedViewResolver konfiguriert wie folgt.
applicationContext.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2"> </bean>
Details zur Einrichtung von Tiles ist in der Spring Dokumentation zu finden (2.5, 3.0). Die zugehörige Tiles Konfigurationsdateien enthalten die Tiles Definitions, die zum Rendern aus den Controllern angesprochen werden können und beschreiben, wie die ausgelieferte Seite zusammengesetzt werden soll.
Um PDF Dokumente zur Laufzeit zu erzeugen und dem Benutzer anzubieten, wird ein zweiter ViewResolver benötigt. Ich habe dazu einen ResourceBundleViewResolver hinzugefügt, der die Datei views.properties nutzt, um die richtige Viewklasse zu einem Viewnamen zu finden.
applicationContext.xml
<bean id="viewResolverPDF" class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:basename="views" p:order="1"> </bean>
views.properties
AnschreibenPdf.class=de.springblog.projekt.view.pdfviews.AnschreibenPdf
AnlagePdf.class=de.springblog.projekt.view.pdfviews.AnlagePdf
Beide ViewResolver haben die Property order, die die Reihenfolge der Resolver festlegt. Zuerst wird geschaut, ob in der views.properties File ein Eintrag für den vom Controller zurückgegebenen Viewnamen passt (ResourceBundleViewResolver, order 1). Wenn keiner gefunden werden kann, wird versucht, den Viewnamen als Tiles Definition zu interpretieren (UrlBasedViewResolver, order 2).
Die in der views.properties genannten Klassen erweitern bzw. implementieren die abstrakte Klasse AbstractPdfView und vor allem deren abstrakte Methode buildPdfDocument, in der das PDF gebaut wird (mit Hilfe der iText Bibliothek).
Wird nun also für den zurückgegebenen Viewnamen (z.B. AnschreibenPdf) eine Viewklasse (entsprechend de.springblog.projekt.view.pdfviews.AnschreibenPdf) gefunden, wird die überschriebene Methode buildPdfDocument dieser Klasse aufgerufen und das PDF erzeugt.
Setzt man nun einen HTML Link auf eine PDF Datei, die auf eine Controller-Methode gemappt wird (zum Beispiel durch @RequestMapping) und gibt diese einen Viewnamen aus der views.properties zurück, so rendert die angegebene Klasse ein PDF und Spring liefert dieses an den Browser aus.