{"id":155,"date":"2008-05-20T08:44:00","date_gmt":"2008-05-20T08:44:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=155"},"modified":"2008-05-20T08:44:00","modified_gmt":"2008-05-20T08:44:00","slug":"buchkritik-java-ee-5-development-using-glassfish-application-server","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2008\/05\/buchkritik-java-ee-5-development-using-glassfish-application-server\/","title":{"rendered":"Buchkritik: Java EE 5 Development using GlassFish Application Server"},"content":{"rendered":"<p><em>David Heffelfinger. Packt Publishing. ISBN 1847192602. Oktober 2007. 408 Seiten<\/em><\/p>\n<p>Tr&#228;gt ein Buchtitel eine Technologie und gleichzeitig ein Produkt im Namen, ist das eine schwere Mischung. Entweder wird auf die Administration des Servers eingegangen, oder wir finden ein Lehrbuch, das nur Beispiele lauff&#228;hig auf einem speziellem Produkt vorweisen kann. Heffelfingers Werk geh&#246;rt in keine Kategorie. Der Bezug zu Glassfish ist minimal, und wer mehr sucht als eine kleine Installationsanweisung &#8211; die es auch im Netz bei Sun gibt &#8211;, wird entt&#228;uscht. Da die sauberen Java EE Beispiele den Entwickler nicht an einen speziellen Container binden, sind seine Quellcodes auch auf JBoss oder Geronimo ablauff&#228;hig. Wer nun Java EE lernen m&#246;chte, ist sicherlich darin interessiert, seine Beispiele zumindest auf einem Server laufen zu sehen. Aus Sicht der Zielgruppe eines Buches wohl eher unn&#246;tig einschr&#228;nkend. <\/p>\n<p>Didaktisch und fachlich gibt es das ein oder andere zu bem&#228;ngeln. Einige Quellcode-Snippets bekommen ihr @Override vor den &#252;berschriebenen Servlet-Methoden, andere nicht. Und warum wird der String-Konstruktor laienhaft verwendet? <\/p>\n<p>application.setAttribute(&quot;applicationAttribute&quot;, new String( &quot;This string is accessible accross sessions.&quot;)); <\/p>\n<p>Oder parameterName aus String deklariert, aber sp&#228;ter dennoch einmal explizit gecastet? <\/p>\n<p>String parameterName = (String) initParameterNames.nextElement();    <br \/>out.print(config.getInitParameter((String) parameterName)); <\/p>\n<p>Oder ein StringBuffer statt der guten allen String-Konkatenation eingesetzt? <\/p>\n<p>@Override public String toString() {    <br \/>StringBuffer fullNameBuffer = new StringBuffer();     <br \/>fullNameBuffer.append(firstName);     <br \/>fullNameBuffer.append(&quot; &quot;);     <br \/>fullNameBuffer.append(lastName);     <br \/>return fullNameBuffer.toString();     <br \/>} <\/p>\n<p>Hier ist ein return firstName + &quot; &quot; + lastName; doch wirklich angenehmer zu lesen und auch die Performance gar nicht schlechter. <\/p>\n<p>Ebenso hei&#223;e ich es nicht f&#252;r sinnvoll, auf das MVC-Konzept auch bei JSP\/Servlets zu verzichten. Didaktisch d&#252;rften JSPs eher vor Servlets Sinn ergeben. JSPs gehen mir auch zu fr&#252;h runter auf implizite Objekte und eine Skriptlet-Ebene ohne fr&#252;h schon EL und die Standard-TagLib zu erkl&#228;ren. Die web.xml-Datei bekommt auch immer unterschiedliche Schema-Dateien und Versionen untergeschoben: Einmal 2.4, dann wieder das aktuelle 2.5. Beim Fehlerhandling findet sich: <\/p>\n<p>StringWriter stringWriter = new StringWriter();    <br \/>PrintWriter printWriter = new PrintWriter(stringWriter);     <br \/>exception.printStackTrace(printWriter);     <br \/>out.write(stringWriter.toString()); <\/p>\n<p>Warum der Autor nicht einfach exception.printStackTrace(new PrintWriter(out)); schreibt, ist mir ein R&#228;tsel. (out ist ein JspWriter extends Writer und printStackTrace() m&#246;chte einen PrintStream oder PrintWriter.) Dann ist die Definition einer Bean falsch: &#8222;All of its variables must be private.&#8221; Die von Properties verwendeten Attribute sind in der Regel private, aber sie m&#252;ssen es nicht sein. Auch sind nat&#252;rlich public static final-Konstanten erlaubt. (Wunderbar, dass ausgerechnet im zugeh&#246;rigen Beispiel die Variablen nicht private sind, sondern paketsichtbar.) <\/p>\n<p>Die Datenbank ist mit zehn Tabellen vielleicht f&#252;r Einstiegerbeispiele doch etwas zu kompliziert. Als Leser ist man erschrocken, pl&#246;tzlich ein Servlet zu sehen, welches an die Datenbank geht und SQL-Anweisungen ausf&#252;hrt. Warum sieht man so einen Wahnsinn noch im Jahre 2008? Die Datenbank-Connection wird zudem nicht korrekt im finally-Block geschlossen. Es reicht, auf Seite 120 gebe ich auf und wage den Wiedereinstieg auf Seite 347. (&#220;bersprungen werden Standard TagLibs, JSF, JMS, Security, EJB, Web-Services.) Zum Abschluss ein kleiner H&#246;hepunkt: Heffelfinger geht praktisch auf Facelets ein und zeigt auch ein Beispiel f&#252;r das Templating, ein Weiteres f&#252;r Ajax4jsf und JBoss Seam findet sich ebenso. Ein erneuter Lichtblick: Der Autor verwendet vorbildlich die vorgesehene Dateieindung .jspf f&#252;r inkludierte JSP-Fragmente. Dann noch etwas IDE-Integration (NetBeans und Eclipse) und der Spuk ist vorbei.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>David Heffelfinger. Packt Publishing. ISBN 1847192602. Oktober 2007. 408 Seiten Tr&#228;gt ein Buchtitel eine Technologie und gleichzeitig ein Produkt im Namen, ist das eine schwere Mischung. Entweder wird auf die Administration des Servers eingegangen, oder wir finden ein Lehrbuch, das nur Beispiele lauff&#228;hig auf einem speziellem Produkt vorweisen kann. Heffelfingers Werk geh&#246;rt in keine Kategorie. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[6],"tags":[],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-rezension"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=155"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}