Mar 05

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>&lt;&lt;</strong></a>&nbsp;&nbsp;&nbsp;<a href="{2}"><strong>&lt;</strong></a>&nbsp; {0} &nbsp;<a href="{3}"><strong>&gt;</strong></a>&nbsp;&nbsp;&nbsp;<a href="{4}"><strong>&gt;&gt;</strong></a></span>
paging.banner.first=<span class="pagelinks"> {0} &nbsp;<a href="{3}"><strong>&gt;</strong></a>&nbsp;&nbsp;&nbsp;<a href="{4}"><strong>&gt;&gt;</strong></a></span>
paging.banner.last=<span class="pagelinks"><a href="{1}"><strong>&lt;&lt;</strong></a>&nbsp;&nbsp;&nbsp;<a href="{2}"><strong>&lt;</strong></a>&nbsp; {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

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , ,

Jan 14

Als Administrator sollte man beim Anlegen von Benutzern Passwörter wählen, die nicht gerade 123456 heißen. Da aber auch die Fantasy eines Administrators begrenzt ist, lässt man sich am besten eines generieren.
Eine Groovy Klasse für einen Passwort Generator könnte so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PasswortGenerator{
   public static void main(def args){
      def availChars = []  
      ('A'..'Z').each { availChars << it.toString() }  
      3.times { (0..9).each { availChars << it.toString() } }  
 
      def generateRandomString = { length ->   
        def max = availChars.size      
        def rnd = new Random()  
        def sb = new StringBuilder()  
        length.times { sb.append(availChars[rnd.nextInt(max)]) }  
        sb.toString()  
      }   
 
      10.times { println generateRandomString(8) }   
   }
}

Quelle: www.chrisrauber.com

Noch einfacher geht es natürlich, wenn man den Inhalt der main Methode in der Groovy Shell ausführt.

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,

Nov 28
handbrake 0.9.4

Manche Programme nutzt man lieber als andere. Geht es Euch auch so? Zu dieser Gattung gehört bei mir der kostenlose Videokonverter Handbrake. In der neuen Version 0.9.4, die für Mac, Linux und Windows zum Download bereit steht, hat sich einiges getan.

Allein durch die 64 Bit Version sollen bis zu 10 Prozent Geschwindigkeit mehr drin sein. Neben Performanceverbesserungen beinhaltet die neue Version auch noch:

  • die Unterstützung für Untertitel, die im Player an und aus gestellt werden können
  • eine Vorschaufunktion, um zu sehen, wie sich die Einstellungen auswirken
  • eine bessere DVD Unterstützung
  • neue Presets
  • und viels mehr …

In meinen ersten Tests funktionierte die 64 bit Version unter Snow Leopard sehr gut. Halt so, wie man es sich vorstellt. :-)

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , ,

Nov 23
Groovy Logo

Aus meiner Sicht ist Groovy, die dynamische Sprache für die Java Virtual Machine, auf der großen Hype Kurve am Punkt der technischen Realität angekommen. Mit Scala und Clojure werden statt dessen gerade 2 neue Programmiersprachen durch die Gemeinde der Java Jünger getrieben.

So ist es an der Zeit einmal zu hinterfragen, was man selbst bis jetzt mit Groovy implementiert hat, ob man dabei bleibt oder doch auf den Scala Zug aufspringt.

Dierk König, der Autor von “Groovy in Action” (dem besten Fachbuch, das ich in letzter Zeit gelesen habe), hat einmal folgende 7 Anwendungsmuster für Groovy herausgearbeitet:

Super Glue, Liquid Heart, Keyhole Surgery, Smart Configuration, Unlimited Openness, House-Elf Scripts, Prototype

Oder nicht ganz so prosaisch, als:

  • Bindeglied zwischen Java Komponenten (wie z.B. Spring und Hibernate in Grails)
  • Auslagerung der Buisiness Logik, um sie dynamisch auf Veränderungen anpassen zu können
  • Eingriffsmöglichkeit in laufende Applikationen
  • Erweiterung der Konfiguration mit den Mitteln einer Programmiersprache (um endlich das plumpe XML loszuwerden)
  • die leichte Veränderung von Code zur Laufzeit
  • Hilfe für alle Aufgaben, die durch die Programmierung anfallen (Build automation, continuous integration, deployment, installer, service monitoring, reports, statistics, automated documentation, functional tests, HTML scraping, Web remote control, XML-RPC, WebServices)
  • Tool zur schnellen Erstellung von Prototypen, mit der Möglichkeit diese später auf Java portieren zu können.

Doch zurück zum Ausgangspunkt. Was mache ich mit Groovy?

Zuerst einmal schreibe ich 95 % aller neuen Tests in Groovy. Die knackige Syntax, die perfekte Interoperabilität mit Java und die gute (aber verbesserungsfähige) Integration in Eclipse machen die Erstellung von Tests sehr viel weniger lästig. Zudem gibt es kleinere Web- und Webservices Applikationen auf Basis von Grails (dem Webframwork, das seinerseits ebenfalls auf Groovy basiert), sowie Tools, die rein in Groovy geschrieben sind.

Letztendlich kann man sagen, der Hype ist dem Alltag gewichen und Groovy passt sich perfekt in die tägliche Arbeit ein. Mit Griffon und GPars stehen 2 weitere Frameworks für Swing Applikationen und Nebenläufige Programmierung (Threads) auf Groovy Basis zur Verfügung. Und eine lebendige Community hat sich um diese dynamische Sprache gebildet. Ein Umstieg auf Scala oder Closure kommt somit für mich momentan nicht in Betracht.

Und mal ganz ehlich, wenn die Kinder fragen: “Papa was machst Du?”, klingt “ich programmiere Groovy” viel cooler als “Ich programmiere Scala”. :-)

Links:
Groovy Usage Patterns by Dierk König

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , , , , , ,

Sep 22
phpsrc-logo

Mit Eclipse kann nicht nur sehr komfortabel Java programmieren, sondern auch für PHP steht mit dem PDT Plugin eine hervorragende Lösung zur Verfügung.
Möchte man allerdings in seinem Projekt mit allgemeinen Bibliotheken (wie z.B. phpUnit) arbeiten, muss man sie entweder in sein Projekt kopieren, oder ein eigenes Projekt mit deren Sourcen erstellen.

Mit dem Elicpse PTI Plugin von PHPSRC gibt es jetzt noch eine 3. Möglichkeit. PTI (Eclipse PHP Tool Integration) stellt über die bekannten Eclipse Mechanismen (update url: http://www.phpsrc.org/eclipse/pti/) so bekannte PHP Bibliotheken wie

  • PEAR
  • PHPUnit
  • PHP CodeSniffer und
  • External PHP Checker

zur Verfügung.

Das spart eine Menge Handarbeit und untermauert wieder einmal meine Meinung, dass Eclipse die beste Entwicklungsumgebung ist (und zwar nicht nur, weil sie kostenlos ist).

pti installation details

Links:
phpsrc – wiki

update: weitere Links
phphatesme.com – PTI Grundkonfiguration

Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,