Web-Controller-Package

Das Web-Controller-Package ist ein Framework zur Entwicklung von Web-basierten Benutzeroberflächen für die Programmiersprache Java. Das Framework basiert auf dem Model View Controller Pattern.

Model

Die Model Komponente des Frameworks wird durch die Interfaces Map und Sequence gebildet (siehe Html-Package).


View

Die View Komponenten des Web-Controller-Package basieren auf HTML Templates (siehe Html-Package). Templates können mit der FileTemplateFactory erzeugt werden.

Eine FileTemplateFactory wird anhand der Angabe eines Verzeichnisses, in dem die Template Dateien abgelegt sind, und eines Zeichensatzes erzeugt. Die Methode createTemplate der Factory benötigt als Eingabe einen Dateinamen, liest die Datei und erzeugt das Template. Änderungen des Dateiinhalts wirken sich momentan auf den Inhalt des Templates aus.


Controller

Ein Controller steuert die Zustände der Benutzeroberfläche. Zustände werden durch Instanzen der Klasse State repräsentiert. Ein State hat

• eine Referenz auf den Controller, der das State verwaltet,
• eine numerische Id, wobei alle States eines Controllers unterschiedliche Ids haben müssen,
• einen Namen, der über alle States einer Applikation eindeutig sein muss, dabei ist zu berücksichtigen, dass eine Applikation normalerweise mehrere Controller besitzt,
• ein Template,
• beliebig viele Decorators und
• ein Flag, das angibt, ob es sich um einen Startzustand oder einen Folgezustand handelt.

Der Controller erzeugt in seinem Konstruktor die benötigten States. Mit der Methode getStates des Controllers kann die Webapplikation dessen States ermitteln. Die Webapplikation stellt sicher, dass alle Startzustände direkt über eine URL (/<Name der Webapplikation>?action=<Name des States>) aufgerufen werden können.

Wird ein Startzustand aufgerufen, wird anhand des Names der zugehörige State ermittelt, alle dem State zugeordneten Decorators können Werte in die Map eintragen und das dem State zugeordnete Template wird anhand der Map instanziert und die resultierende HTML Seite wird ausgegeben.

Der Controller wird aktiv, sobald Folgezustände angezeigt werden. Dazu müssen alle Formulare mit einem Hidden-Feld state versehen sein. In dieses Feld wird automatisch beim Instanzieren des Templates der Name des aktuellen Zustands eingetragen. Wird das Formular abgesendet, kann anhand des Wertes des Felds state der dazugehörige Zustand ermittelt werden. Anhand des Zustand ergibt sich der Controller, der zu aktivieren ist. Es wird die getNextState Methode des Controllers aufgerufen. Diese Methode kann anhand des aktuellen Zustands und der vom Formular übermittelten Argumente (die im Request-Objekt enthalten sind) entscheiden, welcher Folgezustand angezeigt werden soll. Der Controller und die Decorators des Folgezustands können Werte in die Map eintragen, anhand derer das Template des Folgezustands instanziert wird. Als Seiteneffekt bei der Bestimmung des Folgezustands werden Aufrufe zu den hinter der Webapplikation liegenden Teilsystemen vorgenommen, z.B. um persistente Änderungen an einem Datenbestand vorzunehmen. Wie das geschieht, wird vom Web-Controller-Package nicht festgelegt.

Klassen, die als Controller verwendet werden sollen, müssen das Controller Interface implementieren:

public interface Controller
{
  public State[] getStates();
  public State getNextState(State currentstate, Request request, UpdatableMap map);
}


Klassen, die als Decorator verwendet werden sollen, müssen das Interface Decorator implementieren:

public interface Decorator
{
  public void process(Request request, UpdatableMap map);
}


Controller, Decorators und States sind Singletons (siehe Singleton) innerhalb der Webapplikation. Instanzen müssen bei deren Initialisierung angelegt werden.

Viele Webapplikationen nutzen die gleiche Struktur von Seitenabfolgen mehrfach. Das führt dazu, dass generische Controller häufig wiederverwendet werden können. Das auf dem Web-Controller-Package aufbauende Standard-Web-Controllers-Package enthält derartige generische Controller.


Webapplikation

Die Applikation an sich ist in der Klasse CommandFactoryImpl realisiert. Bei dieser Klasse müssen die Controller registriert werden. Der Java Code zum Starten einer Webapplikation sieht typischerweise wie folgt aus:

String WEBAPP = "webapp"; // Name der Webapplikation
File directory = new File(...); // Verzeichnis mit den Templates
CommandFactoryImpl commandfactory = new CommandFactoryImpl(WEBAPP, directory);
FileTemplateFactory templatefactory = new FileTemplateFactory(directory);
ControllerImpl controller = new ControllerImpl(templatefactory);
// ... ggf. weitere Controller erzeugen
commandfactory.addController(controller);
// ... ggf. weitere Controller registrieren
RunnableQueue runnablequeue = RunnableQueueAccessor.getRunnableQueue();
Server server = new Server(commandfactory, runnablequeue);
server.start(8080); // HTTP Server auf Port 8080 starten


Download

Die Quelltexte unterliegen der Modified Artistic License v1 und finden sich in der Version v4 in der unten verlinkten Jar-Datei mit dem Namen webcontrollersrc.jar.

Zusätzlich werden noch das Collections-Package, das Html-Package, das Http-Package und das Threads-Package benötigt.


webcontrollersrc.jar