Textauszug aus dem Heft 03.02 des Javamagazins.
Im Titelthema erfolgt die Vorstellung von Cameleon OSP im Anschluss an
Webmacro und Velocity wie folgt:
. . .
| Cameleon - die Alternative |
Im letzten Abschnitt dieses Beitrags werfen wir nun einen Blick auf das Web-Framework Cameleon [5] www.must.de/cameleon.html. Viele Leser, denen Cameleon noch nicht bekannt ist, werden sicherlich einwenden, warum ein weiteres Framework betrachtet werden muss, wenn bereits ausreichend bekannte und gute Alternativen bestehen. Der Ansatz, der von Cameleon verfolgt wird, ist durchaus als außergewöhnlich zu betrachten: Es ist vorgesehen, Applikationenen mittels Swing, Servlets oder JSP auf der Grundalge von Data-Objects zu bilden. Hierbei wird besonders Wert darauf gelegt, Datenbank-Applikationen weitgehend zu unterstützen. Folgende Abbildungen zeigen eine Cameleon –Beispielanwendung (Servlet):
[Live-Link statt statisches Bild]
Der besondere Vorteil liegt bei Cameleon darin, dass auf der Grundlage
von Datenbanken, die durch Data-Objects abgebildet werden, die Applikation
als Swing-Anwendung, JSP oder Servlet aufgebaut werden kann. Somit besitzen
verschiedene Darstellungen die gleiche Datengrundlage.
| DataStructures |
Data Structures bilden unter Cameleon die Grundlage für Applikationen,
egal welchen Typs. Durch Data Structures (Data Objects) werden Datenbank-Tabellen
durch eine Klasse abgebildet und können somit einfach bearbeitet werden.
In Listing 1 sehen Sie die Datenstruktur der Cameleon-Beispielapplikation
Cooblook. Auf der Grundlage einer solchen Datenstruktur können nun
User-Interfaces mit Hilfe von Swing, JSP oder Servlets gestaltet werden.
Weitere Informationen hierzu sind den beiliegenden Hilfe Dokumenten zu
finden.
| Listing 1 |
| //elementary!
/*
package de.jugs.cookbook; import de.must.dataobj.*;
/**
public static final String tableName = "Cookbook"; public static final AbstractAttribute cookNI = new NumericAttribute("Rezeptnummer
intern", "RezeptNI");
public static final AbstractAttribute[] attributes = {
public static final Index[] indices = {
public DoCookbook(DataObjectConstructionDetails dataObjectConstructionDetails)
{
public String getTableName() {
public AbstractAttribute[] getAttributes() {
public Index[] getIndices() {
} |
| Servlet |
Um den Vorgang der Servlet-Programmierung mit Cameleon noch etwas genauer zu erläutern, werden wir in diesem Abschnitt die grundlegenden Schritte anhand des beiliegenden Cookbook-Beispiels nachvollziehen.
Die gesamte Applikation basiert auf einem zentralen Servlet, zu finden
unter dem Package de.jugs.cookbook.Main. Die Servlet-Klasse muss jeweils
von de.must.markup.MainStd abgeleitet werden. Das Servlet ist zunächst
dafür verantwortlich, dass Zugriff auf globale Eigenschaften gewährt
wird und eine Session angelegt wird. Listing 2 zeigt die betreffende Klasse
am Beispiel der Cookbook-Applikation:
| Listing 2 |
| //elementary!
/*
package de.jugs.cookbook; import de.must.middle.GlobalStd;
/**
public Main() {
protected GlobalStd getGlobal() {
protected GlobalStd getGlobal() {
protected Class getSessionClass() {
} |
Alle speziellen Einstellungen werden anschließend in einem getrennten Session-Objekt hinterlegt. Hierzu wird eine Klasse von de.must.markup.SesssionStd abgeleitet Die Servet-Implementierung des Cookbbok-Beispiels ist unter de.jugs.cookbook.Session abgelegt.
Das dritte wichtige Element im Framework ist die Container-Klasse, welche Input/Output-Felder an Datenbanktabellen anbindet. Die Container-Klasse des Cookbook-Beispiels ist mit dem Namen Cookbook Administration bezeichnet und wird von DataPropertyAdministration abgeleitet. Wie zu erwarten, befindet sich die Implementierung der Beispielklasse unter dem Package de.jugs.cookbook.CookbookAdministration Hier ein kleiner Ausschnitt der Klasse zur Initialisierung eines Text-Fields:
createTextField(sessionData.getResourceString
("TEXT_RECIPE_TITLE"), "RezeptBez");
Zugriff auf das entsprechende Session-Objekt wird durch Übergabe an den Konstruktor der Klasse realisiert:
public CookbookAdministration(SessionData sessionData)
{
...
}
Um die verschiedenen Bestandteile der Applikation nun in ein Gesamtschema einzureihen werfen Sie einen Blick auf Abbildung 5:
Die Übersicht verdeutlicht noch einmal anschaulich, welche Beziehungen
zwischen den einzelnen Komponenten bestehen. Das Servlet „Main“ ist der
einzige Bestandteil der Applikation, auf den ein Benutzer später von
„außen“ zugreifen kann. Die wichtigste Verwaltungsarbeit übernimmt
das Session-Objekt. Hier werden zentrale Einstellungen für den Layouter
hinterlegt. Um die Darstellung / Präsentation vorzunehmen, werden
Objekte innerhalb eines Containers gesammelt (Frame-like Container). Zur
Verfügung stehen hierbei die Objekte TextField, TextArea und ComboBox.
Die HTML-Ausgabe wird anschließend automatisch vom Layouter generiert
(de.must.markup.HostLayout).
| Listing 3 |
| //elementary!
/*
package de.jugs.cookbook; import de.must.markup.*;
/**
private Layout layout; public Session() {
protected void build(SessionData sessionData) {
protected GlobalStd getGlobal() {
} |
. . .
Autor des Artikels: Sebastian Eschweiler