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: , , , , , , , ,

Oct 11

Die Woche vor dem Urlaub ist immer ein bisschen stressig. Von daher gibt es heute nur 2 Links:

Einstieg in Spring Roo RC2
Wer Grails nicht nutzen darf oder will erhält mit Spring Roo einen Code Generator für Webanwendungen, der auf Spring und Java basiert.
Wordpress mit Lucene
Die freie Suchbibliothek hält über ein Plugin Einzug in Wordpress.
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , , , ,

Oct 03

Über die Woche verteilt, gibt es immer wieder interessante Artikel im Netz für mich, die mir ein Lesezeichen bei delicious.com wert sind. Einige sind der Anstoß für einen Beitrag in meinem eigenen Blog, die meisten aber gesammeltes Wissen (wir alle sind Jäger und Sammler), das zum Abruf bereit steht.

Diese Woche haben es folgende Artikel in meine Linkliste geschafft:

Quellensammlung: Die besten CSS- und Design-Galerien
Ein gutes Layout ist ebenso wichtig, wie die Technik dahinter. Hier sind ein paar Beispiele.
ImageFlow von Finn Rudolph
Eine sehr schöne Umsetzung des Apple Cover Flow fürs Web.
10 Useful Usability Findings and Guidelines
Das Smashing Magazine hat ein paar Ergebnisse seiner Studie zur Usability von Websites herausgegeben – sehr interessant.
Stylish Charts Using CSS jQuery and PHP
Bisher habe ich Diagramme immer als Bild on the fly erstellt. Die Lösung mit PHP und jquery ist aber auch ein interessanter Ansatz.
Browser mit PHP fernsteuern
Nils Langner vom phphatesme Blog erklärt, wie man mit selenium und PHP den Browser fernsteuern kann. Automatisierte Funktionstests stehen schon sehr lange auf der Themenliste für meinen Blog. Es wird Zeit für einen Beitrag.
Grails 1.2: Spring 3, Uri Rewriting und mehr
Sehr guter Artikel zum kommenden Grails 1.2 Release.
Ähnliche Artikel:

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

Oct 01
spring-icon

Seit vorgestern steht der erste Release Candidate vom Spring Framework zum Download bereit.
In dieser Version werden erstmalig der JSR-303 (Bean Validation) und JSR-330 (Dependency Injection in Java) unterstützt. Besonders auf die Umsetzung der Bean Validation war ich gespannt, denn dadurch kann man über Annotations seine Beans mit Constraints versehen.

In einer Spring basierten Web Anwendung könnte man die Bean Validation wie folgt nutzen.

1. annotieren der Bean

1
2
3
4
5
6
7
public class Event {
   int id;
 
   @NotNull
   @Size(min=1,max=50)
   String description;
...

Durch die zwei Annotations (in validation-api-1.0.CR3.jar enthalten) wird festgelegt, dass der Wert für das Attribut description nicht null sein darf und minimum 1 Zeichen aber maximal 50 Zeichen enthalten muss.

2. validieren der Bean innerhalb des Controllers

Zur Validierung benötigt man eine Implementierung des JSR-303, wie z.B. den Hibernate Validator (momentan in Version 4.0.0 CR1). Der hat allerdings eine Menge Abhängigkeiten und muss erst über Maven kompiliert werden.
Hat man diese Hürde genommen (und hat die daraus resultierende Jar Datei in sein Projekt eingebunden), benötigt man noch folgende Bibliotheken um keine Runtime Fehler zu produzieren:

  • validation-api-1.0.CR3.jar
  • slf4j-api-1.5.6.jar
  • slf4j-log4j12-1.5.6.jar
  • log4j-1.2.14.jar
  • commons-logging-1.0.4.jar (benötigt man nicht unbedingt, wurde aber im Beispiel verwendet)

diese liegen dann aber sowieso im lokalen Maven Repository vor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping(value="/event/save", method=RequestMethod.POST)
public String save(Event event,BindingResult bindingResult, Model model) {
   LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
   validator.setProviderClass(HibernateValidationProvider.class);
   validator.afterPropertiesSet();
 
   validator.validate(event,bindingResult);
 
   if (!bindingResult.hasErrors()) {
      // save ...
      model.addAttribute("message", "update successfully");         
   } else {
      for (FieldError e : bindingResult.getFieldErrors()) {
         log.warn(e.getField()+": "+e.getDefaultMessage());            
      }
      model.addAttribute("errors", bindingResult.getFieldErrors());
   }
   model.addAttribute("event", event);
 
   return "update";
}

In den Zeilen 3-5 Wird eine Instanz des Hibernate Validators erzeugt. In Zeile 7 wird dann endlich validiert. Ob bei der Validierung Fehler aufgetreten sind kann man mit der Methode hasErrors() überprüfen (Zeile 9). Zugriff auf alle Fehler (z.B. zum Loggen) erhält man über die Methode getFieldErrors() (Zeile 13-15).
In Zeile 16 werden die Fehler der View übergeben.

3. Ausgabe der Fehler in der View

Zur Ausgabe der Fehler wird die JSP Standard Tag Library verwendet.

1
2
3
4
5
6
7
8
<p>${message}</p>
<c:if test="${!empty errors}">
   <ul>
   <c:forEach var="error" items="${errors}">
      <li>${error.field}: ${error.defaultMessage}</li>         
   </c:forEach>
   </ul>
</c:if>
Ähnliche Artikel:

geschrieben von gklinkmann \\ tags: , ,