<?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>javathreads.de &#187; Framework</title>
	<atom:link href="http://javathreads.de/category/framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://javathreads.de</link>
	<description>Blog rund um Java und Web Entwicklung</description>
	<lastBuildDate>Fri, 20 Aug 2010 08:10:15 +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>11 Tipper &#8211; kostenloses Fu&#223;ball Tippspiel mit JSF und JBoss Seam auf Tomcat Basis geht online</title>
		<link>http://javathreads.de/2010/05/11-tipper-kostenloses-fussball-tippspiel-mit-jsf-und-jboss-seam-auf-tomcat-basis-geht-online/</link>
		<comments>http://javathreads.de/2010/05/11-tipper-kostenloses-fussball-tippspiel-mit-jsf-und-jboss-seam-auf-tomcat-basis-geht-online/#comments</comments>
		<pubDate>Sun, 02 May 2010 13:25:01 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[JBoss Seam]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[RichFaces]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=2415</guid>
		<description><![CDATA[M&#246;chte man ein Framework besser kennenlernen oder bestimmte Problemstellungen nachstellen um brauchbare L&#246;sung zu finden bietet es sich an dieses an einem kleinen Projekt mit einem Ziel zu tun. Hat man sich erst einmal ein Projekt ausgedacht und das voller Elan angefangen besteht die gro&#223;e Herausforderung es auch zu einem halbwegs vern&#252;nftigen Abschluss zu bringen. [...]]]></description>
			<content:encoded><![CDATA[<p>M&#246;chte man ein Framework besser kennenlernen oder bestimmte Problemstellungen nachstellen um brauchbare L&#246;sung zu finden bietet es sich an dieses an einem kleinen Projekt mit einem Ziel zu tun. Hat man sich erst einmal ein Projekt ausgedacht und das voller Elan angefangen besteht die gro&#223;e Herausforderung es auch zu einem halbwegs vern&#252;nftigen Abschluss zu bringen. Genau das ist in diesen Tagen bei mir passiert und ich pr&#228;sentiere p&#252;nktlich zur WM 2010 das<a href="http://11tipper.de/tippspiel"> kostenlose Fu&#223;ball Tippspiel 11 Tipper</a>. </p>
<div class="singleImgDiv">
<a href="http://11tipper.de/tippspiel"><img src="http://javathreads.de/data/uploads/2010/05/11TipperTippspiel.jpg" alt="" title="11 Tipper Tippspiel" width="610" height="354" class="alignnone size-full wp-image-2436" /></a>
</div>
<p>Wer also ein Tippspiel zur WM oder zur Bundesliga mit Freunden oder Arbeitskollegen veranstalten m&#246;chte kann sich auf 11tipper.de eines einrichten.<br />
Wer mehr &#252;ber das Tippspiel an sich wissen m&#246;chte sollte den <a href="http://webthreads.de/2010/05/11-tipper-das-kostenlose-tippspiel-zur-wm-2010-oder-bundesliga-geht-online/">Artikel auf webthreads.de</a> lesen oder sich die Features auf <a href="http://11tipper.de/tippspiel">11 Tipper</a> direkt ansehen. Es bestehen auch <a href="http://11tipper.de/tippspiel/demo">zwei Demo Tipprunden</a> in denen man als Spielleiter oder Tipper herumklicken kann.</p>
<h4>Verwendete Frameworks</h4>
<p>Jetzt noch ein paar Worte zur Technik. Das Tippspiel wird mit <strong>JSF 1.2</strong> und <strong>JBoss Seam 2.2.0</strong> entwickelt. Viele kennen JBoss Seam nur auf einem Application Server wie eben den JBoss AS. Ich habe Seam auf einem <strong>Tomcat 6</strong> ohne Embedded JBoss verwendet. Es wird somit anstatt auf EJBs voll auf <strong>POJOs</strong> gesetzt und auch nicht so getan als w&#228;re mann auf einem Application Server. Die Persistenz ist mit <strong>JPA (Hibernate)</strong> umgesetzt. Seam verwendet zur Validierung der Eingaben an der Oberfl&#228;che die JPA Annotationen an den Entities. F&#252;r Timer und zeitliche Verz&#246;gerungen wird <strong>Quarz</strong> verwendet. Das Frontend ist mit <strong>Facelets</strong> und <strong>JBoss RichFaces 3.3</strong> umgesetzt. Verfeinert wird das Ganze mit viel <strong>Ajax</strong> und <strong>jQuery 1.4</strong> als JavaScript Bibliothek.</p>
<p>In der Vergangenheit sind schon ein paar Artikel aus den Erkenntnissen dieses Projekts hier auf javathreads.de ver&#246;ffentlicht worden. Und ich werde wohl noch das ein oder andere Tutorial dazu hier in naher Zukunft ver&#246;ffentlichen. Falls jemand eine bestimmte Frage zur Umsetzung hat dann nur raus damit ich antworte garantiert =).</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2010/05/11-tipper-kostenloses-fussball-tippspiel-mit-jsf-und-jboss-seam-auf-tomcat-basis-geht-online/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>History of Web Frameworks</title>
		<link>http://javathreads.de/2010/03/history-of-web-frameworks/</link>
		<comments>http://javathreads.de/2010/03/history-of-web-frameworks/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 05:00:33 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Chart]]></category>
		<category><![CDATA[Web Frameworks]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=2336</guid>
		<description><![CDATA[Eine wirklich interessante Grafik wurde vor kurzem auf flickr unter dem Titel &#8220;History of Web Frameworks&#8221; ver&#246;ffentlicht. Das Besondere an der Grafik ist die zeitliche Anordnung der verschiedenen Frameworks. Darunter sind auch die g&#228;ngigen Java Technologien, angefangen bei Tomcat 3.0 und Servlet 2.2 aus dem Jahr 1999 bis hin zu JSF 2.0 und Spring 3.0 [...]]]></description>
			<content:encoded><![CDATA[<p>Eine wirklich interessante Grafik wurde vor kurzem auf flickr unter dem Titel &#8220;<a href="http://www.flickr.com/photos/mraible/4378559350/">History of Web Frameworks</a>&#8221; ver&#246;ffentlicht. Das Besondere an der Grafik ist die zeitliche Anordnung der verschiedenen Frameworks. Darunter sind auch die g&#228;ngigen Java Technologien, angefangen bei Tomcat 3.0 und Servlet 2.2 aus dem Jahr 1999 bis hin zu JSF 2.0 und Spring 3.0 aus dem Jahr 2009, zu finden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2010/03/HistoryOfWebFrameworks.jpg" alt="History Of Web Frameworks" title="History Of Web Frameworks" width="630" height="301" class="alignnone size-full wp-image-2337" />
</div>
<p>Wer eine gr&#246;&#223;ere Version sehen oder herunterladen m&#246;chte sollte sich diese <a href="http://farm5.static.flickr.com/4067/4378559350_70bd42f61f_b.jpg">direkt auf flickr.com ansehen</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2010/03/history-of-web-frameworks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial: Erstellung eines JBoss Seam Eclipse Projekt auf Tomcat Basis durch Import des JPA Beispiels</title>
		<link>http://javathreads.de/2009/10/tutorial-erstellung-eines-jboss-seam-eclipse-projekt-auf-tomcat-basis-durch-import-des-jpa-beispiels/</link>
		<comments>http://javathreads.de/2009/10/tutorial-erstellung-eines-jboss-seam-eclipse-projekt-auf-tomcat-basis-durch-import-des-jpa-beispiels/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 20:27:50 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=2022</guid>
		<description><![CDATA[JBoss Seam r&#252;hmt sich auch ohne den JBoss aber insbesondere auch ohne einen JEE Application Server laufen zu k&#246;nnen. Obwohl Seam auf JEE basiert und eine Schnittstelle zwischen JEE Komponenten und der Web-Welt sein m&#246;chte erleichtert Seam auch ohne einen Java EE Application Server die Entwicklung einer Web-Anwendung vor allem durch die Verwendung als Context [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://seamframework.org">JBoss Seam</a> r&#252;hmt sich auch ohne den JBoss aber insbesondere auch ohne einen JEE Application Server laufen zu k&#246;nnen. Obwohl Seam auf JEE basiert und eine Schnittstelle zwischen JEE Komponenten und der Web-Welt sein m&#246;chte erleichtert Seam auch ohne einen Java EE Application Server die Entwicklung einer Web-Anwendung vor allem durch die Verwendung als Context Controller.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/10/SeamTomcat3.png" alt="Seam als Context Controller" title="Seam als Context Controller" width="276" height="200" class="alignnone size-full wp-image-2092" />
</div>
<p>Im Folgenden soll gezeigt werden wie der einfachste Einstieg mit Hilfe des Seam JPA Beispiels gelingt um ein Seam Projekt inklusive JPA Persistenz durch Hibernate auf Tomcat Basis in Eclipse erstellen kann. In diesem Tutorial wird in erster Linie nicht auf die einzelnen Konfigurationsdateien eingegangen, das wird in einem extra Artikel gemacht, sondern lediglich auf das Ziel hingearbeitet ein Seam Projekt in Eclipse zu erstellen und auf den Tomcat laufen zu lassen. Es bestehen zwei M&#246;glichkeiten Seam auf dem Tomcat laufen zu lassen. Zum Einen die Verwendung eines JEE Microcontainer mit JBoss Embedded und zum anderen g&#228;nzlich ohne JEE Microcontainer. In diesem Tutorial wird <b>kein</b> JEE Mircrocontainer verwendet.</p>
<h3>Vorbereitungen</h3>
<h4>Verwendete Tools und Versionen</h4>
<ul>
<li><a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR1/eclipse-jee-galileo-SR1-win32.zip">Eclipse Gallileo (3.5)</a> &#8211; IDE for Java EE Developers</li>
<li><a href="http://tomcat.apache.org/download-60.cgi">Apache Tomcat</a> Version 6.0.20</li>
<li><a href="http://seamframework.org/Download">JBoss Seam</a> Version 2.2.0</li>
<li><a href="http://www.jboss.org/tools/">JBoss Tools</a> Version 3.1.0</li>
<li><a href="http://dev.mysql.com/downloads/mysql/5.0.html#downloads">MySQL</a> Version 5.0.x (oder DB der Wahl)</li>
</ul>
<p>Es wird in diesem Tutorial nicht auf das Herunterladen der Software und Tools, der Verzeichnisstruktur und Eclipse sowie die Konfiguration von MySQL eingegangen. Ben&#246;tigt man eine genaue Anleitung f&#252;r diese Punkte sollte man sich das &#228;quivalente Tutorial &#8220;<a href="http://javathreads.de/2008/09/tutorial-mit-jboss-seam-und-jee5-unter-eclipse-starten/#HerunterladenSoftware">Tutorial: Mit JBoss Seam und JEE5 unter Eclipse starten</a>&#8221; genauer ansehen. Diese Punkte verhalten sich aktuell immer noch gleich bis auf die Verwendung des JBoss AS der jetzt durch den Apache Tomcat ausgetauscht wird.</p>
<p>Es wird also ein Eclipse JEE Bundle (WTP inklusive), ein entpackter/installierter Tomcat 6 und eine vorhandene Datenbank vorausgesetzt.</p>
<h4>Tomcat Server Runtime in Eclipse konfigurieren</h4>
<p>Weil das Seam Projekt direkt aus Eclipse heraus in den Tomcat deployt und gestartet werden soll muss als erstes der Tomcat als Server Runtime installiert werden. Dazu im Hauptmen&#252; unter Window->Preferences->Server->Runtime Environment den Button &#8220;Add&#8221; klicken.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimeAdd2.png.jpg" alt="&quot;Server Runtime Hinzf&#252;gen - &quot;Add&quot; Button" title="&quot;Server Runtime Hinzf&#252;gen - &quot;Add&quot; Button" width="630" height="179" class="alignnone size-full wp-image-2030" />
</div>
<p>Anschlie&#223;end Apache Tomcat v6.0 und weiter unten &#8220;Create a new local server&#8221; ausw&#228;hlen und den Button &#8220;Next&#8221; klicken:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimeTomcat6.png" alt="Server Runtime Tomcat v6.0" title="Server Runtime Tomcat v6.0" width="525" height="201" class="alignnone size-full wp-image-2034" />
</div>
<p>Auf dem letzten Dialog den Tomcat Installationspfad angeben. Ich verwende f&#252;r meine Projekte immer den Tomcat den man einfach als ZIP herunterladen und anschlie&#223;end an einer bestimmten Stelle entpacken kann. Den letzten Dialog des Wizzards mit dem Button &#8220;Finish&#8221; beenden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimePath.png" alt="Server Runtime Installationspfad" title="Server Runtime Installationspfad" width="525" height="285" class="alignnone size-full wp-image-2035" />
</div>
<p>Der Tomcat sollte nun in Eclipse konfiguriert sein:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimeInstalled2.jpg" alt="Tomcat Server Runtime Installiert" title="Tomcat Server Runtime Installiert" width="630" height="155" class="alignnone size-full wp-image-2042" />
</div>
<p>Die Preferences verlassen und die Server View &#8220;Hauptmen&#252;->Windows->Show View->Servers&#8221; &#246;ffnen. Es sollte der eben konfigurierte Tomcat, sofern das H&#228;kchen bei &#8220;Create a new local server&#8221; gesetzt wurde, zu sehen sein:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SEamTomcatEclipse_ServerView2.png" alt="Eclipse Server View" title="Eclipse Server View" width="630" height="59" class="alignnone size-full wp-image-2052" />
</div>
<p>Der Server sollte sich auch ohne Probleme starten lassen:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerViewConsole.png" alt="Server Console" title="Server Console" width="630" height="87" class="alignnone size-full wp-image-2050" />
</div>
<p>Vom Prinzip ist das Einrichten einer Server Runtime nichts neues aber ich wollte die Schritte wenigstens einmal kurz zeigen =).</p>
<h3>Seam JPA Beispiel f&#252;r Tomcat bauen und testen</h3>
<h4>JPA Beispiel mit ANT f&#252;r Tomcat 6 bauen</h4>
<p>Die wohl schnellste Variante ein Seam Projekt inklusive Persistierung via JPA f&#252;r Tomcat als Eclipse Projekt zu erstellen ist das Importieren des mit vom Seam ausgelieferten JPA Beispiels. Seam liefert eine beachtliche Menge an Beispielen aus, welche alle gebaut und deployt werden k&#246;nnen. Darunter befindet sich eben auch das JPA Beispiel welches im entpackten Seam Verzeichnis unter <code>examples/jpa</code> liegt und man f&#252;r Tomcat 5 und Tomcat 6 bauen lassen kann.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamExaplesOrdner.png" alt="Seam Exaples Ordner" title="Seam Exaples Ordner" width="630" height="227" class="alignnone size-full wp-image-2057" />
</div>
<p>Um sich ein WAR File f&#252;r Tomcat 6 zu erstellen muss zum einen <a href="http://ant.apache.org/bindownload.cgi">ANT</a> im Pfad (Umgebungsvariable <code>PATH</code>) konfiguriert sein und zum anderen die Umgebungsvariable <code>JAVA_HOME</code> auf ein JDK 6 zeigen. Ist beides konfiguriert die Eingabeaufforderung im Seam examples Ordner &#246;ffnen. An dieser Stelle in kleiner Tipp f&#252;r alle Windows Vista Benutzer: h&#228;lt man die Schift-Taste gedr&#252;ckt und &#246;ffnet das Kontextmen&#252; auf einem Ordner so erscheint eine zus&#228;tzliche Auswahl &#8220;Eingabeaufforderung hier &#246;ffnen&#8221;:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamExaplesOrdnerEingabeaufforderung.png" alt="Seam Exaples Ordner Eingabeaufforderung im Kontextmen&#252; Windows Vista" title="Seam Exaples Ordner Eingabeaufforderung im Kontextmen&#252; Windows Vista" width="630" height="136" class="alignnone size-full wp-image-2058" />
</div>
<p>Alle anderen m&#252;ssen sich durchhangeln ;). Hat man die Eingabeaufforderung im gew&#252;nschten Order kann man noch einmal die beiden notwendigen Umgebungsvariablen <code>PATH</code> und <code>JAVA_HOME</code> &#252;berpr&#252;fen und anschlie&#223;end den build f&#252;r Tomcat 6 mit &#8220;<code>ant tomcat6</code>&#8221; gestartet werden:</p>
<div class="codebox">
<pre>
D:\Projekte\JBossSeamTomcat\jboss-seam-2.2.0.GA\examples\jpa>echo %PATH%
C:\Windows\system32;...;D:\Development\apache-ant-1.7.1/bin

D:\Projekte\JBossSeamTomcat\jboss-seam-2.2.0.GA\examples\jpa>echo %JAVA_HOME%
D:\Projekte\JBossSeamTomcat\jdk-1.6

D:\Projekte\JBossSeamTomcat\jboss-seam-2.2.0.GA\examples\jpa>ant tomcat6
Buildfile: build.xml
...
init:
     [echo] Building The JPA Example for plain Tomcat 6.0 2.2
...
noejb.archive:
      [jar] Building jar: D:\Projekte\JBossSeamTomcat\jboss-seam-2.2.0.GA\examples\jpa\dist-tomcat6\jboss-seam-jpa.war

BUILD SUCCESSFUL
Total time: 4 seconds
</pre>
</div>
<p>Die interessante Zeile ist die letzte, denn da steht dass die jboss-seam-jpa.war Datei im Ordner &#8220;<code>..\examples\jpa\dis-tomcat6\</code>&#8221; abgelegt wurde.</p>
<h4>JPA WAR im Tomcat testen</h4>
<p>Die einfachste Variante zu testen ob das erzeugte war erst einmal &#252;berhaupt funktioniert ist ein Test direkt im Tomcat. Dazu die WAR Datei <code>jboss-seam-jpa.war</code> kopieren und im Tomcat Verzeichnis in den Unterorder &#8220;<code>webapps</code>&#8221; kopieren:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamExaplesJPAWarTomcatWebapps.png" alt="Seam Beispiel JPA WAR Tomcat webapps Verzeichnis" title="Seam Beispiel JPA WAR Tomcat webapps Verzeichnis" width="630" height="199" class="alignnone size-full wp-image-2062" />
</div>
<p>Startet man anschlie&#223;end den Tomcat (</code>&lt;TomcatDir&gt;/bin/startup.bat</code>) erscheint sehr wahrscheinlich die Fehlermeldung, dass der HSQL DB Treiber "" nicht gefunden wurde:</p>
<div class="codebox">
<pre>
20:34:06,520 INFO  [DatasourceConnectionProvider] Using datasource: java:comp/env/jdbc/TestDB
20:34:06,522 WARN  [SettingsFactory] Could not obtain connection metadata
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.hsqldb.jdbcDriver'
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1136)
        ...
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver
...
27.09.2009 20:34:06 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Mojarra (1.2_12-b01-FCS) for context '/jboss-seam-jpa'
27.09.2009 20:34:07 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error listenerStart
</pre>
</div>
<p>Dazu muss man wissen, dass das Seam JPA Beispiel intern mit einer <a href="http://hsqldb.org/">HSQL DB</a> arbeitet und den Treiber im Tomcat lib Verzeichnis voraussetzt. Am Einfachsten ist es wenn der HSQL DB Treiber von <a href="http://sourceforge.net/projects/hsqldb/files/">Sourceforge heruntergeladen</a> wird. Zum aktuellen Zeitpunkt ist die Version 1.8.1 (<a href="http://sourceforge.net/projects/hsqldb/files/hsqldb/hsqldb_1_8_1/hsqldb_1_8_1_1.zip/download">Direktlink</a>) die aktuellste. Das herunterladene Zip entpacken und aus dem Unterordner <code>lib</code> das hsqld.jar kopieren und im Tomcat <code>lib</code> Verzeichnis einf&#252;gen. Anschlie&#223;end den Tomcat neu starten - dieser sollte nun ohne Fehler neu starten:</p>
<div class="codebox">
<pre>
27.09.2009 20:42:17 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Mojarra (1.2_12-b01-FCS) for context '/jboss-seam-jpa'
...
27.09.2009 20:42:19 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
27.09.2009 20:42:19 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
27.09.2009 20:42:19 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/13  config=null
27.09.2009 20:42:19 org.apache.catalina.startup.Catalina start
INFO: Server startup in 4348 ms
</pre>
</div>
<p>Nun kann die JPA Beispielanwendung mit der URL <code>http://localhost:8080/jboss-seam-jpa</code> aufgerufen werden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamExamplesJPADeployt.jpg" alt="Seam JPA Beispiel - Browseraufruf" title="Seam JPA Beispiel - Browseraufruf" width="630" height="351" class="alignnone size-full wp-image-2065" />
</div>
<p>Der Deploymenttest hat gezeigt, dass sich das erstellte WAR ohne Probleme im Tomcat deployen und aufrufen l&#228;sst.</p>
<h3>Eclipse Projekt erstellen</h3>
<h4>Projekt durch WAR Import erstellen</h4>
<p>Als letzten Schritt fehlt nur noch der Import des WARs als Eclipse Projekt.<br />
Dazu den eben gestarteten Tomcat wieder stoppen und das <code>jboss-seam-jpa.war</code> wieder aus dem <code>webapps</code> Verzeichnis entfernen. In Eclipse den Import Dialog &#246;ffnen: "Hauptmen&#252;->File->Import->Web->WAR file" und den zu importierenden Typ <code>WAR</code> w&#228;hlen:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ImportWARfile.png" alt="Eclipse Import Wizzard - Import Typ WAR file" title="Eclipse Import Wizzard - WAR file" width="525" height="370" class="alignnone size-full wp-image-2068" />
</div>
<p>Button "Next" dr&#252;cken. Im folgenden Dialog muss das zu importierende WAR File im Filesystem selektiert werden. Im "Browse" Dialog zu dem Seam <code>examples/jpa/dist/tomcat6</code> Verzeichnis wechseln und das <code>jboss-seam-jpa.war</code> ausw&#228;hlen. Der Web Projekt Name wird automatisch gew&#228;hlt und sollte erst einmal so gelassen werden. Die Target Server Runtime "Apache Tomcat v6" wurde schon in den Vorbereitungen konfiguriert, so dass dieser auch automatisch vorausgew&#228;hlt wird. Ist keine Server Runtime verf&#252;gbar sollte sie sp&#228;testens jetzt konfiguriert werden.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ImportWARfileBrowse.png" alt="Eclipse Import Wizzard - WAR File ausw&#228;hlen" title="Eclipse Import Wizzard - WAR File ausw&#228;hlen" width="630" height="384" class="alignnone size-full wp-image-2069" />
</div>
<p>Man kann den Dialog eigentlich schon mit dem Button "Finish" beenden. Falls man doch noch mit "Next" weitergeht dann in dem n&#228;chsten Dialog kein JAR selektieren und sp&#228;testens dann mit dem Button "Finish" den Import Wizzard beenden und den eigentlichen Import starten:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/10/SeamTomcatEclipse_ImportJars.png" alt="Eclipse Import Wizzard - WAR Import Web Libraries" title="Eclipse Import Wizzard - WAR Import Web Libraries" width="630" height="360" class="alignnone size-full wp-image-2109" />
</div>
<p>Den Dialog mit dem Button "Finish" beenden. Anschlie&#223;end wird das Eclipse Projekt erstellt und erscheint im Package Explorer wie folgt:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ImportiertesProjekt.png" alt="Eclipse Importiertes Projekt" title="Eclipse Importiertes Projekt" width="630" height="178" class="alignnone size-full wp-image-2070" />
</div>
<h4>Projekt aus Eclispe heraus im Tomcat deployen</h4>
<p>Nun kommt der letzte entscheidende Test ob sich dieses importierte Projekt auch aus Eclipse heraus deployen und aufrufen l&#228;sst. Dazu in der Server View dem Tomcat Server das Projekt zum deployen hinzuf&#252;gen: rechte Maustaste auf den Server->Add and Remove...->"jboss-seam-jpa" Projekt mit Doppelklick hinzuf&#252;gen:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimeAddAndRemove.png" alt="Server Runtime Add and Remove Projekt" title="Server Runtime Add and Remove Projekt" width="525" height="256" class="alignnone size-full wp-image-2071" />
</div>
<p>Mit dem Button "Finish" den Dialog verlassen und den Tomcat Server aus Eclipse heraus starten. In der Console View darf, wie auch vorhin in der Eingabeaufforderung, keine Exception zu sehen sein:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SeamTomcatEclipse_ServerRuntimeGestartet.png" alt="Server Runtime gestartet" title="Server Runtime gestartet" width="630" height="419" class="alignnone size-full wp-image-2072" />
</div>
<p>Der letzte Test ist nat&#252;rlich wieder der Aufruf der Webanwendung im Browser unter der URL "http://localhost:8080/jboss-seam-jpa". Und weil wir uns ja gerade so sch&#246;n in Eclipse bewegen machen wir dies auch direkt im Eclipse eingebetteten Browser. Diesen findet man in der Toolbar als Weltkugel oder &#252;ber das Hauptmen&#252;->Window->Show View->Other...->General->Internal Web Browser.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/09/SEamTomcatEclipse_InternalBrowser.png" alt="Interner Browser in Eclipse" title="Interner Browser in Eclipse" width="630" height="388" class="alignnone size-full wp-image-2073" />
</div>
<p>Auch das hat ohne weiter Probleme funktioniert und nun steht dem erkunden und erweitern des Projekts nichts mehr im Wege.</p>
<h3>Ausblick</h3>
<p>In diesem Tutorial wurde nicht auf das Projekt selbst und auf die verschiedenen Dateien f&#252;r die Konfiguration eingegangen. Das ist nochmal ein eigener Artikel in der nahen Zukunft der beschreiben wird wie man ein Seam Projekt f&#252;r den Tomcat in Eclipse aufsetzt wenn man die Schritte der Konfiguration alle von Hand selbst macht bzw. den Seam Projekt Wizzard verwendet.</p>
<p>Mit diesem Tutorial sollte gezeigt werden wie man relativ einfach an eine funktionierendes Projekt f&#252;r ersten Start mit Seam und JPA unter Tomcat haben kann. Wer sich schon besser mit den einzelnen Frameworks (JPA, Seam, Facelets, JSF, RichFaces, ...) auskennt wird auch einigerma&#223;en schnell die Struktur durchblicken und loslegen k&#246;nnen. Ansonsten eignet sich dieses Projekt auch sehr gut um einfach mal herumzuprobieren und die verschiedenen Technologien kennenzulernen. Auch Tests an den Konfigurationen kann man hier einfach machen denn wer das WAR erst einmal hat und den Import Dialog kennt kann sich das funktionierende Projekt in wenigen Sekunden wiederherstellen.</p>
<p>Viel Spa&#223; beim ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/10/tutorial-erstellung-eines-jboss-seam-eclipse-projekt-auf-tomcat-basis-durch-import-des-jpa-beispiels/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hibernate Validation Annotationen f&#252;r Entity Beans</title>
		<link>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/</link>
		<comments>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:00:53 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=112</guid>
		<description><![CDATA[Einer der wohl gr&#246;&#223;ten Vorteile neben den JPA Annotationen f&#252;r die Beschreibung des Datenbankschemas bei der Verwendung von EJB 3 Entity Beans ist wohl die Nutzung von Validierungs-Annotationen (Constraints) direkt an den Attributen Entity Bean. Verwendet man Hibernate als JPA Implementierung kann man auf ein ganze Menge vordefinierter Validatoren zur&#252;ckgreifen die direkt verf&#252;gbar und durch [...]]]></description>
			<content:encoded><![CDATA[<p>Einer der wohl gr&#246;&#223;ten Vorteile neben den JPA Annotationen f&#252;r die Beschreibung des Datenbankschemas bei der Verwendung von EJB 3 Entity Beans ist wohl die Nutzung von Validierungs-Annotationen (Constraints) direkt an den Attributen Entity Bean. Verwendet man Hibernate als JPA Implementierung kann man auf ein ganze Menge vordefinierter Validatoren zur&#252;ckgreifen die direkt verf&#252;gbar und durch ihre Namen auch selbsterkl&#228;rend sind.</p>
<p>So k&#246;nnte z.B. die Entity Bean &#8220;User&#8221; wie folgt aussehen:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@Entity</span>
<span style="color:#7F0074;"><b>public</b></span> <span style="color:#7F0074;"><b>class</b></span> User {

  <span style="color:#646464">@Id</span>
  <span style="color:#7F0074;"><b>private</b></span> Long id;

  <span style="color:#646464">@Length(min</span> = 5, max = 50)
  <span style="color:#646464">@Pattern</span>(regex=<span style="color:#2A00FF;">"[a-zA-Z0-9]+"</span>)
  <span style="color:#646464">@NotNull</span>
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Email</span>
  <span style="color:#646464">@NotNull</span>
  <span style="color:#7F0074;"><b>private</b></span> String email;

  <span style="color:#646464">@Past</span>
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;

  <span style="color:#3F7F5F">// Getter &#038; Setter</span>
}</pre>
</div>
<p>Der Hibernate Validator arbeitet auf zwei Ebenen mit den Constraints. Zum einen die f&#252;r Anwendungen sehr hilfreiche Funktion des &#8220;In-Memory-Checks&#8221; f&#252;r Instanzen. In diesem Fall wird noch vor der eigentlichen Datenbank Operation gegen die konfigurierten Constraints gepr&#252;ft. Zum anderen k&#246;nnen ein paar Hibernate Constraints direkt in das Datenbankschema &#252;bernommen und somit noch einmal von der Datenbank selbst gepr&#252;ft werden.</p>
<p>Im folgenden noch die Tabelle aller vordefinierten Hibernate Validation Annotationen:</p>
<table class="tableList" style="width: 100%">
<tr>
<td class="tableListHeadline">Annotation</td>
<td class="tableListHeadline">&#220;berpr&#252;fung auf</td>
<td class="tableListHeadline">DB Schema Anpassung</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Length(max=,min=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein String Attribut und pr&#252;ft die Anzahl der Zeichen
</td>
<td class="tableListTdText">
Spaltenl&#228;nge mit max versehen
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Max(value=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob der Wert kleiner oder gleich der Angabe ist
</td>
<td class="tableListTdText">
f&#252;gt &#8220;check&#8221; Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Min(value=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob der Wert gr&#246;&#223;er oder gleich der Angabe ist
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
@NotNull
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert gesetzt ist (nicht <code>null</code>)
</td>
<td class="tableListTdText">
Not Null Constraint an Spalte
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@NotEmpty</code>
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert nicht <code>null</code> und zudem nicht leer (Leerstring) ist
</td>
<td class="tableListTdText">
f&#252;gt f&#252;r einen String das Not Null Constraint an Spalte
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Past</code>
</td>
<td class="tableListTdText">
gilt f&#252;r <code>Date</code> oder <code>Calendar</code> Typen und pr&#252;ft ob das Datum in der Vergangenheit liegt
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Future</code>
</td>
<td class="tableListTdText">
gilt f&#252;r <code>Date</code> oder <code>Calendar</code> Typen und pr&#252;ft ob das Datum in der Zukunft liegt
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Pattern(regex="")</code>
</td>
<td class="tableListTdText">
gilt f&#252;r alle Attribute und pr&#252;ft ob der Wert dem regul&#228;ren Ausdruck entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Range(min=, max=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r eine Zahl (oder eine String welcher eine Zahl repr&#228;sentiert) und pr&#252;ft ob die Zahl in dem Wertebereich zwischen min und max (inklusive) liegt
</td>
<td class="tableListTdText">
f&#252;gt Check Constraint der Spalte hinzu
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Size(min=, max=)</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein Array, Collection oder Map und pr&#252;ft ob die Anzahl der enthaltenen Elemente zwischen min und max (inklusive) liegt
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Email</code>
</td>
<td class="tableListTdText">
gilt f&#252;r einen String und pr&#252;ft ob dieser einer E-Mail Beschreibung laut Spezifikation entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@CreditCardNumber</code>
</td>
<td class="tableListTdText">
gilt f&#252;r einen String und pr&#252;ft ob dieser einer Kreditkartennummer entspricht
</td>
<td class="tableListTdText">
-
</td>
</tr>
<tr>
<td class="tableListTdDesc">
<code>@Valid</code>
</td>
<td class="tableListTdText">
gilt f&#252;r ein Objekt, Collection oder Array und pr&#252;ft deren Validierung ab (bei Collection oder Array rekursiv alle Elemente)
</td>
<td class="tableListTdText">
-
</td>
</tr>
</table>
<p>Mit diesem Set an Hibernate Annotationen d&#252;rfte man die normalen und h&#228;ufigsten Anforderungen an die Validierung erf&#252;llt werden. Das m&#228;chtigste Constraint d&#252;rfte die <code>@Pattern(regex="")</code> sein, die man mit regul&#228;ren Ausdr&#252;cken bef&#252;llen kann.</p>
<p>Als letzte Information in diesem Artikel noch der Hinweis, dass f&#252;r jede Hibernate Annotation ein Standardfehlertext existiert, der aber angepasst werden kann. So kann jede gesetzte Annotation mit einer eigenen Fehlermeldung versehen werden. Daf&#252;r dient das Attribut <code>message</code> und wird in der Exception oder dem <code>InvalidValue</code> Objekt bei einer Constraint Verletzung gesetzt. Hier noch ein Beispiel f&#252;r das Verwenden von Nachrichten:</p>
<div class="codebox">
<pre style="margin:0;padding:0">  <span style="color:#646464">@Length(min</span> = 5, max = 50, message=<span style="color:#2A00FF;">"Username muss zwischen 5 und 50 Zeichen lang sein"</span>)
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Past(message=<span style="color:#2A00FF;">"Der</span> Geburtstag muss in der Vergangenheit liegen"</span>)
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;</pre>
</div>
<p>Nat&#252;rlich kann auch internationalisiert werden. Dazu einfach eine <code>ValidatorMessages.properties</code> bzw. ValidatorMessages_de.properties erstellen und im Classpath ablegen und die entsprechenden keys anpassen oder eigene erstellen:</p>
<div class="codebox">
usernameLength=Username muss zwischen 5 und 50 Zeichen lang sein<br />
bdayPast=Der Geburtstag muss in der Vergangenheit liegen
</div>
<p>Und in der Klassen dann die Keys mit geschweiften Klammern verwenden:</p>
<div class="codebox">
<pre style="margin:0;padding:0">  <span style="color:#646464">@Length(min</span> = 5, max = 50, message=<span style="color:#2A00FF;">"{usernameLength}"</span>)
  <span style="color:#7F0074;"><b>private</b></span> String name;

  <span style="color:#646464">@Past</span>(message=<span style="color:#2A00FF;">"{bdayPast}"</span>)
  <span style="color:#7F0074;"><b>private</b></span> Date birthday;</pre>
</div>
<p>Selbst wenn man die Validierung noch nicht im Frontend eingebaut oder in der Anwendung verwendet lohnt es sich diese in der Entity Bean zu konfigurieren. Neben den direkt im Datenbankschema eingebauten Constraints dient es bei der Entwicklung und Verwendung der Entity Beans absolut der &#220;bersicht und zentralisiert die Vorgaben der Validierung.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/06/hibernate-validation-annotationen-fr-entity-beans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAX 2009: Seam 3 und Web Beans Pr&#228;sentationen</title>
		<link>http://javathreads.de/2009/05/jax-2009-seam-3-und-web-beans-praesentationen/</link>
		<comments>http://javathreads.de/2009/05/jax-2009-seam-3-und-web-beans-praesentationen/#comments</comments>
		<pubDate>Tue, 05 May 2009 21:00:22 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[JSR]]></category>
		<category><![CDATA[JSR 299]]></category>
		<category><![CDATA[Präsentation]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Seam 3]]></category>
		<category><![CDATA[Web Beans]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1449</guid>
		<description><![CDATA[Pete Muir, welcher einer der f&#252;hrenden K&#246;pfe hinter dem Seam sowie Web Beans Projekt ist, hat auf der diesj&#228;hrigen JAX 2009 genau &#252;ber diese beiden Projekte eine Pr&#228;sentation gehalten. Seine Folien hat er nun online gestellt. Beide Pr&#228;sentationen sind im PDF Format und ca 1,2 MB gro&#223;. Diese Themen sind deswegen so interessant, weil die [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://in.relation.to/Bloggers/Pete">Pete Muir</a>, welcher einer der f&#252;hrenden K&#246;pfe hinter dem Seam sowie Web Beans Projekt ist, hat auf der diesj&#228;hrigen JAX 2009 genau &#252;ber diese beiden Projekte eine Pr&#228;sentation gehalten. Seine Folien hat er nun <a href="http://in.relation.to/11203.lace">online gestellt</a>. Beide Pr&#228;sentationen sind im PDF Format und ca 1,2 MB gro&#223;. Diese Themen sind deswegen so interessant, weil die Web Beans Spezifikation (JSR 299) eine der Grundlagen f&#252;r JEE 6 ist. Seam 3 implementiert auch die Web Beans und dient als Bindeglied zwischen JEE und verschiedensten anderen Frameworks.</p>
<table style="width:100%">
<tr>
<td style="text-align:center"><a href="http://www.seamframework.org/service/File/75153"><img src="http://javathreads.de/data/uploads/2009/05/jaxseam3_250.jpg" alt="JAX Pr&#228;sentationsfolien Seam 3" title="JAX Pr&#228;sentationsfolien Seam 3 - 1.2 MB PDF" width="250" height="188" class="alignnone size-full wp-image-1461" /></a></td>
<td style="text-align:center"><a href="http://www.seamframework.org/service/File/75154"><img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans_250.jpg" alt="JAX Pr&#228;sentationsfolien Web Beans" title="JAX Pr&#228;sentationsfolien Web Beans - 1.2 MB PDF" width="250" height="188" class="alignnone size-full wp-image-1462" /></a></td>
</table>
<p>(Auf das jeweile Bild klicken um die PDF Datei direkt herunterzuladen)</p>
<p>Im folgenden m&#246;chte ich noch kurz einen kleinen Auszug aus den Pr&#228;sentationen zeigen, denn diese Folien zeigen sehr sch&#246;n die Kernfunktionalit&#228;ten und Features der Web Beans Spezifikation anhand eines kleinen Code Beispiels.</p>
<p>Zuk&#252;nftig kann jede einfache Java Klasse (POJOs) aber auch Enterprise Java Beans (EJBs) f&#252;r Dependency Injection verwendet werden um sie in anderen Beans zu verwenden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans-1.jpg" alt="Web Beans Beispiel 1" title="Web Beans Beispiel 1" width="482" height="251" class="alignnone size-full wp-image-1472" />
</div>
<p>M&#246;chte man eine Klasse in einer anderen verwenden kann man sie mit der Annotation <code>@Current</code> injectien. Der Binding Type <code>@Current</code> ist der Standardbinding Type und kann verwendet werden wenn man keinen eigenen festgelegt hat und wenn die Zuordnung zur Klassen eindeutig ist:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans-2.jpg" alt="Web Beans Beispiel 2" title="Web Beans Beispiel 2" width="482" height="177" class="alignnone size-full wp-image-1473" />
</div>
<p>W&#252;rde man z.B. ein Interface verwenden und dieses zweimal implementieren kann man <code>@Current</code> nicht mehr verwenden sondern muss eigene Binding Types erstellen. In den mei&#223;ten F&#228;llen arbeitet man allerdings eindeutig, so dass man sich durch diesen Standardbinding Type Arbeit sparen kann.</p>
<p>Die zweite Variante ein Dependency Injection zu erm&#246;glichen ist durch den Konstruktor einer Klasse. Dieser miss mit der Annotation <code>@Initializer</code> annotiert werden damit die durch die Web Beans verwaltete Klasse auch richtig initialisiert wird (&#228;hnlich dem <code>@PostConstruct</code> bei EJB 3.0). Zudem muss man die &#252;bergebene Web Bean nicht mit <code>@Current</code> annotieren weil bei Konstruktoren die Web Beans automatisch injected werden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans-3.jpg" alt="Web Beans Constructor Injection" title="Web Beans Constructor Injection" width="482" height="216" class="alignnone size-full wp-image-1476" />
</div>
<p>M&#246;chte man auf eine Bean mit der Expression Language (EL) zugreifen muss die Bean durch einen Namen bekannt gemacht werden. Dazu dient die Annotation <code>@Named</code>. Dabei kann man der Annotation entweder einen Namen explizit mitgeben oder den Namen der Klasse verwenden. Wird der Name der Klasse verwendet ist auch der erste Buchstabe klein gestellt:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans-4.jpg" alt="Web Bean Names" title="Web Bean Names" width="482" height="276" class="alignnone size-full wp-image-1477" />
</div>
<p>Einmal mit <code>@Named</code> bekannt gemacht kann diese Bean &#252;berall mit EL verwendet werden, wie hier in diesem Beispiel in einer JSF Seite:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/05/jaxwebbeans-5.jpg" alt="JSF Page" title="JSF Page" width="482" height="131" class="alignnone size-full wp-image-1478" />
</div>
<p>Wer noch ein weitere kleine Einf&#252;hrung in Web Beans und somit in JEE 6 haben m&#246;chte sollte sich auch die <a href="http://javathreads.de/2009/03/was-kommt-mit-jee-6-jsr-299-web-beans-praesentation-von-gavin-king/">Pr&#228;sentation von Gavin King &#252;ber die Web Beans</a> anschauen. In diesem Artikel habe ich auch noch ein kleines Beispiel gepostet.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/05/jax-2009-seam-3-und-web-beans-praesentationen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Was kommt mit JEE 6 &#8211; JSR 299 (Web Beans) Pr&#228;sentation von Gavin King</title>
		<link>http://javathreads.de/2009/03/was-kommt-mit-jee-6-jsr-299-web-beans-praesentation-von-gavin-king/</link>
		<comments>http://javathreads.de/2009/03/was-kommt-mit-jee-6-jsr-299-web-beans-praesentation-von-gavin-king/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 11:30:49 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[JSR]]></category>
		<category><![CDATA[JSR 299]]></category>
		<category><![CDATA[Präsentation]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Web Beans]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1312</guid>
		<description><![CDATA[Wer wissen m&#246;chte in welche Richtung es in Java EE 6 geht wird nicht darum herumkommen sich mit dem JSR 299, auch Web Beans genannt, zu besch&#228;ftigen. Der Fokus des JSR 299 liegt auf der Vereinfachung von Dependency Injection in einer JEE Umgebung zwischen allen Schichten und diese auf vielf&#228;ltige Art und Weise. Vor allem [...]]]></description>
			<content:encoded><![CDATA[<p>Wer wissen m&#246;chte in welche Richtung es in Java EE 6 geht wird nicht darum herumkommen sich mit dem <a href="http://www.jcp.org/en/jsr/detail?id=299">JSR 299</a>, auch Web Beans genannt, zu besch&#228;ftigen. Der Fokus des JSR 299 liegt auf der Vereinfachung von Dependency Injection in einer JEE Umgebung zwischen allen Schichten und diese auf vielf&#228;ltige Art und Weise. Vor allem das Problem von der View (JSF oder JSP) auf EJBs einfach zugreifen zu k&#246;nnen soll damit behoben werden aber auch vieles mehr vereinfacht. Web Beans selbst beschreibt sich auf der <a href="http://seamframework.org/WebBeans">Web Beans Webseite</a> in einem Satz so:</p>
<blockquote><p>
Java Contexts and DependencyInjection (JSR-299) is a new Java standard for dependency injection and contextual lifecycle management.
</p></blockquote>
<p>Wer Erfahrung mit dem <a href="http://www.jboss.com/products/seam/">JBoss Seam Framework</a> hat wird viel Vertrautes im JSR 299 wiederfinden denn &#228;hnlich wie f&#252;r die JPA Spezifikation viel von Hibernate &#252;bernommen wurde ist f&#252;r den JSR 299 viel von Seam &#252;bernommen worden.</p>
<div class="subHeadline">Pr&#228;sentationsfolien</div>
<p>Einen kleinen Einblick in JEE 6 und somit auch in den JSR 299 konnte man schon durch den <a href="http://javathreads.de/2009/03/podcast-interview-mit-dan-allen-ueber-seam-und-jee-6/">Podcast von Dan Allen</a> im Teil 2 h&#246;ren. Nun hat Gavin King eine Pr&#228;sentation &#252;ber den JSR 299 gehalten und diese Folien, welche viele Code Beispiele enthalten, online gestellt.</p>
<div class="singleImgDiv">
<a href="http://in.relation.to/Bloggers/JSR299Presentation"><img src="http://javathreads.de/data/uploads/2009/03/jsr299presentation2.jpg" alt="JSR 299 Pr&#228;sentation von Gavin King" title="JSR 299 Pr&#228;sentation von Gavin King" width="600" height="259" class="borderGray alignnone size-full wp-image-1324" /></a>
</div>
<p>Hier ist der <a href="http://in.relation.to/Bloggers/JSR299Presentation">dazugeh&#246;rige Post</a> auf dem &#8220;In Relation To&#8221; Blog (<a href="http://in.relation.to/service/File/10946">Direktdownload des PDFs</a>).</p>
<div class="subHeadline">Code Beipsiele</div>
<p>Einen kleinen Ausschnitt aus der Pr&#228;sentation m&#246;chte ich direkt hier posten und erl&#228;utern um das Grundprinzip von Dependency Injection mit dem JSR 299 in einer Webanwendung zu verdeutlichen.</p>
<p><strong>Binding Types:</strong><br />
Ein Binding Type l&#228;sst einen Client zwischen verschiedenen Implementierungen (Interface) oder Ableitungen (Klassen) eines bestimmten Typs anhand eines Binding Type Namens w&#228;hlen.</p>
<p>Dazu wird erst der eigentliche Binding Type, &#228;hnliche wie ein EJB Intercetpor, definiert:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;">public</span>
<span style="color:#646464">@BindingType</span>
<span style="color:#646464">@Retention</span>(RUNTIME)
<span style="color:#646464">@Target({TYPE,</span> METHOD, FIELD, PARAMETER})
<span style="color:#646464">@interface</span> Informal {}</pre>
</div>
<p>Dieser neue Binding Type mit dem Namen <code>Informal</code> kann nun an einer konkreten Klasse verwendet werden. So wird definiert, dass der Binding Type <code>@Informal</code> zu der konkreten Klasse <code>InformalGreeting</code> geh&#246;rt:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@Informal</span>
<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;InformalGreeting <span style="color:#7F0074;"><b>extends</b></span>&#160;Greeting {
  <span style="color:#7F0074;"><b>public</b></span>&#160;String greet(String name) {
    <span style="color:#7F0074;"><b>return</b></span>&#160;<span style="color:#2A00FF;">"hello "</span> + name;
  }
}</pre>
</div>
<p>Jetzt kommt das eigentliche Dependency Injection in der Bussiness Komponente, die selbst z.B. eine EJB oder auch zuk&#252;nftig durch den JSR 299 einfach nur ein POJO sein k&#246;nnte. Die Klasse <code>Printer</code> erh&#228;lt die Informal-Implementierung des Oberklasse <code>Greeter</code> injected. Das wird durch den neuen definierten Typ mit der Annotation <code>@Informal</code> angegeben.</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;Printer {

  <span style="color:#646464">@Informal</span> Greeting greeting;

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;greet() {
    System.out.println( greeting.greet(<span style="color:#2A00FF;">"Markus"</span>) );
  }
}</pre>
</div>
<p>M&#246;chte man jetzt z.B. noch eine formelle Begr&#252;&#223;ung erm&#246;glichen w&#252;rde man einen zweiten Binding Type erstellen:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;">public</span>
<span style="color:#646464">@BindingType</span>
<span style="color:#646464">@Retention</span>(RUNTIME)
<span style="color:#646464">@Target({TYPE,</span> METHOD, FIELD, PARAMETER})
<span style="color:#646464">@interface</span> Formal {}</pre>
</div>
<p>Diesen definiert man anschlie&#223;end an einer weiteren Ableitung der Klasse <code>Greeting</code>:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@Formal</span>
<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;InformalGreeting <span style="color:#7F0074;"><b>extends</b></span>&#160;Greeting {
  <span style="color:#7F0074;"><b>public</b></span>&#160;String greet(String name) {
    <span style="color:#7F0074;"><b>return</b></span>&#160;<span style="color:#2A00FF;">"hello "</span> + name;
  }
}</pre>
</div>
<p>M&#246;chte man nun in seiner Business Komponente die formale Begr&#252;&#223;ung verwenden tauscht man lediglich die Annotation aus:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;Printer {

  <span style="color:#646464">@Formal</span> Greeting greeting;

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;greet() {
    System.out.println( greeting.greet(<span style="color:#2A00FF;">"Markus"</span>) );
  }
}</pre>
</div>
<p>Mehr &#252;ber Binding Types im JSR 299 kann auch in der <a href="http://docs.jboss.org/webbeans/reference/1.0.0.BETA1/de-DE/html/injection.html#d0e1164">Web Beans Referenzdokumentation</a> sogar auf deutsch nachgelesen werden.</p>
<p><strong>Namen und Scope f&#252;r Zugriff mit EL</strong><br />
Das zweite Beispiel soll zeigen wie einfach es in Zukunft werden soll eine Business Komponente der View via EL (Expression Language) zur Verf&#252;gung zu stellen. Dazu wird der unserer Business Komponente (Klasse) <code>Printer</code> einfach die Annotation <code>@Named</code> hinzugef&#252;gt und somit dieser Java Bean ein Name Vergeben (<a href="http://docs.jboss.org/webbeans/reference/1.0.0.BETA1/de-DE/html/intro.html#d0e484">siehe auch Referenzdokumentation</a>):</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@Named</span>(<span style="color:#2A00FF;">"printer"</span>)
<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;Printer {

  <span style="color:#646464">@Informal</span> Greeting greeting;

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;greet() {
    System.out.println( greeting.greet(<span style="color:#2A00FF;">"Markus"</span>) );
  }
}</pre>
</div>
<p>In der View kann ab sofort &#252;ber den Namen &#8220;<code>printer</code>&#8221; darauf zugegriffen werden:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h:commandButton </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;Say Hello&quot;</span><span style="color: #FF0000; "> action</span><span style="color: #0000FF; ">=&quot;#{printer.greet}&quot;</span><span style="color: #0000FF; ">/&gt;</span></pre>
</div>
<p>Jetzt kann man der Business Komponente noch einen Scope (Geltungsbereich) geben. Bereits <a href="http://docs.jboss.org/webbeans/reference/1.0.0.BETA1/de-DE/html/scopescontexts.html#d0e1698">vorhandene Scopes</a> sind <code>@RequestScoped</code>, <code>@SessionScoped</code>, <code>@ApplicationScoped</code> und <code>@ConversationScoped</code>. In diesem Beispiel wird <code>@RequestScoped</code> verwendet. Somit steht eine Instanz dieser Komponente einen kompletten Request lang zur Verf&#252;gung.<br />
Um die Begr&#252;&#223;ung etwas pers&#246;nlicher zu machen kann man nun noch den Namen f&#252;r die Begr&#252;&#223;ung &#252;ber die View angeben und direkt in der Business Komponente vie EL setzen. Dazu wird noch ein Attribut <code>name</code> ben&#246;tigt:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#646464">@RequestScoped</span>
<span style="color:#646464">@Named</span>(<span style="color:#2A00FF;">"printer"</span>)
<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;Printer {

  <span style="color:#646464">@Informal</span> Greeting greeting;
  <span style="color:#7F0074;"><b>private</b></span>&#160;String name;

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;greet() {
    System.out.println( greeting.greet(name) );
  }

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;setName(String name) { this.name=name; }
  <span style="color:#7F0074;"><b>public</b></span>&#160;String getName() { <span style="color:#7F0074;"><b>return</b></span>&#160;name; }
}</pre>
</div>
<p>Hier die dazugeh&#246;rige angepasste View:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h:form</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h:inputText </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;#{printer.name}&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h:commandButton </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;Say Hello&quot;</span><span style="color: #FF0000; "> action</span><span style="color: #0000FF; ">=&quot;#{printer.greet}&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">h:form</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Die hier aufgezeigten zwei Beispiele zeigen nur einen kleinen Teil des JSR 299. Aber gerade die einfache Annotation <code>@Named</code> und die verf&#252;gbaren Scopes ist ein riesen Schritt in die Vereinfachung der Entwicklung von Webanwendungen. Wie schon erw&#228;hnt sind diese Erneuerungen in JEE 6 heute in JEE 5 durch Seam auch schon m&#246;glich.</p>
<p>Wer mehr &#252;ber den JSR 299 wissen m&#246;chte sollte sich die <a href="http://in.relation.to/Bloggers/JSR299Presentation">Pr&#228;sentation von Gavin King</a>, das <a href="http://jcp.org/en/jsr/detail?id=299">JSR 299 selbst</a>, die <a href="http://docs.jboss.org/webbeans/reference/1.0.0.BETA1/de-DE/html/">Referenzdokumentation</a> sowie die <a href="http://docs.jboss.org/webbeans/reference/1.0.0.ALPHA2/en-US/html/ri.html">Referenzimplementierung mit seinen Beispielen</a> mal genauer anschauen. Alternativ kann man sich nat&#252;rlich auch einfach mit <a href="http://www.jboss.com/products/seam/">JBoss Seam</a> besch&#228;ftigen, welches unter anderem die Basis f&#252;r JSR 299 ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/03/was-kommt-mit-jee-6-jsr-299-web-beans-praesentation-von-gavin-king/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Podcast: Interview mit Dan Allen &#252;ber Seam und JEE 6</title>
		<link>http://javathreads.de/2009/03/podcast-interview-mit-dan-allen-ueber-seam-und-jee-6/</link>
		<comments>http://javathreads.de/2009/03/podcast-interview-mit-dan-allen-ueber-seam-und-jee-6/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 19:00:56 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JEE 6]]></category>
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1240</guid>
		<description><![CDATA[


Wer sich mit Seam besch&#228;ftigt wird den Namen Dan Allen bestimmt schon das ein oder andere mal geh&#246;rt haben. Er ist Commiter bei dem Seam Projekt und arbeitet mittlerweile auch bei JBoss. Vor allem sein Buch &#8220;Seam in Action&#8221; ist sehr zu empfehlen.
Nun wurde Dan Allen vor ein paar Tagen von Ken Rimple von Chariot [...]]]></description>
			<content:encoded><![CDATA[<div style="float:left; margin-right: 30px;">
<a href="http://techcast.chariotsolutions.com/index.php?post_category=podcasts"><img src="http://javathreads.de/data/uploads/2009/03/chariottechcasts-small.jpg" alt="Chariot Tech Casts" title="Chariot Tech Casts" width="200" height="200" class="alignnone size-full wp-image-1296" /></a>
</div>
<p>Wer sich mit <a href="http://www.jboss.com/products/seam/">Seam</a> besch&#228;ftigt wird den Namen <a href="http://www.mojavelinux.com/">Dan Allen</a> bestimmt schon das ein oder andere mal geh&#246;rt haben. Er ist Commiter bei dem Seam Projekt und arbeitet mittlerweile auch bei JBoss. Vor allem sein Buch &#8220;<a href="http://www.manning.com/dallen/">Seam in Action</a>&#8221; ist sehr zu empfehlen.</p>
<p>Nun wurde Dan Allen vor ein paar Tagen von Ken Rimple von <a href="http://techcast.chariotsolutions.com/index.php?post_category=podcasts">Chariot Tech Cast</a> interviewt und dieses Interview kann man sich als Podcast anh&#246;ren bzw. herunterladen. Aufgrund der L&#228;nge des Interviews sind zwei Teile entstanden. Teil 1 ist ca 40 Minuten und Teil 2 ca 30 Minuten lang und beide sind meiner Meinung nach sehr h&#246;renswert.</p>
<div style="height: 30px;"></div>
<p>Im folgenden die Auflistung der in den beiden Teilen besprochenen Themen:<br />
<a href="http://techcast.chariotsolutions.com/index.php?post_id=443923">Themen Teil 1</a> (<a href="http://media.libsyn.com/media/chariottechcast/TechCast-Episode-23-03-16-2009.mp3">Direktdownload mp3</a>):</p>
<ul>
<li>Allgemein &#252;ber das Seam Framework</li>
<li>Unterschied zu Spring und anderen Frameworks</li>
<li>Wie Seam JSF und Pojos sowie EJBs zusammenbringt</li>
<li>Einfacher Einstieg in die JPA API mit Seam</li>
</ul>
<p><a href="http://techcast.chariotsolutions.com/index.php?post_id=444317">Themen Teil 2</a> (<a href="http://media.libsyn.com/media/chariottechcast/TechCast-Episode-24-03-17-2009.mp3">Direktdownload mp3</a>):</p>
<ul>
<li>Die Zukunft mit Java EE 6 inkusive JSR 299 (WebBeans)</li>
<li>Wie wird sich Seam weiterentwickeln wenn die neue JEE Spezifikation steht (Seam 3)</li>
<li>Andere Frontendtechnologien wie z.B. Flex oder nur JavaScript (Ajax)</li>
<li>Seam als Einstieg f&#252;r Workflowmanagement mit jBPM</li>
</ul>
<p>Das ganze Interview ist kurzweilig und sehr interessant. Hat man mit Seam schon gearbeitet und sind die Grunds&#228;tze von Seam klar ist der Teil 2 mit Java EE 6 wohl das interessantere.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/03/podcast-interview-mit-dan-allen-ueber-seam-und-jee-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://media.libsyn.com/media/chariottechcast/TechCast-Episode-24-03-17-2009.mp3" length="31073093" type="audio/mpeg" />
<enclosure url="http://media.libsyn.com/media/chariottechcast/TechCast-Episode-23-03-16-2009.mp3" length="43808728" type="audio/mpeg" />
		</item>
		<item>
		<title>Einf&#252;hrung in Unit Tests mit TestNG unter Eclipse</title>
		<link>http://javathreads.de/2009/02/einfuehrung-in-unit-tests-mit-testng-unter-eclipse/</link>
		<comments>http://javathreads.de/2009/02/einfuehrung-in-unit-tests-mit-testng-unter-eclipse/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 08:00:34 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Eclipse Plugins]]></category>
		<category><![CDATA[TestNG]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=169</guid>
		<description><![CDATA[
Unit Tests sind vielen Entwicklern ein Begriff und in der Java Welt verbindet man diesen Begriff fast automatisch mit dem Testframework JUnit. Dabei steht als genereller Gedanke hinter Unit Tests einzelne kleine Teilbereiche (Units, Methoden, Funktionen) atomar und unabh&#228;ngig von einer Umgebung und Abh&#228;ngigkeiten zu testen. Man geht davon aus, dass wenn die einzelnen kleinen [...]]]></description>
			<content:encoded><![CDATA[<div style="float:left; margin: 5px;"><a href="http://www.amazon.de/Next-Generation-Java-Testing-Advanced/dp/0321503104/ref=sr_1_1?ie=UTF8&#038;s=books-intl-de&#038;qid=1234856702&#038;sr=8-1"><img src="http://javathreads.de/data/uploads/2008/07/testngbuchcover.jpg" alt="" title="Buch: Next Generation Java Testing" width="240" height="240" class="alignnone size-full wp-image-170" /></a></div>
<p>Unit Tests sind vielen Entwicklern ein Begriff und in der Java Welt verbindet man diesen Begriff fast automatisch mit dem Testframework <a href="http://junit.sourceforge.net/">JUnit</a>. Dabei steht als genereller Gedanke hinter Unit Tests einzelne kleine Teilbereiche (Units, Methoden, Funktionen) atomar und unabh&#228;ngig von einer Umgebung und Abh&#228;ngigkeiten zu testen. Man geht davon aus, dass wenn die einzelnen kleinen Teile eines Systems in Ihrerer Aufgabe funktionieren und diese korrekt tun das gro&#223;e Ganze auch Bestand hat. Dabei gelten nur die Zust&#228;nde: Erfolg oder Fehler.</p>
<p>In diesem und folgenden Artikeln soll es um den JUnit Konkurrenten <a href="http://testng.org">TestNG</a> gehen. Das Testframework TestNG ist laut seinem Entwickler Cédric Beust aus der JUnit Frustration entstanden und das NG in TestNG bezieht sich auf <strong>N</strong>ext <strong>G</strong>eneration.</p>
<p>Wer diese Frustration nachlesen m&#246;chte kann dies <a href="http://www.beust.com/weblog/archives/000173.html">hier</a> und <a href="http://www.beust.com/weblog/archives/000082.html">hier</a> tun.</p>
<p>Nicht nur wegen dieser Aussage soll TestNG ein wenig n&#228;her begutachtet werden. Wer z.B. mit <a href="http://seamframework.org/">JBoss Seam</a> arbeitet wird sehr schnell merken, dass Seam von Haus aus eine TestNG Unterst&#252;tzung mitbringt. Auch andere Frameworks setzen auf TestNG. Aber auch ohne diese Frameworks bietet TestNG eine sehr gute Alternative zu dem schon genannten JUnit.</p>
<p>Das Ziel dieses ersten TestNG Artikels ist einfache TestNG Unit-Tests zu erstellen und aus Eclipse heraus ausf&#252;hren zu k&#246;nnen. In folgenden Artikeln wird es mehr in die M&#246;glichkeiten von TestNG und in die Konfiguration von Tests und Testsuites gehen.</p>
<div class="subHeadline">TestNG Bibliothek und Eclipse Plugin</div>
<p>Um TestNG zu verwenden muss die aktuelle Version <a href="http://testng.org/doc/download.html">heruntergeladen</a> werden. Zur Zeit ist die aktuellste Version 5.8 und kann <a href="http://testng.org/testng-5.8.zip">hier direkt</a> heruntergeladen werden.</p>
<p>Es besteht auch eine Eclipse Unterst&#252;tzung f&#252;r TestNG, die &#252;ber eine Update Seite installiert werden kann. Dazu unter Eclipse 3.4 (Ganymede) &#252;ber &#8220;Help->Software Updates&#8230;->Available Software Tab->Add Site&#8230;&#8221; klicken, die TestNG Update Site URL <a href="http://beust.com/eclipse">http://beust.com/eclipse</a> angeben und mit &#8220;OK&#8221; best&#228;tigen. Anschlie&#223;end das neu hinzugef&#252;gte Element aufklappen, das Plugin TestNG selektieren und den Button &#8220;Install&#8221; dr&#252;cken.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/07/testng_eclipsepluginupdateseite.png" alt="" title="Test NG - Eclipse Plugin Update Seite" class="borderGray alignnone size-full wp-image-173" />
</div>
<p>Bei der Installation den Anweisungen folgen. Es kam bei mir ab und an vor, dass bei der Best&#228;tigung f&#252;r die zu installierende Software nur ein leeres Fenster auftrat &#8211; da einfach mit &#8220;OK&#8221; weiter klicken.<br />
Nach dem Neustart von Eclipse steht eine TestNG View zur Verf&#252;gung und kann ge&#246;ffnet werden.</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/07/testng_eclipseview.png" alt="" title="TestNG - Eclipse View" width="257" height="110" class="borderGray alignnone size-full wp-image-174" />
</div>
<div class="subHeadline">TestNG Bibliothek im Classpath angeben</div>
<p>Um TestNG aus Eclipse heraus verwenden zu k&#246;nnen m&#252;ss die TestNG Bibliothek noch im Classpath referenziert werden. TestNG liefert zwei jars aus: eine f&#252;r Java 1.4 (<span class="code">testng-5.8-jdk14.jar</span>) und eine f&#252;r Java 5 (<span class="code">testng-5.8-jdk15.jar</span>). Beide liegen im heruntergeladenen TestNG.zip im Root Verzeichnis oder alternativ im TestNG Eclipse Plugin Ordner (<span class="code">eclipse\plugins\org.testng.eclipse_5.8.0.2\lib</span>). In meinem Fall kopiere ich mir das <span class="code">testng-5.8-jdk15.jar</span> in meinen im Projekt erstellten <span class="code">lib</span> Ordner und gebe dieses im Projekt Classpath an (Rechte Maustaste auf den Projekt Ordner->Properties->Java Build Path).</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/07/testng_buildpath.png" alt="" title="TestNG - Java Build Path" class="borderGray alignnone size-full wp-image-176" />
</div>
<div class="subHeadline">Java Klasse und TestNG Testklasse erstellen</div>
<p>Als Beispielprojekt bzw. Beispiel Source Code der getestet werden soll habe ich ein Java Projekt mit zwei Source Ordnern erstellt. Ich pers&#246;nlich mag es lieber, wenn die Testklassen in einem getrennten Source Ordner liegen. So besteht bei mir der Source Ordner: <span class="code">src</span> und <span class="code">test</span> sowie ein normaler Ordner f&#252;r die ben&#246;tigten Java Bibliotheken <span class="code">lib</span>. Unterhalb der zwei Source Ordern erstelle ich zweimal das gleiche Package. Anschlie&#223;end in dem Ordner <span class="code">src</span> die Klasse <span class="code">de.javathreads.util.Calc</span> und in den Ordner <span class="code">test</span> die Klasse <span class="code">de.javathreads.util.CalcTest</span>. Nach getaner Arbeit sieht die Projektstruktur wie folgt aus:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/07/testng_javaprojektstruktur.png" alt="" title="TestNG - Java Projektstruktur" class="borderGray alignnone size-full wp-image-175" />
</div>
<p>Nun schauen wir uns den Source Code der zwei Klassen etwas genauer an. Die Klasse <span class="code">de.javathreads.util.Calc</span> beinhaltete die einfachen Methoden <span class="code">add()</span> und <span class="code">divide()</span>:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>package</b></span>&#160;de.javathreads.util;

<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;Calc {

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>int</b></span>&#160;add(<span style="color:#7F0074;"><b>int</b></span>&#160;first, <span style="color:#7F0074;"><b>int</b></span>&#160;second) {
    <span style="color:#7F0074;"><b>return</b></span>&#160;fist + second;
  }

  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>double</b></span>&#160;divide(<span style="color:#7F0074;"><b>int</b></span>&#160;first, <span style="color:#7F0074;"><b>int</b></span>&#160;second) {
    <span style="color:#7F0074;"><b>if</b></span>&#160;(second == 0) {
      <span style="color:#7F0074;"><b>throw</b></span>&#160;<span style="color:#7F0074;"><b>new</b></span>&#160;ArithmeticException();
    }
    <span style="color:#7F0074;"><b>return</b></span>&#160;first / second;
  }
}</pre>
</div>
<p>Um mit TestNG eine Methode zu definieren die den eigentlichen Unit-Test enth&#228;lt wird diese mit der Annotation <span class="code">org.testng.annotations.Test</span> versehen. Um abzupr&#252;fen ob das Ergebnis dem erwarteten Ergebnis entspricht arbeitet TestNG mit Java Assertions und dem Schl&#252;sselwort <span class="code">assert</span>. Das sieht dann in meiner <span class="code">CalcTest</span> Klasse, welche die Methode <span class="code">Calc.divide()</span> testen soll, wie folgt aus:</p>
<div class="codebox">
<pre style="margin:0;padding:0"><span style="color:#7F0074;"><b>package</b></span>&#160;de.javathreads.util;

<span style="color:#7F0074;"><b>import</b></span>&#160;org.testng.annotations.Test;

<span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>class</b></span>&#160;CalcTest {

  <span style="color:#3F5FBF">/**
   * Test f&#252;r simples dividieren.
   */</span>
  <span style="color:#646464">@Test</span>
  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;divideSimple() {
    Calc c = <span style="color:#7F0074;"><b>new</b></span>&#160;Calc();
    <span style="color:#7F0074;"><b>double</b></span>&#160;sum = c.divide(4, 2);
    <span style="color:#7F0074;"><b>assert</b></span>&#160;(sum == 2);
  }

  <span style="color:#3F5FBF">/**
   * Test f&#252;r Division durch 0.
   */</span>
  <span style="color:#646464">@Test</span>
  <span style="color:#7F0074;"><b>public</b></span>&#160;<span style="color:#7F0074;"><b>void</b></span>&#160;divideByZero() {
    Calc c = <span style="color:#7F0074;"><b>new</b></span>&#160;Calc();
    <span style="color:#7F0074;"><b>try</b></span>&#160;{
      c.divide(4, 0);
    } <span style="color:#7F0074;"><b>catch</b></span>&#160;(ArithmeticException ex) {
      <span style="color:#7F0074;"><b>assert</b></span>&#160;(true);
      return;
    }
    <span style="color:#7F0074;"><b>assert</b></span>&#160;(false);
  }
}</pre>
</div>
<p>Bei einer Pr&#252;fung mit dem Schl&#252;sselwort <span class="code">assert</span> muss der Ausdruck immer <span class="code">true</span> ergeben. Mehr zu Java Assertions kann auch in dem javathreads Artikel &#8220;<a href="http://javathreads.de/2009/01/reservierte-schluesselwoerter-in-java-assertions/">Reservierte Schl&#252;sselw&#246;rter in Java &#8211; Assertions</a>&#8221; sowie im <a href="http://www.java-blog-buch.de/0609-assertions/">Java Blog Buch</a> gefunden werden.</p>
<div class="subHeadline">Tests ausf&#252;hren</div>
<p>Durch das TestNG Eclipse Plugin ist ein Unit Test sehr einfach durch das Context-Men&#252; direkt aus dem Package Explorer heraus zu starten. Dazu mit der rechten Maustaste direkt auf die Klasse klicken welche die mit <span class="code">@Test</span> annotierten Methoden enth&#228;lt und anschlie&#223;end unterhalb des Men&#252;punkts &#8220;Run As&#8221; den Punkt &#8220;TestNG Test&#8221; anklicken:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/testngcontextmenurunas.jpg" alt="TestNG - Context Men&#252; -&gt; Run As -&gt; TestNG Test" title="TestNG - Context Men&#252; -&gt; Run As -&gt; TestNG Test" width="600" height="222" class="borderGray alignnone size-full wp-image-1112" />
</div>
<p>Es ist auch m&#246;glich auf ein Package zu klicken und somit alle darin liegenden Testklassen zu starten.<br />
Nach einem oder mehreren durchlaufenen Unit-Tests wird das Ergebnis in der TestNG View farblich hervorgehoben. Dabei wird farblich gezeigt ob generell alle Test positiv waren (gr&#252;n) oder mindestens einer fehlgeschlagen ist (rot). Im folgenden ein Screenshot f&#252;r den Fall das alle Tests positiv waren:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/testngresult.png" alt="TestNG - Ergebnisview positiv" title="TestNG - Ergebnisview positiv" width="600" height="177" class="borderGray alignnone size-full wp-image-1113" />
</div>
<p>Ist mindestens ein Test fehlgeschlagen wird der Balken sch&#246;n rot und man die fehlgeschlagene Methode erkennt man durch das rote Kreuz. Selektiert man diesen Test erh&#228;lt man im rechten Fenster die Exception zu dem Fehler. Bei TestNG sind das immer <span class="code">java.lang.AssertionError</span>, wie man im folgenden Screenshot sehen kann:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/testngresultnegative.png" alt="TestNG - Ergebnisview negativ" title="TestNG - Ergebnisview negativ" width="600" height="192" class="borderGray alignnone size-full wp-image-1115" />
</div>
<p>Mit einem Doppelklick auf die Methode gelangt man direkt in den Java Editor an die gew&#252;nschte Stelle der Testklasse. Es w&#228;re nun auch m&#246;glich den Test im Debug Modus zu starten. Dazu anstatt &#8220;Run As&#8221; einfach den Test mit &#8220;Debug As&#8221; starten. Dabei nat&#252;rlich nicht vergessen einen Breakpoint zu setzen ;).</p>
<p>In der Console k&#246;nnen noch die Logausgaben und auch das Gesamtergebnis begutachtet werden. Treten Exceptions in der zu testenden Klasse auf sind diese auch in der Konsole sichtbar. Im folgenden die Konsolenausgabe des Positiven Tests:</p>
<div class="codebox">
[Parser] Running:<br />
  D:\Projekte\Ganymede\02_src\01_trunk\JavaTestNGProject\temp-testng-customsuite.xml</p>
<p>PASSED: divideSimple<br />
PASSED: divideByZero</p>
<p>===============================================<br />
    de.javathreads.util.CalcTest<br />
    Tests run: 2, Failures: 0, Skips: 0<br />
===============================================
</p></div>
<p>Als letzte Information zu dieser kleinen Einf&#252;hrung noch der Hinweis, dass TestNG immer mit XML Konfigurationsdateien arbeitet. Der Vorteil wenn das TestNG Eclipse Plugin verwendet wird liegt darin, dass dieses Plugin die XML Datei generiert. Aktualisiert man im Package View das Projekt (Projekt selektieren und F5 dr&#252;cken) erscheint die Datei <span class="code">temp-testng-customsuite.xml</span>:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/testngxmlconfigfile.png" alt="TestNG - XML generiert Konfigurationsdatei im Projekt" title="TestNG - XML generiert Konfigurationsdatei im Projekt" width="278" height="282" class="borderGray alignnone size-full wp-image-1116" />
</div>
<p>Schaut man in diese Konfigurationsdatei rein sieht man wie der einfachste Fall eines TestNG Tests vie XML konfiguriert werden kann. Die Testklasse wird direkt angegeben:</p>
<div class="codebox">
<pre>&lt;!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"&gt;
&lt;suite name="JavaTestNGProject"&gt;
  &lt;test verbose="2" name="de.javathreads.util.CalcTest" annotations="JDK"&gt;
    &lt;classes&gt;
      &lt;class name="de.javathreads.util.CalcTest"/&gt;
    &lt;/classes&gt;
  &lt;/test&gt;
&lt;/suite&gt;</pre>
</div>
<p>Man kann nat&#252;rlich auch eine solche XML Konfigurationsdatei manuell erstellen und via Eclipse Kontextmen&#252; als TestNG Test ausf&#252;hren. Dazu legt man sie einfach mit im Test-Source Verzeichnis ab.</p>
<div class="subHeadline">Fazit und Ausblick</div>
<p>In diesem Artikel wurde gezeigt wie man TestNG in Eclipse einbindet und das Eclipse Plugin verwenden kann. Zudem wurde ein sehr einfacher Test geschrieben und ausgef&#252;hrt. Grunds&#228;tzlich ist man nun also in der Lage Tests zu schreiben und diese auch auszuf&#252;hren, was den ein oder anderen schon deutlich weiter bringen d&#252;rfte ;).<br />
Im n&#228;chsten Artikel &#252;ber TestNG wird mehr auf die M&#246;glichkeiten mit TestNG eingegangen. Welche Annotationen gibt es und wie kann man sie einsetzen bzw. wo liegen die Vorteile.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/02/einfuehrung-in-unit-tests-mit-testng-unter-eclipse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zwingend den Hibernate Dialekt konfigurieren?</title>
		<link>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/</link>
		<comments>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 21:00:31 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate Dialect]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[persistence.xml]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1085</guid>
		<description><![CDATA[Wer mit Hibernate arbeitet muss eine persistence.xml im Classpath unterhalb des Ordners META-INF liegen haben. Die wichtigsten Konfigurationsparameter sind normalerweise der Transaktionstyp oder der Datasource JNDI Name, der Provider, die Entit&#228;ten (jar Datei oder Klassenangabe) und normalerweise der Datenbankdialekt. Im Regefall sieht sie dann wie folgt (oder &#228;hnlich) aus:

&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;persistence xmlns=&#34;http://java.sun.com/xml/ns/persistence&#34;
  xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit Hibernate arbeitet muss eine <span class="code">persistence.xml</span> im Classpath unterhalb des Ordners <span class="code">META-INF</span> liegen haben. Die wichtigsten Konfigurationsparameter sind normalerweise der Transaktionstyp oder der Datasource JNDI Name, der Provider, die Entit&#228;ten (jar Datei oder Klassenangabe) und normalerweise der Datenbankdialekt. Im Regefall sieht sie dann wie folgt (oder &#228;hnlich) aus:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence </span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">=&quot;http://java.sun.com/xml/ns/persistence&quot;</span><span style="color: #FF0000; ">
  xmlns:xsi</span><span style="color: #0000FF; ">=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span style="color: #FF0000; ">
  xsi:schemaLocation</span><span style="color: #0000FF; ">=&quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;</span><span style="color: #FF0000; ">
  version</span><span style="color: #0000FF; ">=&quot;1.0&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">

  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistence-unit </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;MyEJBApp&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.hibernate.ejb.HibernatePersistence</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">provider</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">java:/MyEJBAppDatasource</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">jta-data-source</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.dialect&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;org.hibernate.dialect.MySQLDialect&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.hbm2ddl.auto&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;validate&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.show_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
      </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.format_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence-unit</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistence</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Der interessante Punkt ist die Angabe des Hibernate Dialekts. Dieser wird mit dem Schl&#252;sselwort <b><span class="code">hibernate.dialect</span></b> konfiguriert:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.dialect&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;org.hibernate.dialect.MySQLDialect&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span></pre>
</div>
<p>Es werden von Hibernate relativ viele Dialekte angeboten, so dass eine breite Unterst&#252;tzung f&#252;r die verschiedenen Datenbanken besteht. Unter den Angebotenen sind die &#252;blichen Verd&#228;chtigen wie z.B.</p>
<ul>
<li>DB2 (<span class="code">org.hibernate.dialect.DB2Dialect</span>)</li>
<li>PostgreSQL (<span class="code">org.hibernate.dialect.PostgreSQLDialect</span>)</li>
<li>MySQL (<span class="code">org.hibernate.dialect.MySQLDialect</span>)</li>
<li>Oracle (<span class="code">org.hibernate.dialect.OracleDialect</span>)</li>
<li>Sybase (<span class="code">org.hibernate.dialect.SybaseDialect</span>)</li>
<li>MS SQL Server (<span class="code">org.hibernate.dialect.SQLServerDialect</span>)</li>
<li>HSQLDB/HypersonicSQL (<span class="code">org.hibernate.dialect.HSQLDialect</span>) </li>
<li>Derby (<span class="code">org.hibernate.dialect.DerbyDialect</span>) </li>
</ul>
<p>und noch einige andere.</p>
<p>Was ich bisher nicht wusste ist, dass die Angabe des Dialektes optional ist. L&#228;sst man die Angabe weg versucht Hibernate die korrekte Implementierung von <span class="code">org.hibernate.dialect.Dialect</span> anhand der JDBC Metadaten herauszufinden die vom JDBC Treiber zur&#252;ckgegeben/geliefert werden.<br />
F&#252;r die g&#228;ngigsten Datenbanken sollte es somit kein Problem sein den Dialekt einfach wegzulassen. Der gro&#223;e Vorteil an dieser Stelle w&#228;re, dass man tats&#228;chlich ein EAR relativ unabh&#228;ngig von der Datenbank ausliefern k&#246;nnte. Entscheidet man sich f&#252;r das weglassen sollte man zumindest den Hibernate Konfigurationsparamater <span class="code"></span> auf <span class="code">validate</span> setzen um eine DB Schemavalidierung beim Starten der Anwendung zu haben.</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.hbm2ddl.auto&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;validate&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span></pre>
</div>
<p>Stimmt etwas mit dem f&#252;r den dynamisch gefundenen Datenbankdialekt das Schema nicht w&#252;rde zumindest eine Exception geworfen werden.</p>
<p>Nachlesen kann man das in der offiziellen Hibernate Dokumenation im <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-optional-dialects">Kapitel 3.4 unter &#8220;Optional configuration properties&#8221;</a>. Gleich der erste beschriebene Parameter ist der <span class="code">hibernate.dialect</span>.<br />
In Kapitel 3.4.1, weiter unten auf dieser Seite, sind zudem alle implementierten Dialekte aufgelistet.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/02/zwingend-den-hibernate-dialekt-konfigurieren/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JBoss RichFaces 3.3.0 GA mit einer Editor Komponente</title>
		<link>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/</link>
		<comments>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 08:00:45 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss Tools]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[RichFaces]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=956</guid>
		<description><![CDATA[Vor ein paar Tagen wurde die JBoss RichFaces 3.3.0 GA als neue Version mit einigen neuen Komponenten ver&#246;ffentlicht. F&#252;r mich und wahrscheinlich f&#252;r viele andere ist das deswegen so interessant, weil ab sofort in den RichFaces ein Rich Editor (WYSIWYG Editor) enthalten ist. Dieser Editor sieht auf der RichFaces Live Demo Seite wie folgt aus:



Man [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen wurde die <a href="http://labs.jboss.com/portal/jbossrichfaces/downloads">JBoss RichFaces 3.3.0 GA</a> als neue Version mit einigen neuen Komponenten <a href="http://in.relation.to/Bloggers/RichFaces330GAAvailable">ver&#246;ffentlicht</a>. F&#252;r mich und wahrscheinlich f&#252;r viele andere ist das deswegen so interessant, weil ab sofort in den RichFaces ein Rich Editor (WYSIWYG Editor) enthalten ist. Dieser Editor sieht auf der <a href="http://livedemo.exadel.com/richfaces-demo/welcome.jsf">RichFaces Live Demo Seite</a> wie folgt aus:</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor"><img src="http://javathreads.de/data/uploads/2009/01/rfeditor.png" alt="" title="RichFaces Rich Editor"  class="borderGray alignnone size-full wp-image-957" /></a>
</div>
<p>Man kann den Funktionsumfang f&#252;r die Formatierungsm&#246;glichkeiten soweit abspecken, dass nur noch das n&#246;tigste f&#252;r den Benutzer m&#246;glich ist:</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor"><img src="http://javathreads.de/data/uploads/2009/01/rfeditorsimple.png" alt="" title="RichFaces Rich Editor Simple" class="borderGray alignnone size-full wp-image-959" /></a>
</div>
<p>Wer den Editor live ausprobieren m&#246;chte kann dies auf der <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor">RichFaces Live Demo</a> direkt tun. Die einfachste Variante den Editor einzubinden und zu verwenden ist:</p>
<div class="code">
<pre>&lt;rich:editor value="#{myBean.editorContent}"/&gt;</pre>
</div>
<p>Die Editor Komponente selbst basiert auf den sehr bekannten <a href="http://tinymce.moxiecode.com/">TinyMCE JavaScript WYSIWYG Editor</a> und bisher musste man, wenn man einen solchen Rich Editor wollte, diesen manuell in sein Projekt einbinden.</p>
<p>Ich werde den Editor die Tage mal ausprobieren und dann wird man sehen ob er sich so einfach einbinden und verwenden l&#228;sst wie es bei den vielen anderen RichFaces Komponenten war.</p>
<p>Neben dem Editor ist noch eine weitere Ajax Komponente hinzugekommen: <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/queue.jsf?c=queue&#038;tab=usage">Ajax Queue</a>. Mit dieser ist es m&#246;glich direkt hintereinander abgesetzte Ajax Request so zu managen, dass der zweite Ajax Request erst abgesetzt wird wenn der erste beendet wurde. Somit kann man parallele Ajax Requests verhindern.</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/queue.jsf?c=queue&#038;tab=usage"><img src="http://javathreads.de/data/uploads/2009/01/rfajaxqueue.png" alt="" title="RichFaces Ajax Queue" class="borderGray alignnone size-full wp-image-963" /></a>
</div>
<div class="subHeadline">JBoss RichFaces als JSF Ajax Framework</div>
<p>Wer bisher noch nichts von den RichFaces bzw. das dazugeh&#246;rige Ajax4Jsf geh&#246;rt hat der sollte sich auf der Live Demo Seite die vielen Beispiele mal ansehen. Neben den fertigen Ajax Komponenten wie z.b. die <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?c=dataTable&#038;tab=dataModel">DataTable</a>, <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/inplaceInput.jsf?c=inplaceInput&#038;tab=usage">Inplace Edit</a>, <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/tree.jsf?c=tree&#038;tab=usage">Tree</a> oder <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=fileUpload&#038;tab=usage">File Upload</a> (um nur einige zu nennen) ist vor allem der Ajax4Jsf Teil sehr interessant. Mit diesem lassen mit einfachen Mitteln bzw. Komponenten normale JSF Seiten &#8220;Ajaxifizieren&#8221; (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/support.jsf?c=support&#038;tab=selects">a4j:support</a>), es lassen sich JavaScript Methoden dynamisch erzeugen (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/jsFunction.jsf?c=jsFunction&#038;tab=usage">a4j:jsfunction</a>) die mit JSF Managed Beans reden oder Teile der JSF Seite neu Rendern oder man kann den Server mit Hilfe von Ajax Anfragen um z.B. einen Status abzufragen (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/poll.jsf?c=poll&#038;tab=usage">a4j:poll</a>).<br />
Pers&#246;nlich finde ich genau diesen Ajax4Jsf Teil und die gesamte Einfachheit der Verwendung der RichFaces Komponenten den Grund warum ich die JBoss RichFaces sehr empfehlen kann.</p>
<p>Noch ein letzter Tipp: Wer mit den RichFaces arbeitet sollte sich auf alle F&#228;lle die <a href="http://javathreads.de/2008/08/jboss-tools-300-alpha1-langsam-geht-es-vorwaerts/">JBoss Tools in Eclipse installieren</a> um die direkte RichFaces Unterst&#252;tzung im JSF Editor zu erhalten. Neben Autocomplete bei den Komponenten, dem Rich Editor f&#252;r JSF oder xhtml Seiten erkennt er auch Expressions und kann auf die Methoden und Beans referenzieren.</p>
<p>Viel Spass beim ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
