Streitgespräch

Komponentenorientiert vs. nicht komponentenorientiert
Kommentare

Komponentenorientierte Web-Frameworks sind heute weit verbreitet und werden im Verbund mit AJAX gerne eingesetzt. Genauso gibt es aber einige sehr interessante, nicht komponentenorientierte Frameworks, die ebenfalls für AJAX geeignet sind. Die Frage bleibt, welche der beiden Optionen besser für den Einsatz von AJAX ist.

AJAX ist in aller Munde, und wenn neben den JavaScript-Frameworks ein Framework den AJAX-Einsatz vorangetrieben hat, dann ist das Ruby on Rails. Und Rails ist „Opiniated Software“, sagt sein Gründer, David Heinemeier Hansson. Daher werden viele Dinge in Rails auf einem bestimmten Weg gelöst, was das Framework oft sehr einfach verständlich macht. Die Meinung von Heinemeier Hansson zum Thema Komponentenorientierung ist, dass sie schlecht sei, weil sie unnötige Komplexität in die Webwelt bringe. Wir werden Vor- und Nachteile der Verwendung von komponentenorientierten und nicht komponentenorientierten Frameworks mit AJAX evaluieren und dabei mit unserer eigenen Meinung nicht hinterm Berg halten, also eine „opiniated“ Diskussion starten. „Wir“ sind in diesem Fall ein Verfechter der AJAX-Entwicklung mit Rails (Martin Haimberger) und Ernst Fastl, ein Verfechter der AJAX-Entwicklung mit komponentenorientierten Frame­works in Java, im Speziellen mit JSF. Moderieren wird Martin Marinschek. Martin Haimberger und Martin Marinschek haben gemeinsam ein Buch zum Thema Rails verfasst, und Ernst Fastl und Martin Marinschek haben beide an der AJAX-Architektur von Apache MyFaces, der ersten freien JSF-Implementierung, gearbeitet. Die Diskussion, die wir in diesem Artikel führen werden, ist daher keine neue – wir haben sie schon öfter geführt, und das mit Vorliebe in Wiener Biergärten. Dabei hat nur die Kühle der konsumierten Getränke verhindert, dass Handgreiflichkeiten zwischen den Beteiligten aufgetreten sind, was Sie auch an der folgenden Diskussion erkennen werden!

AJAX-Implementierung in den Frameworks

Für einen guten Start in die Diskussion werden wir uns zunächst ansehen, wie AJAX in die beiden auf dem Prüfstand stehenden Frameworks eingebunden ist, wie man also AJAX mit JSF und Rails verwendet.

Herr Haimberger, wie sieht’s da mit Rails aus? Haimberger: Um AJAX in Rails zu verwenden, gibt es mehrere Möglichkeiten. Der harte Weg zu AJAX in Rails ist das Verfassen von JavaScript-Dateien, die das XMLHttpRequest-API verwenden. Die verschiedenen Eigenarten der Browser können dem Entwickler dabei den Schweiß ins Gesicht treiben (ganz unabhängig von den Außentemperaturen).  Einfacher wird es, wenn Sie eine JavaScript-Bibliothek verwenden, die normalerweise den Ausgleich der Unterschiede zwischen den einzelnen Browsern bereits im Framework integriert hat. Prototype kann beispielsweise mit fast allen gängigen Browsern arbeiten. Die einfachste Möglichkeit ist es, die bereits in Ruby on Rails integrierte AJAX-Funktionalität zu verwenden. Das Framework generiert dann über die Verwendung von „Helpern“ den gesamten notwendigen  JavaScript-Code, basierend auf der JavaScript-Bibliothek Prototype. Prototype ist eine objektorientierte JavaScript-Bibliothek mit AJAX-Funktionalität, die von Rails verwendet wird. Damit kann jede Webanwendung mit AJAX-Funktionalität ausgestattet werden, ohne dass dafür jedes Mal ein neues AJAX-Projekt gestartet wird. Als Beispiel für die Verwendung von Rails und AJAX wird in den nächsten Zeilen ein Feld zur automatischen Vervollständigung (Autocomplete-Feld) mit Rails und AJAX gezeigt, und zwar mit dem Code zum Rendern und dem Code des Modells. Um beispielsweise Namen bei der Eingabe automatisch zu vervollständigen, benötigen wir einige Namen in der Datenbank. Dazu legen wir eine Tabelle names an, in der die Namen gespeichert sind.

create table names (
id int not null auto_increment,
fullname varchar(50) not null,
primary key(id)
);

Und fügen Daten ein: insert into names (fullname) values („Vorname Nachname“);

Danach müssen wird den NameController ergänzen:

class NameController 

Und nun der View:

  
    
  
  
    Name: 
  

Es folgt ein zweites Beispiel, in dem die Unterstützung von AJAX in Rails dafür verwendet wird, einen Seitenbereich nach dem Klick auf einen Link zu aktualisieren. Der angepasste Controller, der die aktuelle Zeit liefert:

class TimeController 

Und der entsprechende View:

  
    
  
  
    
Noch keine Zeit vom Server geholt !
Um die akutelle Zeit vom Server abzurufen "time_out", :url =>{ :action => :current_time }) %>

Herr Fastl, wie ist die AJAX-Unterstützung in JSF realisiert? Fastl: Prinzipiell gibt es alle Möglichkeiten zur Verwendung von AJAX wie in Rails (oder anderen nicht komponenten­orientierten Frameworks) auch. Zusätzlich kann natürlich die AJAX-Unterstützung direkt in die Komponenten eingebaut werden. Grundsätzlich ist eine 2-Way-Strategie vernünftig, bei der eine Integration der Basisarchitektur ins Frame­work selbst erfolgt, und dann Komponentenbibliotheken zusätzliche, AJAX-aktivierte Komponenten zur Verfügung stellen, die mit speziellen Anforderungen umgehen können. MyFaces bietet inzwischen eine volle Integration von AJAX ins Framework an, es gibt aber für JSF noch viele zusätzliche Add-ons, wie beispielsweise AJAX-Anywhere. Ihnen allen gemeinsam ist, dass clientseitig JavaScript-Frameworks eingesetzt werden und serverseitig ein PhaseListener, ein Servlet oder ein Filter die Anfrage abfangen und speziell verarbeiten. Ein Autocomplete mit JSF zeigt Listing 1. Die inputSuggest­Ajax-Komponente wird innerhalb einer Form eingebaut und bekommt ein Method-Binding für die Methode, die auf Basis der eingetippten Buchstaben die Liste an Auswahlmöglichkeiten zurückliefert. Zusätzlich wird im Value-Attribut wie üblich das Value-Binding für das zu setzende Attribut angegeben.

Listing 1
-----------------------------------------------------------------





  

Das Backing Bean muss lediglich das oben angegebene Attribut und die Methode implementieren. In der Methode kann 100 % flexibel auf das eingetippte Präfix reagiert werden (Listing 2).

Listing 2
--------------------------------------------------------------
public class ExampleBean
{
  private String suggestValue = null;

  public List getItems(String prefix)
  {
    List li = new ArrayList();
    li.add(prefix+1);
    li.add(prefix+2);
    li.add(prefix+3);
    return li;
  }

  public String getSuggestValue()
  {
    return suggestValue;
  }

  public void setSuggestValue(String suggestValue)
  {
    this.suggestValue = suggestValue;
  }
}

Wie wir sehen, ist durch den Einsatz der Komponente, die die komplette AJAX-Funktionalität bereitstellt, kein eigener JavaScript-Code notwendig. Das Update eines Seitenbereichs funktioniert folgendermaßen: Im PartialTriggers-Attribut der pprPanelGroup-Komponente werden Comma-separated die IDs jener Komponenten angegeben, die ein Update der Komponente via AJAX triggern (im Beispiel nur mainform:button; s. Listing 3).

Listing 3
-------------------------------------------------------------------





  

Als Backing-Bean wurde der Einfachheit halber jenes aus Listing 2 verwendet. Es sind keine speziellen Attribute/Methoden im Backing-Bean und auch kein JavaScript-Code notwendig, um diese Komponente zu verwenden. Abbildung 1 zeigt den Ablauf eines Partial Page Rendering.

Abb. 1: Partial Rage Rendering
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -