Artikel

 
Dezember 2009 | Artikel

Google Sitebricks

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2781)

RESTful Web-Applikationen aus Backsteinen zimmern

Text: David Linsin
Der jüngste Spross aus Google’s Enterprise Framework Familie nennt sich Sitebricks. Es handelt sich dabei um eine Lösung für den Web-Layer, die ein einfaches und leichtgewichtiges Entwickeln von RESTful Web-Applikationen verspricht. Sitebricks basiert auf Google’s Dependency Injection Framework Guice, mit dessen Hilfe Abhängigkeiten zu Sitebricks minimiert und bessere Testbarkeit des eigenen Codes ermöglicht werden sollen.
Teil 1   Teil 2   

Google Sitebricks ist frei und Open Source unter der Apache 2.0 Lizenz verfügbar [1]. Die Umgebungsanforderungen sind relativ einfach, es wird lediglich ein Servlet Container mit Servlet API ab Version 2.3 benötigt. Das im Folgenden beschriebene Beispiel [2] wurde mit einem Jetty 6.1.21 getestet. Google Sitebricks adressiert den Web-Layer einer mehrschichtigen Applikation. Das Framework besteht dabei aus einer Reihe von Annotationen, um RESTful Resources bereitzustellen, sowie einem Template-Ansatz, um diese Ressourcen in altgewohnte HTML-Seiten einzubinden.

Sitebricks arbeitet RESTful
Eine RESTful Ressource wird typischerweise über einen Identifier, eine sogenannte URI, referenziert. Über diese URI können Repräsentationen dieser Ressource in unterschiedlicher Form zwischen Client und Server ausgetauscht werden. Für die Manipulation werden dabei meist die Schnittstellen des HTTP-Protokoll verwendet. In Sitebricks besteht eine solche Ressource aus einer einfachen Java-Klasse. Anhand einer Annotation wird die URI der Ressource definiert. Um die Ressource zu manipulieren, stehen weitere Annotation für HTTP-Methoden zur Verfügung.

  1. @At("/guestbook")
  2. public class Guestbook {
  3. private List<Entry> entries;
  4. private Entry newEntry = new Entry();
  5. @Inject
  6. private EntryDao entryDao;
  7. public Guestbook(EntryDao argEntryDao) {
  8. entryDao = argEntryDao;
  9. }
  10. public Guestbook() {
  11. }
  12. public List<Entry> getEntries() {
  13. return entries;
  14. }
  15. @Get
  16. public void load() {
  17. entries = entryDao.readAll();
  18. }
  19. @Post
  20. public String save() {
  21. newEntry.setDate(new Date());
  22. Integer id = entryDao.save(newEntry);
  23. return String.format("/sample/guestbook/%1$s", id);
  24. }
  25. }

Das Beispiel zeigt die Klasse Guestbook, die mithilfe von @At als Ressource über die URI “/guestbook” referenziert werden kann. Zusätzlich implementiert die Klasse die HTTP-Methoden POST und GET über die entsprechenden Annotationen. Die @Get annotierte Methode füllt eine Liste mithilfe eines DAOs (Data Access Object). Die Liste wird als Instanzvariable gehalten und nach dem Abarbeiten der Methode load vom Framework über den Getter abgerufen.

Google Sitebricks’ Design-Ansatz unterscheidet sich an dieser Stelle klar von anderen Web-Frameworks. Während andere Lösungen meist mit einer Art Modell-Objekt arbeiten, welches mit Domain-Objekten befüllt wird, ist bei Sitebricks die Ressource selbst dieses Modell-Objekt. Alles was über einen Getter abgerufen werden kann, ist auch in der View zugänglich. Dazu später mehr, wenn es um die Repräsentation einer Ressource geht.

Die Klassenmethoden, welche die HTTP-Methoden implementieren, können sowohl einfache Strings zurückliefern, als auch Ressourcen selbst. Strings können dabei auf dynamische URIs verweisen. Im Beispiel wird dies anhand der mit @Post annotierten Methode gezeigt. Das Zurückgeben einer Ressource wird mithilfe des sogenannten Page Chaining realisiert. Page Chaining ist Sitebricks’ Implementierung des Post-Redirect-Get Pattern [3]. Ein Beispiel dafür ist die Methode delete in der Klasse GuestbookEntry. Dort wird eine Instanz der Ressource Guestbook zurückgegeben, anstelle eines einfachen Strings. Page Chaining ist leider auf statische Ressourcen limitiert. Dies bedeutet, man kann beispielsweise nicht auf eine dynamisch zusammengebaute URI verweisen. In der Praxis ist es somit nicht wirklich zu gebrauchen, da die meisten Ressourcen in irgendeiner Form dynamisch sind.

  1. @At("/guestbook/:id")
  2. public class GuestbookEntry {
  3. private Entry entry;
  4. @Inject
  5. private EntryDao entryDao;
  6. @Get
  7. public void load(@Named("id") String argId) {
  8. entry = entryDao.read(Integer.valueOf(argId));
  9. }
  10. public Entry getEntry() {
  11. return entry;
  12. }
  13. @Post
  14. public Guestbook delete(@Named("id") String argId) {
  15. load(argId);
  16. entryDao.delete(entry);
  17. return new Guestbook(entryDao);
  18. }
  19. }

Teil 1   Teil 2   

Anzeige

Kommentare

Gravatar Daniel Manzke 23.12.2009
um 16:19 Uhr
Wenn die Jungs jetzt noch JAX-RS nutzen würden, hätte das sogar Potential. Denn das was sie dort umgesetzt haben, läßt sich mit JAX-RS und Freemarker schon lange machen. Nicht umsonst behaupten einige, dass JAX-RS die bessere Servlet-Spec ist. Warum nie geschaut wird, was es heute schon gibt und man immer sein eigenes Süppchen kocht, werde ich nie verstehen.
Und ich gehöre wahrlich nicht zu denen die Google nicht mögen!
#zitieren
Gravatar Entwickler 23.12.2009
um 18:55 Uhr
Und wo ist der Templating-Ansatz? #zitieren
Gravatar Daniel Manzke 23.12.2009
um 19:03 Uhr

Entwickler:
Und wo ist der Templating-Ansatz?


Ich würde sagen überall, wenn man sich die HTML-Templates anguckt, wo die Expressions rein geschrieben werden können. Selbst in den Beispielen und der Dokumentation wird von Templates gesprochen.
#zitieren
Gravatar David Linsin 28.12.2009
um 05:58 Uhr
Daniel, ich gebe ich gebe dir vollkommen recht. Eine Unterstützung von Jax-RS wäre natürlich wünschenswert.

Wenn ich so die Mailling-Liste verfolge, glaube ich hat sich der Autor Jax-RS genau angesehen. Seine Motivation scheint zu sein es noch besser zu machen wie Jax-RS.
#zitieren
Gravatar Daniel Manzke 12.01.2010
um 09:32 Uhr

David Linsin:
Wenn ich so die Mailling-Liste verfolge, glaube ich hat sich der Autor Jax-RS genau angesehen. Seine Motivation scheint zu sein es noch besser zu machen wie Jax-RS.


Das gleiche Problem wie immer. Irgendwer möchte es immer besser machen bzw. können. Statt einfach an der SPEC mitzuarbeiten und es zu verbessern. Meines Erachtens nach hat JAX-RS derzeit schon einen sehr guten Status und wird an Popularität gewinnen.

Das war bestimmt ein Ingenieur. Löst ein Problem und schafft 2 neue. :)
#zitieren
Gravatar Andreas Herz 22.01.2010
um 08:29 Uhr
Hi


Das gleiche Problem wie immer. Irgendwer möchte es immer besser machen b....


Und so sollte es sein. Wenn niemand da ist der denkt es
besser machen zu können, dann haben wir nie einen Fortschritt.

Manchmal muss man halt mal ausbrechen.
#zitieren

Anzeige

zurück zum Seitenanfang