Was ist Java EE?

Im Java-Universum unterscheiden wir im Wesentlichen zwischen zwei Spezifikationen. Zum einen gibt es die Standard Edition, abgekürzt Java SE und die Enterprise Edition oder auch Java EE bezeichnet. In der SE finden wir alle grundlegenden Klassen, die man einsetzen würde, um Standalone- bzw. Desktop-Anwendungen zu entwickeln. Die Java Enterprise Edition kommt zum Einsatz, wenn wir uns insbesondere mit dem Entwickeln von Webanwendungen beschäftigen. Hier kommt zu dem komplett beinhalteten Java SE ein weiterer großer Funktionsumfang hinzu. Eine vergleichbare Spezifikation und gleichzeitig größter Konkurrent die .NET-Plattform von Microsoft.
Jetzt wissen wir schonmal, dass Java EE sich scheinbar für die Entwicklung von Webanwendungen eignet. Um einen ersten Einstieg in die Entwicklung von Webanwendungen mit Java EE zu machen, möchte ich in diesem Blogartikel auf den Aufbau bzw. die Architektur von solchen Anwendungen eingehen.

Architektur und Möbelhäuser

Stellen wir uns einen großen Möbelhersteller z.B. mit eckigen, blauen Gebäuden und gelben Buchstaben vor. Hier können wir nach stundenlangen Aufenthalten und kopflosem Herumirren in den Gängen die Artikel bzw. Teile, die wir benötigen, am Lager abholen und sofort mitnehmen. Hier könnte es einen Mitarbeiter namens Conrad geben, der vorne an einem Tresen steht. Dieser fragt uns, welche Teile wir benötigen und nimmt unsere Bestellung auf. Wenn er alle Informationen von uns bekommen hat, beauftragt er seine Kollegin Susi, die Teile zu besorgen und gibt ihr dafür alle nötigen Informationen mit. Susi bringt die ganzen Informationen, die sie bekommen hat, jetzt erstmal in eine vernünftige Form und Struktur, damit der Kollege aus dem Lager namens Peter auch weiß, um welches Susi läuft los zu Peter, der sich um das Lager kümmert. Peter erhält von Susi alle Informationen, rennt mit einem großen Wagen durch das Lager und sammelt alle Teile, die der Kunde bestellt hat ein. Hat Peter alle Teile zusammen, übergibt er den Wagen an Susi. Sie übergibt Conrad alle bestellten Teile und der übergibt uns unsere Bestellung.

Architektur und Aufgaben in Java EE

In großen und mächtigen Java-EE-Anwendungen ist eine saubere Struktur sehr wichtig. Deswegen teilt man das Ganze in mehrere Schichten auf. Eine gängige Vorgehensweise ist, die Anwendung in vier Schichten aufzuteilen, die ich an dieser Stelle beschreiben möchte.
Aber was hat das Lager eines Möbelherstellers mit großen blauen Gebäuden und gelben Buchstaben mit der Architektur von Java-EE-Anwendungen zu tun? Diese verschiedenen Instanzen lassen sich sehr anschaulich auf die Aufgaben der einzelnen Schichten in unserem Programm beziehen.

Die Präsentationsschicht

Die Präsentationsschicht ist die oberste Schicht und wird auch als View bezeichnet. Sie stellt die Schnittstelle zwischen einer Java-EE-Anwendung und den Usern dar. In der Regel ist diese Schnittstelle webbasiert. Die Schicht lässt sich noch in eine Client- und in eine Server-Seite aufteilen. Die Client-Seite wird dann meist in Form einer HTML-Seite im Browser angezeigt. Mithilfe von JavaScript können Anwendungen auch aktiv über Ajax mit einem Server kommunizieren. Die Server-Seite besteht aus den Komponenten, mit denen wir die Client-Seite entwerfen. Eine Technologie, die hier zum Einsatz kommt, wäre zum Beispiel das Framework Java Server Faces (JSF). Hiermit können wir auf einfache Art und Weise unsere Programmteile in die Webseite einbinden.

Die Steuerungsschicht

Die zweite Schicht nimmt die Anfragen des Clients in Form von HTTP-Requests an. Sie ist für die Steuerung des Programmablaufs zuständig und leitet die Anfragen aus unserem Request an die nächste Schicht weiter. Beim Einsatz von JSF steuert das Framework die Entgegennahme der Anfrage, sodass wir dies nicht mehr selbst implementieren müssen. In unserer Anwendung wird die Steuerungsschicht durch die Controller-Klassen und POJOs (Plain-Old-Java-Objects) realisiert. Der Controller nimmt alle Eingaben oder auch Parameter des Users entgegen und steuert die nächste Schicht an.

In unserem Beispiel ist Conrad eine Mischung aus View und Controller. Er nimmt unsere Bestellung an und leitet sie weiter an Susi. Susi ist also in unserem Fall der Service.

Die Serviceschicht

Hier nden wir Programmlogik. Beispielsweise kann in dieser Schicht geprüft werden, ob der Kunde bereits registriert ist und ob er vielleicht einen Rabatt erhält. Sind wir noch nicht in der Kundenkartei, kann es in der Serviceschicht eine Funktion geben, die alle unsere Kundendaten vom Controller sammelt, ein neues Kundenobjekt erstellt und dieses dann zum Anlegen an die nächste Schicht weitergibt. Im Prinzip kümmert sich die Serviceschicht um die Kommunikation zwischen Programm und Persistenz. Sie ist für die Instanziierung oder Konvertierung von Objekten zuständig, sie entscheidet ob und wenn ja welche Daten aus der Datenbank geholt werden und ruft entsprechend die Methoden aus der Persistenzschicht auf.

Die Persistenzschicht

Peter aus dem Lager bildet unsere Persistenzschicht ab. Diese Schicht enthält Komponenten, die aus unserer Anwendung heraus für die Datenhaltung zuständig sind. Sie beinhaltet also Programmteile, die die Daten speichern, ändern und löschen, indem sie auf die Datenbank zugreifen. Die Susi (Serviceschicht) benutzt dafür einen sogenannten Entity Manager, welchen sie Peter zur Verfügung stellt. Der Entity Manager ist für das Verwalten der Daten in der Datenbank zuständig. Der Entity Manager enthält wichtige Methoden wie zum Beispiel find() zum Suchen von Datensätzen oder persist() zum Speichern von Datensätzen. Mit Hilfe der Java-Persistence-API (JPA) regeln wir die Übertragung von Java-Objekten zu Datenbankeinträgen. Hierfür müssen die Klassen aus unserer Domäne, die den Aufbau der Tabellen denieren, einige Bedingungen erfüllen. Auf alle diese Bedingungen detailliert einzugehen würde an dieser Stelle den Rahmen sprengen. An dieser Stelle möchte ich zwei der wichtigsten Voraussetzungen zeigen.

 

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Kunde {

    @Id
    private long id;
    private String name;
    private String vorname;

    public Kunde() {
    ...
    }
}

Mit der Annotation @Entity legen wir fest, dass die Klasse eine Entität deniert und es somit eine Tabelle mit entsprechendem Aufbau geben muss. Mit Aufbau ist gemeint, dass die Attribute der Klasse als Spalten in der Tabellen auftauchen müssen. Des Weiteren muss ein Attribut mit @Id annotiert sein. Dadurch legen wir fest, dass das Attribut den Primärschlüssel in der entsprechenden Datenbanktabelle darstellt.

Zusammenfassung

Unsere Anwendungen im Java-EE-Umfeld bestehen also aus vier Schichten. Es gibt die Präsentationsschicht oder auch View genannt, welche die Schnittstelle zwischen User und Anwendung ist. Hier kommen meistens HTML, CSS und JSF zum Einsatz.

Die Controller-Schicht nimmt die Anfragen aus dem Browser mit Hilfe des JSF-Frameworks entgegen. Sie steuert den weiteren Ablauf des Programms, indem sie Funktionen aus der Serviceschicht aufruft In den Serviceklassen bendet sich Programmlogik und sie bildet außerdem die Schnittstelle zur Persistenzschicht. Übrigens, die Persistenzklassen werden im Service mit der Annotation @Inject am Konstruktor injiziert. Diese Vorgehensweise nennt sich constructor injection. Die Persistenzschicht ist letztendlich die Schnittstelle zwischen der Anwendung und der Datenbank. Sie steuert das Löschen, Anlegen und Ändern der Daten in der Datenbank. Durch die Domänenklassen und die nötigen Annotationen bildet eine JPA Implementierung wie zum Beispiel Hibernate unsere Domäne auf eine relationale Datenbank ab.

Architektur in Java-EE-Anwendungen
Markiert in:                             

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.