Archive for December, 2018

Yahoo! User Interface Library(YUI)

Friday, December 28th, 2018

Mit dem Web 2.0 Hype kam eine Vielzahl von Javascript Frameworks. Neben der obligatorischen Unterstützung für asynchrone Requests bieten diese Frameworks auch zusätzliche Features wie Animation oder eigene UI-Controls. Diese Woche habe ich mir die Yahoo! User Interface Library (YUI) genauer angeschaut und bin bis jetzt begeistert.

Typischerweise zeichnen sich die bisherigen JavaScript Frameworks wie Dojo oder Rico durch eine eher dürftige Dokumentation aus. Dagegen ist die YUI Library von Yahoo vorbildlich dokumentiert. Besonders gefällt mir die hohe Anzahl an Code-Beispielen und die “Cheat Sheets”, die eine sehr schnelle Einarbeitung in die Library ermöglichen.

Beispiele:
Cheat Sheet für das “Animation” Modul
Dokumentation für das “Autocomplete” Modul

Ach ja: Die Library ist Open Source (unter der BSD Lizenz).

Commons Fundstücke: StringEscapeUtils, EqualsBuilder und DateUtils

Monday, December 17th, 2018

Die Fundstücke kommen diesmal ebenfalls aus der commons lang Bibliothek.

  1. org.apache.commons.lang.StringEscapeUtils

    Bietet Methoden für Escaping und Unescaping für die Sprachen Java, JavaScript, HTML, XML und SQL.

  2. org.apache.commons.lang.builder.EqualsBuilder

    Erleichtert die Programmierung für equals Methode nach den
    Regeln aus dem Buch “Effektiv Java programmieren” von Joshua Bloch.

    Analog dazu
    org.apache.commons.lang.builder.HashCodeBuilder
    org.apache.commons.lang.builder.ToStringBuilder
    org.apache.commons.lang.builder.CompareToBuilder

  3. org.apache.commons.lang.time.DateUtils

    Mehrere Methoden rund um Date und Calendar. Praktisch ist beispielsweise die
    round Methode, die das Date Objekt nach dem übergebenen Kriterium (bsp. Calendar.MONTH) rundet.

HttpSession über mehrere Webapplikationen?

Monday, December 10th, 2018

Webapplikationen können über die HttpSession keine Daten austauschen, da eine HttpSession immer an einen ServletContext gebunden ist. Wenn eine Webapplikation eine andere Webapplikation über den RequestDispatcher inkludiert, wird zwar eine Session mit der gleichen(!) SessionID erzeugt, es sind aber effektiv zwei HttpSession Objekte vorhanden.
Vergleiche Servlet Specification 2.4. (Kapitel 15.1.7)

Session information is scoped only to the current web application
(ServletContext), so information stored in one context will not be directly visible
in another.

Auch für JSR 168-konforme Portlets gelten diese Restriktionen. So konnen Portlets nur innerhalb der gleichen PortletApplication gemeinsame Daten austauschen. (Eine PortletApplication wird mit Hilfe einer Webapplikation realisiert). Diese Restriktion soll mit JSR 286 aufgehoben werden. Im Early Draft Review werden sogenannte “Shared Session Attribute” vorgestellt. Hier definiert der Portlet-Entwickler die gemeinsamen Session Attribute in der portlet.xml. Das JAXB Framework (Java Architecture for XML Binding) wird verwendet, um den Typ des Session Attributes zu beschreiben. Konkret bedeutet dass, das die Klasse für das Shared Attribut mit JAXB Annotations versehen wird. So kann das Attribut auch in anderen VMs ausgelesen werden, da die Klasse mit Hilfe von JAXB wieder zusammengebaut wird (Stichwort “marshalling”).

Commons Fundstücke: StopWatch

Wednesday, December 5th, 2018

Diese neue Artikelserie stellt kleine, eher unspektakuläre, aber dennoch sehr praktische Klassen aus dem Jakarta Commons Projekt vor. Wir beginnen mit der StopWatch Klasse aus der commons lang Bibliothek.

Die StopWatch Klasse erlaubt bequeme Messung von Zeitabständen ohne die händische Verwendung der System.currentTimeMillis() Methode. Typisches Einsatzgebiet sind Performancemessungen (”Wie lange braucht mein Code für die Ausführung”). Der Dedizierten Entwickler Teams kann jederzeit den aktuellen Status abfragen und bei Bedarf die StopWatch auch pausieren.

Beispielcode:

  1. import org.apache.commons.lang.time.StopWatch;
  2. StopWatch stopWatch = new StopWatch();
  3. stopWatch.start();
  4.  
  5. // Zeitaufwändige Aktion
  6.  
  7. // Pausieren der StopWatch
  8. stopWatch.suspend();
  9.  
  10. // Fortführen der Messung
  11. stopWatch.resume();
  12.  
  13. // Stoppen und verbrauchte Zeit ausgeben.
  14. stopWatch.stop();
  15. long neededTime = stopWatch.getTime();
  16. System.out.println(“needed time (in ms): “ + neededTime);