Adam Bien mit JEE 6 am Dienstag bei JUG Darmstadt
Wer Lust hat Adam Bien einmal zu sehen bzw. zu sehen wie und was er mit Java EE 6 macht der sollte am kommenden Dienstag zur Java User Group Darmstadt kommen. Ich werde jedenfalls da sein =).
Mehr dazu auch auf der JUG DA Google Groups Seite.
Java 4-ever Trailer
Java kommt nun auch in Hollywood gut raus, wie der Trailer Java 4-ever und der Starbesetzung mit mit Scala Johansson, Eddie Larrison, William Windows, Mona Lisa Harddrive und Lenny Linux zeigt:
Ein wirklich sehr gut gemachtes Stück Film.
(vielen Dank an Christian Nicoll für den Hinweis!)
11 Tipper – kostenloses Fußball Tippspiel mit JSF und JBoss Seam auf Tomcat Basis geht online
Möchte man ein Framework besser kennenlernen oder bestimmte Problemstellungen nachstellen um brauchbare Lö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ße Herausforderung es auch zu einem halbwegs vernünftigen Abschluss zu bringen. Genau das ist in diesen Tagen bei mir passiert und ich präsentiere pünktlich zur WM 2010 das kostenlose Fußball Tippspiel 11 Tipper.
Wer also ein Tippspiel zur WM oder zur Bundesliga mit Freunden oder Arbeitskollegen veranstalten möchte kann sich auf 11tipper.de eines einrichten.
Wer mehr über das Tippspiel an sich wissen möchte sollte den Artikel auf webthreads.de lesen oder sich die Features auf 11 Tipper direkt ansehen. Es bestehen auch zwei Demo Tipprunden in denen man als Spielleiter oder Tipper herumklicken kann.
Verwendete Frameworks
Jetzt noch ein paar Worte zur Technik. Das Tippspiel wird mit JSF 1.2 und JBoss Seam 2.2.0 entwickelt. Viele kennen JBoss Seam nur auf einem Application Server wie eben den JBoss AS. Ich habe Seam auf einem Tomcat 6 ohne Embedded JBoss verwendet. Es wird somit anstatt auf EJBs voll auf POJOs gesetzt und auch nicht so getan als wäre mann auf einem Application Server. Die Persistenz ist mit JPA (Hibernate) umgesetzt. Seam verwendet zur Validierung der Eingaben an der Oberfläche die JPA Annotationen an den Entities. Für Timer und zeitliche Verzögerungen wird Quarz verwendet. Das Frontend ist mit Facelets und JBoss RichFaces 3.3 umgesetzt. Verfeinert wird das Ganze mit viel Ajax und jQuery 1.4 als JavaScript Bibliothek.
In der Vergangenheit sind schon ein paar Artikel aus den Erkenntnissen dieses Projekts hier auf javathreads.de veröffentlicht worden. Und ich werde wohl noch das ein oder andere Tutorial dazu hier in naher Zukunft veröffentlichen. Falls jemand eine bestimmte Frage zur Umsetzung hat dann nur raus damit ich antworte garantiert =).
Begriffe “Endlosschleife” und “Rekursion” anschaulich durch Buch Glossar erklärt
Habe ein eingescanntes Bild aus einem Programmier-Buch Glossar gefunden der anschaulich die “Endlosschleife” und die “Rekursion” erklärt.
Zuerst die eingescannten Bilder für die Endlosschleife “infinite loop”:
Und hier noch der Ausschnitt für die Rekursion:
Wer es jetzt noch nicht verstanden hat..
Mit JAXB einfach von XML Daten zu Java Objekten
Eine Variante mit XML in Java zu arbeiten ist die Java Architecture for XML Binding, besser bekannt unter JAXB. Mit JAXB kann man sehr einfach Java Objekte als XML Datei speichern (marshal) und umgekehrt eine XML Datei wieder in ein Java Objekt laden (unmarshal). So kann man z.B. Daten sehr einfach austauschen oder persistieren. Implementiert man einen Webservice mit JAX-WS (Java API for XML – Web Services) werden z.B. die Daten die ausgetauscht werden mit JAX-B Annotationen versehen und via XML ausgetauscht. Das Umwandeln des Java Objekts zu XML und wieder zurück übernimmt dabei JAXB.
In meinem Anwendungsfall habe ich eine Online Schnittstelle die mir die Ergebnisse zu Spieltagen der Bundesliga als XML liefert. Ziel ist es diese Informationen so einfach wie möglich in meine Java Anwendung zu bekommen. Mit Hilfe von JAXB sollen diese XML Informationen zu Java Objekten umgewandelt werden, so dass man damit einfach weiterarbeiten kann. Dieser Vorgang wird unmarshal genannt und erzeugt eine Objekt Struktur die den Inhalt und den Aufbau der XML Datei repräsentiert.
Die erzeugte Objektstruktur ist aber kein DOM basierter Baum, wie manchmal angenommen wird, sondern ein normale Java Objekte, die wieder Referenzen auf weitere Java Objekte haben.
Die XML die ich geliefert bekomme und zu Java Objekten mit JAXB unmarshallen möchte sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?> <spieltag> <game> <spieltag>28</spieltag> <nummer>1</nummer> <beginn>2010-03-26 20:30:00</beginn> <mannschaft_heim><![CDATA[VfL Bochum]]></mannschaft_heim> <mannschaft_gast><![CDATA[Eintracht Frankfurt]]></mannschaft_gast> <tore_heim_halbzeit>1</tore_heim_halbzeit> <tore_gast_halbzeit>1</tore_gast_halbzeit> <tore_heim_ergebnis>1</tore_heim_ergebnis> <tore_gast_ergebnis>2</tore_gast_ergebnis> </game> <game> <spieltag>28</spieltag> <nummer>2</nummer> <beginn>2010-03-27 15:30:00</beginn> <mannschaft_heim><![CDATA[Bayern München]]></mannschaft_heim> <mannschaft_gast><![CDATA[VfB Stuttgart]]></mannschaft_gast> <tore_heim_halbzeit></tore_heim_halbzeit> <tore_gast_halbzeit></tore_gast_halbzeit> <tore_heim_ergebnis></tore_heim_ergebnis> <tore_gast_ergebnis></tore_gast_ergebnis> </game> ... </spieltag>
Um mit JAXB von der XML Datei zu Java Objekten zu gelangen benötigt man die Beschreibung des Mappings mit JAXB Annotationen in Java Klassen. Da in diesem Fall die XML Datei vorliegt ist der einfachste Weg sich die Klassen mit den Annotationen generieren zu lassen. Dazu benötigt man das XML Schema zu zu der XML Datei.
In meinem Fall habe noch kein Schema für diese XML Struktur. Eines jetzt von Hand zu erstellen wäre möglich aber sehr aufwendig. An dieser Stelle kommt das kleine Java Tool Namens Trang ins Spiel.
Dazu die letzte Version aus 2008 herunterladen (Direktlink) und an einem Ort der Wahl entpacken. Anschließend die XML Datei der Einfachheit halber auch mit in diese Ordner kopieren und darauf achten, dass sie mit UTF-8 enkodiert ist. Um das Schema zu erzeugen einfach das trang.jar mit zwei Parametern aufrufen:
Das von Trang generierte Schema sieht bei mir wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="spieltag"> <xs:complexType mixed="true"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="game"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="game"> <xs:complexType> <xs:sequence> <xs:element ref="spieltag"/> <xs:element ref="nummer"/> <xs:element ref="beginn"/> <xs:element ref="mannschaft_heim"/> <xs:element ref="mannschaft_gast"/> <xs:element ref="tore_heim_halbzeit"/> <xs:element ref="tore_gast_halbzeit"/> <xs:element ref="tore_heim_ergebnis"/> <xs:element ref="tore_gast_ergebnis"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="nummer" type="xs:integer"/> <xs:element name="beginn" type="xs:string"/> <xs:element name="mannschaft_heim" type="xs:string"/> <xs:element name="mannschaft_gast" type="xs:string"/> <xs:element name="tore_heim_halbzeit" type="xs:string"/> <xs:element name="tore_gast_halbzeit" type="xs:string"/> <xs:element name="tore_heim_ergebnis" type="xs:string"/> <xs:element name="tore_gast_ergebnis" type="xs:string"/> </xs:schema>
Das JDK liefert einen Binding Compiler für JAXB mit dem Namen XJC mit aus der im /bin Verzeichnis unterhalb der Java Runtime zu finden ist. Damit kann man aus einem XML Schema die entsprechenden Java Klassen generieren lassen, aus denen dann beim späteren unmarshal Prozess die Java Objekte erstellt werden.
Der Aufruf des Binding Compiler verwendet in diesem Beispiel zwei Parameter. Der Paramter d definiert das Verzeichnis in dem die Klassen gespeichert werden sollen, bei mir das Verzeichnis src relativ zum aktuellen Verzeichnis, und der Paramter p definiert das Java Package in dem die Klassen liegen sollen. Als letztes wird das XML Schema angegeben aus dem die Java Klassen generiert werden sollen:
Für die obige XML Datei wurden drei Klassen generiert:
Im folgenden der interessante Teil aus der klasse Game mit JAXB Annotationen:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "spieltag", "nummer", "beginn", "mannschaftHeim", "mannschaftGast", "toreHeimHalbzeit", "toreGastHalbzeit", "toreHeimErgebnis", "toreGastErgebnis" }) @XmlRootElement(name = "game") public class Game { @XmlElement(required = true) protected Spieltag spieltag; @XmlElement(required = true) protected BigInteger nummer; @XmlElement(required = true) protected String beginn; @XmlElement(name = "mannschaft_heim", required = true) protected String mannschaftHeim; @XmlElement(name = "mannschaft_gast", required = true) protected String mannschaftGast; @XmlElement(name = "tore_heim_halbzeit", required = true) protected String toreHeimHalbzeit; @XmlElement(name = "tore_gast_halbzeit", required = true) protected String toreGastHalbzeit; @XmlElement(name = "tore_heim_ergebnis", required = true) protected String toreHeimErgebnis; @XmlElement(name = "tore_gast_ergebnis", required = true) protected String toreGastErgebnis; // Getter und Setter }
Man kann an diesem Beispiel sehr schön das Mapping zwischen XML Element und Attribut mit der Annotation @XmlElement sehen:
Es gibt noch weitaus komplizierte JAXB Konfigurationen von daher empfiehlt es sich eigentlich immer sich die fehlende Gegenseite, wie in diesem Beispiel die Java Klassen, generieren zu lassen. Auch der andere Weg, das marshalling von Java Objektbäumen zu einer XML Datei, lässt sich sehr einfach generieren.
Nun kommt der wichtigste Teil des Tutorials, nämlich die eigentliche Anwendung von JAXB. Die XML Datei soll als Java Objektstruktur zur Verfügung stehen, so dass die Daten einfach weiterverarbeitet werden können. Dieser Weg wird, wie am Anfang beschrieben, unmarshal genannt. Bis zum Java Objekt sind es an dieser Stelle nur noch drei Zeilen:
- JAXBContext Objekt erstellen, welches einem Zugriff auf die JAXB API ermöglicht. Dabei wird als Parameter ein oder mehrere Packages zu den generierten Klassen mit den JAXB Annotationen benötigt:
JAXBContext jc = JAXBContext.newInstance("de.javathreads.jaxb"); - Unmarshaller Objekt vom JAXBContext erstellen:
Unmarshaller unmarshaller = jc.createUnmarshaller(); - Die
unmarshal()Methode aus dem Unmarshaller Objekt aufrufem um den unmarshalling Prozess zu starten. Als Parameter wird dabei die zu parsende XML Datei erwartet und als Rückgabewert erhält man das entsprechende Objekt für das Root Element der XML Datei. In meinem Beispiel ist das die KlasseSpieltag, welche vom Unmarshaller zurückgegeben wird:Spieltag sp = (Spieltag) unmarshaller.unmarshal(new File("D:\\projects\\TipResultParser\\xml\\spieltag.xml"));
Jetzt kann man direkt mit der Objektrepräsentation der XML Datei auf Java Ebene arbeiten. Noch einmal der Hinweis, dass es sich bei diesen Objekten nicht um ein DOM basierten Baum handelt sondern um reine Content-Objekte, welche den Inhalt und die Struktur der XML Datei wiedergeben.
Als letztes noch mal der komplette Code an einem Stück für die bessere Übersicht:
package de.javathreads.jaxb; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; public class Main { public static void main(String[] args) throws Exception { // Package JAXBContext jc = JAXBContext.newInstance("de.javathreads.jaxb"); Unmarshaller unmarshaller = jc.createUnmarshaller(); Spieltag sp = (Spieltag) unmarshaller.unmarshal(new File("D:\\projects\\TipResultParser\\xml\\spieltag.xml")); for (int i = 0; i < sp.getContent().size(); i++) { if (sp.getContent().get(i) instanceof Game) { Game g = (Game) sp.getContent().get(i); System.out.println("Spiel: " + g.getNummer()); } } } }
Ausgabe auf der Konsole:
Spiel: 2
…
Hinweis zu dem Code bezüglich der Prüfung mit instanceof Game. Die XML Schnittstelle liefert den Inhalt formatiert und somit mit Sonderzeichen wie “\t” und “\n” zurück, so dass diese Zeichen als Content direkt hinter dem XML Tag beim unmarshal Prozess erkannt wurden. Die Liste, die mir sp.getContent() zurückliefert, enthält abwechselnd den String “\t\t\n” und ein Game Objekt. Das ist aber nicht die Regel und ich muss mal schauen ob ich dieses Verhalten nicht noch irgendwie abstellen kann.
Die Grafiken wurden aus dem offiziellen Sun Artikel “Java Architecture for XML Binding (JAXB)” entnommen. Dort findet man auch eine ausführliche Anleitung für den marhall Vorgang, wenn man Java Objekte zu einer XML Datei marshallen möchte.
Kostenloses Buch für die Android Entwicklung
Ein kleiner Hinweis für alle die mal einen kleinen Einblick in die Android Entwicklung erhalten möchten ist das kostenlose Buch “Android – Grundlagen und Programmierung” (DPunkt Verlag) von Arno Becker und Marcus Pant als PDF.
Als kleinen Haken könnte man evtl. sehen, dass die Beispiele in dem Buch sich allesamt auf das Android SDK 1.1 beziehen. Auf der Webseite der Autoren sind die Beispiele für das Android SDK 1.5 aktualisiert vorhanden.
Die neue Auflage des Buches mit dem Titel “Android 2″ erscheint im Mai 2010 und basiert dann auf dem aktuellen SDK 2.1. Somit ist diese kostenlose Herausgabe des Buches als PDF Version ein geschickte Werbung.
Codequalität in der Softwareentwicklung..
Allein der Wille zählt!
History of Web Frameworks
Eine wirklich interessante Grafik wurde vor kurzem auf flickr unter dem Titel “History of Web Frameworks” veröffentlicht. Das Besondere an der Grafik ist die zeitliche Anordnung der verschiedenen Frameworks. Darunter sind auch die gä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:
Wer eine größere Version sehen oder herunterladen möchte sollte sich diese direkt auf flickr.com ansehen.
JavaFX ist offizielle Rich Client Technologie der Olympischen Winterspiele 2010
Ein interessanter Marketing-Schachzug in Sachen Rich Client Technologien ist Sun Oracle mit JavaFX im Bezug auf die aktuell laufenden Olympischen Winterspiele gelungen denn sie weisen sich als die offiziell verwendete Rich Client Technologie für die vancouver2010.com Webseite aus. Man findet sogar ein Werbevideo auf der eigens eingerichteten Unterseite auf javafx.com/wintergames:
Auf den ersten Blick der offiziellen Winterspiele Webseite sieht man JavaFX nicht. Erst in der Medaillenübersicht in dem Unterpunkt Geo View wird JavaFX verwendet. Die Applikation heißt “Medal Wheel” und in Ihrem Story Board (PDF Direktlink) heißt es wie folgt:
The applications built for the Vancouver 2010 Winter Games combine the power of Java™ technology with the innovative data visualization and exploration capabilities of the JavaFX platform.
Schaut man sich die Medal Wheel Anwendung an so sieht man direkt im Einstieg grafisch hervorgehoben die Verteilung der Medaillen:
Klickt man anschließend auf ein Land erhält man noch weitere Information in einem Informationsrad:
Auch hier kann man noch einen Schritt tiefer und zusätzliche Informationen zu den verschiedenen “Nachbarn” des Landes erfahren:
Neben der aktuellen Medaillenverteilung kann man auch alle historischen Ergebnisse studieren und grafisch auf sich wirken lassen.
Des Weiteren wird auch noch von einem Results Ticker Widget für den Desktop berichtet, allerdings habe ich dieses bis jetzt nicht finden können.
Oracle hat dafür auch extra eine Pressemitteilung veröffentlicht. Und wem das auch nicht genug ist der sollte sich zudem noch die Success Story als PDF herunterladen und durchlesen.
Zum Abschluss noch ein kurzes Wort zu JavaFX. JavaFX könnte man als Sun’s Antwort auf Adobe Flex oder Microsoft Silverlight sehen und positioniert sich im Sektor der Rich Client Plattformen. Dabei beschränkt sich die Darstellung von JavaFX Applikationen nicht nur auf Browser sondern soll auf allen Endgeräten, vor allem mobilen, direkt verfügbar sein. Für den Interessierten an dieser Stelle noch der Hinweis auf die DZone Refcardz mit der JavaFX Ausgabe:
Insgesamt kann man wohl sagen, dass es mit dieser Medal Wheel Anwendung ein großer Marketing-Coup gelungen ist. So erwartet man mehrere Millionen Zugriffe auf der Webseite und man darf gespannt sein wie das Fazit, falls eins gezogen wird, ausfällt.
Wir Entwickler brauchen einfach mehr Unterstützung..
.. mehr Verständnis oder einfach mal eine Umarmung, wie auch das Video “Hug a developer today” sehr schön aufzeigt:
Falls einem das Video doch zu theatralisch ist dann lieber jeden Morgen mit der folgenden kleinen Motivation, ganz speziell für dich Entwickler, von Steve Ballmer aufstehen:
Die Welt als Entwickler könnte so schön sein..
;)














