<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Springblog</title>
	<atom:link href="http://www.springblog.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.springblog.de</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jun 2009 21:28:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HTML zu PDF mit iText</title>
		<link>http://www.springblog.de/archives/164</link>
		<comments>http://www.springblog.de/archives/164#comments</comments>
		<pubDate>Sun, 14 Jun 2009 16:59:15 +0000</pubDate>
		<dc:creator>Wolfram</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[iText]]></category>
		<category><![CDATA[PDF]]></category>

		<guid isPermaLink="false">http://www.springblog.de/?p=164</guid>
		<description><![CDATA[Die iText Bibliothek enthält zwei Klassen, die es erlauben, HTML in iText Elemente zu übersetzen, HTMLParser und HTMLWorker. Der Parser ist gedacht für das Parsen von kompletten HTML Dokumenten, während der Worker benutzt werden sollte, wenn nur Auszüge von HTML Code eingelesen werden soll. Beide sind recht begrenzt in ihren Möglichkeiten, reichen aber aus für [...]]]></description>
			<content:encoded><![CDATA[<p>Die <a href="http://www.lowagie.com/iText/">iText Bibliothek</a> enthält zwei Klassen, die es erlauben, HTML in iText <code>Elemente</code> zu übersetzen, <code>HTMLParser</code> und <code>HTMLWorker</code>. Der Parser ist gedacht für das Parsen von kompletten HTML Dokumenten, während der Worker benutzt werden sollte, wenn nur Auszüge von HTML Code eingelesen werden soll. Beide sind recht begrenzt in ihren Möglichkeiten, reichen aber aus für einfach formatierten Text (z.B. kursiver oder fetter Text, verschiedene Textfarben und -größen, hier die <a href="http://www.1t3xt.info/api/constant-values.html#com.lowagie.text.html.simpleparser.HTMLWorker.tagsSupportedString">unterstützten HTML Tags</a>). Der iText Autor <a href="http://itext.ugent.be/library/question.php?id=40">empfiehlt andere Produkte</a>, sobald die Ansprüche an die HTML2PDF Konvertierung steigen (sehr aussichtsreich scheint die Kombination aus <a href="http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html">iText zusammen mit dem Flying Saucer XHTML Renderer</a> (<a href="https://xhtmlrenderer.dev.java.net/">Homepage des Flying Saucer Projekts</a>).<br />
Um nun einen String einfachen HTMLs zu parsen und in iText Elemente zu übersetzen, ist ein einfacher Aufruf der <code>parseToList</code> Methode des <code>HTMLWorkers</code> nötig.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">htmlText = <span style="color: #0000ff;">&quot;&lt;p&gt;&lt;span style='font-size:6px'&gt;Guten&lt;/span&gt; &lt;span style='color: rgb(255, 102, 0);'&gt;&lt;strong&gt;Tag&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&quot;</span><span style="color: #339933;">;</span>
bodyText = <span style="color: #009900;">&#40;</span>ArrayList<span style="color: #339933;">&lt;</span> <span style="color: #003399; font-weight: bold;">Element</span> <span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span>HTMLWorker.<span style="color: #006633;">parseToList</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">StringReader</span><span style="color: #009900;">&#40;</span>htmlText<span style="color: #009900;">&#41;</span>, <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><code>bodyText</code> enthält nun eine Liste mit einem <code>Paragraph</code>, der aus zwei <code>Chunks</code> besteht, die jeweils die gesetzten Eigenschaften (Schriftgröße, Farbe) besitzen. Die Elemente der Liste können nun z.B. einem <code>ColumnText</code> (hier textCol) hinzugefügt werden.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000;  font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Element</span> element : bodyText<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 textCol.<span style="color: #006633;">addElement</span><span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ein denkbarer Einsatzzweck wäre die Bearbeitung des PDF Inhalts vor dem Erzeugen des Dokuments im <a href="http://www.fckeditor.net/">FCKEditor</a> mit einem entsprechend auf einfache Textformatierungswerkzeuge begrenzten ToolbarSet.</p>
<p>Anmerkung zur Unterstützung der Textgröße (font-size): In der aktuellen iText Version 2.1.5 sorgt ein Bug dafür, dass die Schriftgröße auf 8px gesetzt wird, sobald die Eigenschaft &#8220;font-size&#8221; verwendet wird. Dieser Bug wurde mit <a href="http://itext.svn.sourceforge.net/viewvc/itext?diff_format=h&#038;view=rev&#038;revision=3895">Revision 3895</a> gefixt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.springblog.de/archives/164/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate Criteria API</title>
		<link>http://www.springblog.de/archives/146</link>
		<comments>http://www.springblog.de/archives/146#comments</comments>
		<pubDate>Tue, 02 Jun 2009 15:39:09 +0000</pubDate>
		<dc:creator>Wolfram</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://www.springblog.de/?p=146</guid>
		<description><![CDATA[Eine Datenbank schön zu befragen geht zum Beispiel mit der Hibernate Criteria API unter Benutzung der Factory-Klasse Restrictions. So lässt sich beispielsweise die Anfrage für eine etwas umfangreichere Such- und Filterfunktion so zusammenbasteln:

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
&#160;
&#91;...&#93;
&#160;
List&#60; Kunde &#62; gefundeneKunden = sessionFactory.getCurrentSession&#40;&#41;
 .createCriteria&#40;Kunde.class&#41;
  .add&#40;Restrictions.ne&#40;&#34;inaktiv&#34;, true&#41;&#41;
  .add&#40;Restrictions.in&#40;&#34;typ&#34;,  search.getSelectedTypes&#40;&#41;&#41;&#41;
  .add&#40;Restrictions.eq&#40;&#34;geschlecht&#34;, search.getGenderFilter&#40;&#41;&#41;&#41;
  .add&#40;Restrictions.between&#40;&#34;datumLetzterKauf&#34;,search.getFromDate&#40;&#41;,search.getUntilDate&#40;&#41;&#41;&#41;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Eine Datenbank schön zu befragen geht zum Beispiel mit der <a href="https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html">Hibernate Criteria API</a> unter Benutzung der Factory-Klasse <a href="https://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html">Restrictions</a>. So lässt sich beispielsweise die Anfrage für eine etwas umfangreichere Such- und Filterfunktion so zusammenbasteln:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.Criteria</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.criterion.Order</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.criterion.Restrictions</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#91;</span>...<span style="color: #009900;">&#93;</span>
&nbsp;
List<span style="color: #339933;">&lt;</span> Kunde <span style="color: #339933;">&gt;</span> gefundeneKunden = sessionFactory.<span style="color: #006633;">getCurrentSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
 .<span style="color: #006633;">createCriteria</span><span style="color: #009900;">&#40;</span>Kunde.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">ne</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;inaktiv&quot;</span>, <span style="color: #006600; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">in</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;typ&quot;</span>,  search.<span style="color: #006633;">getSelectedTypes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">eq</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;geschlecht&quot;</span>, search.<span style="color: #006633;">getGenderFilter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">between</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;datumLetzterKauf&quot;</span>,search.<span style="color: #006633;">getFromDate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,search.<span style="color: #006633;">getUntilDate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">disjunction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
   .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">like</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;name&quot;</span>, <span style="color: #0000ff;">&quot;%&quot;</span>+search.<span style="color: #006633;">getSearchStringName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>+<span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
   .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">like</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ort&quot;</span>, <span style="color: #0000ff;">&quot;%&quot;</span>+search.<span style="color: #006633;">getSearchStringOrt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>+<span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
   .<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>Restrictions.<span style="color: #006633;">like</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plz&quot;</span>, <span style="color: #0000ff;">&quot;%&quot;</span>+search.<span style="color: #006633;">getSearchStringPlz</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>+<span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">addOrder</span><span style="color: #009900;">&#40;</span>Order.<span style="color: #006633;">asc</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  .<span style="color: #006633;">setMaxResults</span><span style="color: #009900;">&#40;</span>search.<span style="color: #006633;">getMaxResults</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #006633;">list</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.springblog.de/archives/146/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF-8 Character Encoding</title>
		<link>http://www.springblog.de/archives/63</link>
		<comments>http://www.springblog.de/archives/63#comments</comments>
		<pubDate>Tue, 02 Jun 2009 09:37:24 +0000</pubDate>
		<dc:creator>Wolfram</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[CharacterEncodingFilter]]></category>
		<category><![CDATA[Encoding]]></category>
		<category><![CDATA[Filter]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[web.xml]]></category>

		<guid isPermaLink="false">http://www.springblog.de/?p=63</guid>
		<description><![CDATA[Soweit mir bekannt (und bei mir zu umfassendem Erfolg führend) gibt es drei Einstellungen, die man beachten muss, um seiner in Tomcat laufende Anwendung UTF-8 beizubringen.
1) Tomcat sollte die URL (und damit u.a. GET-Parameter) als UTF-8 kodieren. Dies wird über das URIEncoding Attribut des Connector Elements in der server.xml eingestellt.

&#60;connector connectionTimeout=&#34;20000&#34;
 port=&#34;8080&#34;
 protocol=&#34;HTTP/1.1&#34;
 redirectPort=&#34;8443&#34;
 URIEncoding=&#34;UTF-8&#34;/&#62;

2) [...]]]></description>
			<content:encoded><![CDATA[<p>Soweit mir bekannt (und bei mir zu umfassendem Erfolg führend) gibt es drei Einstellungen, die man beachten muss, um seiner in Tomcat laufende Anwendung UTF-8 beizubringen.</p>
<p>1) Tomcat sollte die URL (und damit u.a. GET-Parameter) als UTF-8 kodieren. Dies wird über das <a href="http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q2">URIEncoding Attribut</a> des <code>Connector</code> Elements in der <em>server.xml</em> eingestellt.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;connector</span> <span style="color: #000066;">connectionTimeout</span>=<span style="color: #ff0000;">&quot;20000&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">port</span>=<span style="color: #ff0000;">&quot;8080&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">protocol</span>=<span style="color: #ff0000;">&quot;HTTP/1.1&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">redirectPort</span>=<span style="color: #ff0000;">&quot;8443&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">URIEncoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>2) Das richtige Encoding der Request (und damit unter anderem der POST Daten eines Forms) wird mit einem <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html">CharacterEncodingFilter</a> in der <em>web.xml</em> sichergestellt. Dieser sollte als einer der ersten Filter eingerichtet werden (das <code>filter-mapping</code> Element des <code>charsetFilter</code> also im Deployment Descriptor vor den anderen Mappings stehen).</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filtername<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>charsetFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filtername<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filterclass<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.springframework.web.filter.CharacterEncodingFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filterclass<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;initparam<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;paramname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>encoding<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/paramname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;paramvalue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>UTF-8<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/paramvalue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/initparam<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;initparam<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;paramname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>forceEncoding<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/paramname<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;paramvalue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/paramvalue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/initparam<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filtermapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filtername<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>charsetFilter<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filtername<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;urlpattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/*<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/urlpattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filtermapping<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>3) Um schon von vornherein allen Beteiligten (z.B. dem Browser) die Möglichkeit zu geben, die richtige Kodierung zu benutzen, sollte in den ausgelieferten HTML Seiten das verwendete CharacterEncoding vermerkt sein. Dies geschieht in JSPs so:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; %@ page <span style="color: #000066;">language</span>=<span style="color: #ff0000;">&quot;java&quot;</span> <span style="color: #000066;">contentType</span>=<span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #000066;">pageEncoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span>%<span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>und endet in der HTML Seite so:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;</pre></div></div>

<p>Damit sollte nun alles auf UTF-8 eingerichtet und auf UTF-8 gefasst sein, damit zum Beispiel Umlaute und sonstige Zeichen korrekt dargestellt und verarbeitet werden können.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.springblog.de/archives/63/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@RequestMapping</title>
		<link>http://www.springblog.de/archives/69</link>
		<comments>http://www.springblog.de/archives/69#comments</comments>
		<pubDate>Wed, 27 May 2009 11:08:50 +0000</pubDate>
		<dc:creator>Wolfram</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[DefaultAnnotationHandlerMapping]]></category>
		<category><![CDATA[RequestMapping]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.springblog.de/?p=69</guid>
		<description><![CDATA[Wie auch im API Eintrag zur @RequestMapping Annotation zu finden ist, lassen sich grobe Mappings auf Typebene (z.B. @RequestMapping("/kunden/*")) auf Methodenebene weiter spezialisieren. Dabei lässt sich als Parameter neben dem relativen Pfad (z.B. anlegen.do) auch die Art der Request angeben. Mappings könnten also so aussehen:

@RequestMapping(value=&#34;bearbeiten.do&#34;, method = RequestMethod.GET)
...
@RequestMapping(value=&#34;bearbeiten.do&#34;, method = RequestMethod.POST)

In einer Klasse, von der [...]]]></description>
			<content:encoded><![CDATA[<p>Wie auch im <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/bind/annotation/RequestMapping.html">API Eintrag zur @RequestMapping Annotation</a> zu finden ist, lassen sich grobe Mappings auf Typebene (z.B. <code>@RequestMapping("/kunden/*")</code>) auf Methodenebene weiter spezialisieren. Dabei lässt sich als Parameter neben dem relativen Pfad (z.B. <code>anlegen.do</code>) auch die Art der Request angeben. Mappings könnten also so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">@RequestMapping(value=&quot;bearbeiten.do&quot;, method = RequestMethod.GET)
...
@RequestMapping(value=&quot;bearbeiten.do&quot;, method = RequestMethod.POST)</pre></div></div>

<p>In einer Klasse, von der mehrere Controller erben, können dann Methoden implementiert werden, die unter gleichem relativen Pfad aufgerufen werden sollen. Das finale Mapping wird dann zusammengesetzt aus dem @RequestMapping auf Typebene der erbenden Klassen und dem relativen Pfad im @RequestMapping der Methode. Das ist nicht wirklich überraschend, dennoch gerade hilfreich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.springblog.de/archives/69/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF Dokumente erzeugen &#8211; Konfiguration von Tiles2 und AbstractPdfView</title>
		<link>http://www.springblog.de/archives/3</link>
		<comments>http://www.springblog.de/archives/3#comments</comments>
		<pubDate>Mon, 25 May 2009 20:00:54 +0000</pubDate>
		<dc:creator>Wolfram</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[iText]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tiles]]></category>
		<category><![CDATA[ViewResolver]]></category>

		<guid isPermaLink="false">http://foff.rcgmbh.com/wordpress/?p=3</guid>
		<description><![CDATA[Bisher hat meine Spring Anwendung ausschließlich Tiles2 als View Technologie benutzt. Dazu habe ich einen UrlBasedViewResolver konfiguriert wie folgt.
applicationContext.xml

&#60;bean id=&#34;viewResolver&#34;
 class=&#34;org.springframework.web.servlet.view.UrlBasedViewResolver&#34;
 p:viewClass=&#34;org.springframework.web.servlet.view.tiles2.TilesView&#34;
 p:order=&#34;2&#34;&#62;
&#60;/bean&#62;

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, [...]]]></description>
			<content:encoded><![CDATA[<p>Bisher hat meine Spring Anwendung ausschließlich Tiles2 als View Technologie benutzt. Dazu habe ich einen <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/view/UrlBasedViewResolver.html"><code>UrlBasedViewResolver</code></a> konfiguriert wie folgt.</p>
<p><code>applicationContext.xml</code></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;viewResolver&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.web.servlet.view.UrlBasedViewResolver&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">p:viewClass</span>=<span style="color: #ff0000;">&quot;org.springframework.web.servlet.view.tiles2.TilesView&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">p:order</span>=<span style="color: #ff0000;">&quot;2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Details zur Einrichtung von Tiles ist in der Spring Dokumentation zu finden (<a href="http://static.springframework.org/spring/docs/2.5.x/reference/view.html#view-tiles">2.5</a>, <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch17s03.html#view-tiles-integrate">3.0</a>). Die zugehörige Tiles Konfigurationsdateien enthalten die <em>Tiles Definitions</em>, die zum Rendern aus den <code>Controllern</code> angesprochen werden können und beschreiben, wie die ausgelieferte Seite zusammengesetzt werden soll.</p>
<p>Um PDF Dokumente zur Laufzeit zu erzeugen und dem Benutzer anzubieten, wird ein zweiter <code>ViewResolver</code> benötigt. Ich habe dazu einen <code><a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/view/ResourceBundleViewResolver.html">ResourceBundleViewResolver</a></code> hinzugefügt, der die Datei <code>views.properties</code> nutzt, um die richtige <code>Viewklasse</code> zu einem <code>Viewnamen</code> zu finden.</p>
<p><code>applicationContext.xml</code></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;viewResolverPDF&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.web.servlet.view.ResourceBundleViewResolver&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">p:basename</span>=<span style="color: #ff0000;">&quot;views&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">p:order</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><code>views.properties</code></p>
<blockquote><p>
AnschreibenPdf.class=de.springblog.projekt.view.pdfviews.AnschreibenPdf<br />
AnlagePdf.class=de.springblog.projekt.view.pdfviews.AnlagePdf
</p></blockquote>
<p>Beide <code>ViewResolver</code> haben die Property <code>order</code>, die die Reihenfolge der <code>Resolver</code> festlegt. Zuerst wird geschaut, ob in der <code>views.properties</code> File ein Eintrag für den vom Controller zurückgegebenen <code>Viewnamen</code> passt (<code>ResourceBundleViewResolver</code>, order 1). Wenn keiner gefunden werden kann, wird versucht, den <code>Viewnamen</code> als Tiles Definition zu interpretieren (<code>UrlBasedViewResolver</code>, order 2).</p>
<p>Die in der <code>views.properties</code> genannten Klassen erweitern bzw. implementieren die abstrakte Klasse <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/view/document/AbstractPdfView.html"><code>AbstractPdfView</code></a> und vor allem deren abstrakte Methode <code>buildPdfDocument</code>, in der das PDF gebaut wird (mit Hilfe der <a href="http://www.lowagie.com/iText/">iText Bibliothek</a>).</p>
<p>Wird nun also für den zurückgegebenen <code>Viewnamen</code> (z.B. <code>AnschreibenPdf</code>) eine <code>Viewklasse</code> (entsprechend <code>de.springblog.projekt.view.pdfviews.AnschreibenPdf</code>) gefunden, wird die überschriebene Methode <code>buildPdfDocument</code> dieser Klasse aufgerufen und das PDF erzeugt.</p>
<p>Setzt man nun einen HTML Link auf eine PDF Datei, die auf eine Controller-Methode gemappt wird (zum Beispiel durch <code>@RequestMapping</code>) und gibt diese einen <code>Viewnamen</code> aus der <code>views.properties</code> zurück, so rendert die angegebene Klasse ein PDF und Spring liefert dieses an den Browser aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.springblog.de/archives/3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
