Zu diesem Kurzfilm braucht man eigentlich nichts mehr zu sagen außer, unbedingt angucken und die Botschaft begreifen.
Manchmal möchte man nur wissen, wie lange das eigene Java Programm gebraucht hat. Wenn man sich mit der Angabe von Millisekunden begnügt ist dies ein Zweizeiler.
Date start=new Date(); // do something System.out.println("Anzahl Millisekunden: " +(System.currentTimeMillis() - start.getTime());
Möchte man allerdings bei etwas länger laufenden Programmen nicht in Stunden und Minuten umrechnen müssen, so wird es etwas schwieriger. Was bekommt man im Internet nicht alles für Ratschläge, dabei muss man das Rad gar nicht neu erfinden. Ein Blick auf die Apache Commons Bibliotheken hilft hier wie so oft weiter.
import org.apache.commons.lang.time.DurationFormatUtils; ... Date start=new Date(); // do something System.out.println("Laufzeit: " +DurationFormatUtils.formatDuration(System.currentTimeMillis() - start.getTime(),"HH:mm:ss");
Alle Präsentationen der diesjährigen JAX erhalten die Teilnehmer diesmal nicht auf DVD, sondern nur noch über eine Adobe AIR Anwendung, für die man sich auf http://intellibook.de/special registrieren muss.
Adobe AIR ist wie Flash nicht gerade Resourcen schonend und muss (wie Flash auch) erst einmal auf dem Rechner installiert werden. Eine Webanwendung wäre mir lieber gewesen.
Einige Sprecher waren aber so nett, ihre Vorträge auf slideshare.net zur Verfügung zu stellen. Bei slideshare gibt es zwar die Möglichkeit Events einzurichten, diese wurde aber für die diesjährige Veranstaltung nicht genutzt, so dass die Präsentationen quer gestreut sind.
Ich bin mal auf die Suche gegangen und habe die Treffer unter dem Tag jax 2010 zusammengefasst. Falls ich einen übersehen haben sollte, bitte ich im Voraus schon um Entschuldigung und würde mich über einen Link in den Kommentaren freuen.
Ähnliche Artikel:Wenn ich momentan eine Java Webapplikation bauen müsste, würde ich sie wahrscheinlich mit dem Spring Framework umsetzen. Im Rahmen der Jax 2010 hat Jürgen Höller (einer der Chefentwickler von Spring) einen Rückblick, eine Bestandsaufnahme und einen Ausblick auf Spring gegeben.
Danach spielte und spielt Spring, wie viele andere Frameworks und alternative Technologien (wie z.B. SWT und GWT), aus seiner Sicht vor allem in der Rolle als Plattform und Standards “Enabler” eine große Rolle. D.h., dass Frameworks innovativer sind und höhere Release Zyklen aufweisen als Standards, wie z.B. JPA. Sie bieten vielmehr sogar die Möglichkeit neue Standards in bestehende Umgebungen zu integrieren.So ist es mit Spring 3.0 möglich Anwendungen zu entwickeln, die Standards wie JPA 2.0 oder JSF 2.0 nutzen und trotzdem auch auf älteren JBoss, Websphere oder sogar Tomcat Installationen laufen können.
Diese integrative Rolle wird laut Jürgen Höller auch weiterhin den Weg von Spring bestimmen. Dabei sind für Juni/Juli 2010 die Version 3.1 und in 2011 auch die Version 3.2 vorgesehen. Diese werden wie in der Vergangenheit durch Milestone Releases immer nah an den neuesten Versionen der Standards gehalten oder sind ihnen sogar einen kleinen Schritt voraus.
Ähnliche Artikel:Wer sich nicht erst seit Grails mit Webanwendungen auf Java Basis beschäftigt, dem dürfte die JSP Taglib displaytag ein Begriff sein.
Displaytag ermöglicht es ohne große Klimmzüge Tabellen in Java Server Pages auf mehrere Seiten aufzuteilen (Paging), zu sortieren, zu gruppieren und nach Excel, Csv, Xml und Pdf zu exportieren.
Grails unterstützt “out of the box” nur das Paging und lange Zeit konnte man keine JSP Tag Libs in Grails verwenden, so dass man die restlichen Funktionalitäten entweder durch Plugins abbilden konnte oder selbst Hand anlegen musste.
Seit Grails 1.1 ist diese Beschränkung nun aufgehoben und der Test die beiden zu vereinen ist schon seit längerem erfolgreich abgeschlossen. Nur der Blog Eintrag darüber steht seit dem noch auf meiner ToDo Liste. Aber was lange währt wird gut (hoffe ich
).
Folgende Schritte sind zur Integration von displaytag in Grails notwendig:
libs
Zuerst sollten die Displaytag Bibliotheken neben dem Datenbank Treiber ins lib Verzeichnis kopiert werden.

Displaytag Konfigurationsdatei
Die Konfigurationsdatei von displaytag displaytag.properties muss unter src/java erstellt werden. Der Aufbau dieser Datei ist in der Doku von displaytag beschrieben. Für mein grum Projekt sieht die Konfiguration so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | export.types=csv excel xml pdf export.excel=true export.csv=true export.xml=true export.pdf=true export.excel.class=org.displaytag.export.excel.DefaultHssfExportView export.pdf.class=org.displaytag.export.DefaultPdfExportView export.rtf.class=org.displaytag.export.DefaultRtfExportView export.banner=<div class="exportlinks">Export to: {0}</div> export.amount=list paging.banner.placement=bottom basic.msg.empty_list=No data found. basic.msg.empty_list_row=<tr class="empty"><td colspan="0">No data found.</td></tr></tr> paging.banner.full=<span class="pagelinks"><a href="{1}"><strong><<</strong></a> <a href="{2}"><strong><</strong></a> {0} <a href="{3}"><strong>></strong></a> <a href="{4}"><strong>>></strong></a></span> paging.banner.first=<span class="pagelinks"> {0} <a href="{3}"><strong>></strong></a> <a href="{4}"><strong>>></strong></a></span> paging.banner.last=<span class="pagelinks"><a href="{1}"><strong><<</strong></a> <a href="{2}"><strong><</strong></a> {0} </span> paging.banner.one_item_found=<span class="pagebanner">1 Record found. Seite: </span> paging.banner.all_items_found=<span class="pagebanner"> {0} Records found. Seite: </span> paging.banner.some_items_found=<span class="pagebanner"> {0} Records found, show {2} - {3}. </span><br /><br /> |
Displaytag Wrapper
Dynamische Links und Formatierungen werden in displaytag über das Decorator Pattern umgesetzt. Der Decorator wird in einer Wrapper Klasse implementiert, die in Grails natürlich in Groovy geschrieben ist. Meine Implementierung ist die Klasse DisplaytagWrapper, die im grum Projekt einen Link zu den Details der Benutzer erstellt und das Erstellungsdatum formatiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package de.koo.grum.groovy.util import org.displaytag.decorator.TableDecorator; public class DisplaytagWrapper extends TableDecorator{ String getLinkToUser() { def user = getCurrentRowObject() return "<a href=\"/grum/user/show/${user.id}\">${user.username}</a>"; } String getUserCreatedAt() { def user = getCurrentRowObject() return user.createdAt.format("dd.MM.yyyy HH:mm"); } } |
Export Filter
Beim Export in ein nicht HTML Format muss der content type für die Antwort an den Browser neu gesetzt werden. Damit dies nicht zu Problemen führt, sollte ein Filter in der web.xml Datei definiert werden, der möglichen Fehlern entgegenwirkt. Displaytag bringt mit der Klasse ResponseOverrideFilter bereits eine Implementierung dafür mit.
Um in Grails Änderungen an der web.xml vornehmen zu können, müssen die Templates installiert werden:
grails install-templates
Danach befindet sich die web.xml im Verzeichnis src/templates/war. Für den Filter sind folgende Einträge notwendig.
1 2 3 4 5 6 7 8 | <filter> <filter-name>ResponseOverrideFilter</filter-name> <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Einbindung in Groovy Server Page
Hat man diese ganzen vorbereitenden Schritte absolviert, kann man sich endlich an die Verwendung von displaytag in einer Groovy Server Page machen.
In meinem Beispiel user/list.gsp werden alle Benutzerdaten tabellarisch angezeigt. Die Tabelle ist durch das Attribut sortable nach Vor- und Nachnamen sortierbar (ohne erneuten Datenbankzugriff) und wird beim Erreichen der pagesize über das Attribut partialList auf mehrere Seiten verteilt.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <%@ taglib uri="http://displaytag.sf.net" prefix="display" %> <html> .. <display:table name="userList" defaultsort="1" partialList="true" decorator="de.koo.grum.groovy.util.DisplaytagWrapper" size="${resultSize}" pagesize="${pageSize}" requestURI="/grum/user/list" class="listing" cellpadding="0" cellspacing="0" sort="list"> <display:column property="linkToUser" title="Userame" /> <display:column property="firstname" title="Firstame" sortable="true"/> <display:column property="lastname" title="Lastname" sortable="true"/> <display:column property="userCreatedAt" title="Created At" sortable="true"/> </display:table> ... |
Über zusätzliche Attribute (export, group) kann wie im Beispiel contactData/list.gsp auch der Export in die verschiedenen Ausgabeformate und eine Gruppierung der Einträge erreicht werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <display:table name="contactDataList" export="true" defaultsort="1" partialList="true" decorator="de.koo.grum.groovy.util.DisplaytagWrapper" size="${resultSize}" pagesize="${pageSize}" requestURI="/grum/contactData/list" class="listing" cellpadding="0" cellspacing="0" sort="list"> <display:setProperty name="export.csv.filename" value="contactData.csv" /> <display:setProperty name="export.excel.filename" value="contactData.xls" /> <display:setProperty name="export.xml.filename" value="contactData.xml" /> <display:setProperty name="export.pdf.filename" value="contactData.pdf" /> <display:setProperty name="export.amount" value="list" /> <display:column property="linkContactDataToUser" title="Name" sortable="true" group="1"/> <display:column property="type" title="type" sortable="true" /> <display:column property="data" sortable="true" /> </display:table> |
Fazit:
Einmal konfiguriert ist displaytag eine der tollsten Lösungen für java basierte Webanwendungen um Daten tabellarisch aufzulisten. Der Funktionsumfang übertrifft dabei weit die Standard Funktionalität von Grails. Die Kombination von Grails und displaytag kann ich daher nur jedem empfehlen.
Links:
grum Quellcode




