- Zeichensätze und -kodierung – Anwendungsentwickler-Podcast #32
- HTML – Anwendungsentwickler-Podcast #33
- Java (Lernzielkontrolle) – Anwendungsentwickler-Podcast #36
- Allgemeine Fragen zur Programmierung (Lernzielkontrolle) – Anwendungsentwickler-Podcast #37
- Variablen und Operatoren (Lernzielkontrolle) – Anwendungsentwickler-Podcast #38
- Zahlen und Zeichen (Lernzielkontrolle) – Anwendungsentwickler-Podcast #39
- Algorithmen und Methoden (Lernzielkontrolle) – Anwendungsentwickler-Podcast #42
- Objektorientierung Teil 1 (Lernzielkontrolle) – Anwendungsentwickler-Podcast #43
- Objektorientierung Teil 2 (Lernzielkontrolle) – Anwendungsentwickler-Podcast #44
- Datenbankmodellierung (Lernzielkontrolle zum Entity-Relationship-Modell) – Anwendungsentwickler-Podcast #48
- Datenbankmodellierung (Lernzielkontrolle zum relationalen Tabellenmodell) – Anwendungsentwickler-Podcast #49
- Java EE 7 (Lernzielkontrolle) – Anwendungsentwickler-Podcast #54
- Fehlerbehandlung (Lernzielkontrolle zu Exceptions) – Anwendungsentwickler-Podcast #79
- Arrays und Listen (Lernzielkontrolle) – Anwendungsentwickler-Podcast #99
Mit Java EE 7 ist es recht einfach möglich, mehrschichtige Enterprise-Anwendungen zu programmieren. In der vierundfünfzigsten Episode des Anwendungsentwickler-Podcasts gibt es eine Lernzielkontrolle zur Enterprise Edition von Java.
TL;DR
Mit meiner Lernzielkontrolle zu Java EE 7 kannst du prüfen, wie gut du die Plattform und ihre Webtechnologien kennst. Java EE bündelt aufeinander abgestimmte Spezifikationen, deren APIs langlebige Anwendungen ermöglichen; ein Application-Server stellt die benötigte Infrastruktur bereit. Für die Praxis stehen JPA für den Datenbankzugriff sowie JSF für Weboberflächen im Mittelpunkt, ergänzt durch CDI und REST-Services mit JAX-RS. Wenn du Java EE in deinem Abschlussprojekt einsetzt, erwarte ich im Fachgespräch, dass du die verwendeten Technologien und ihre Zusammenhänge erklären kannst.
Podcast: Play in new window | Download (Duration: 44:25 — 21.2MB)
Abonnieren: Apple Podcasts | Spotify | RSS
Kapitelmarken
- [00:00:01] Einstieg in die Lernzielkontrolle zu Java EE 7
- [00:01:20] Die Java-Editionen ME, SE und EE
- [00:02:37] Java EE als Sammlung von Spezifikationen
- [00:03:30] Versionsnummern von Java und Java EE
- [00:04:15] WebSockets und langlebige standardisierte APIs
- [00:06:00] Zusammenspiel der Spezifikationen
- [00:07:37] Java Community Process und Specification Requests
- [00:09:35] Container und Application-Server
- [00:12:30] Server einrichten und verwalten
- [00:12:55] Web Profile und Full Profile
- [00:15:32] Beispiele für Application-Server
- [00:16:54] Java-EE-Spezifikationen im Überblick
- [00:18:07] APIs und Referenzimplementierungen
- [00:19:17] Wichtige Referenzimplementierungen und ihre Aufgaben
- [00:20:50] JPA: Objekte in Datenbanken speichern
- [00:21:22] Entitäten mit @Entity und @Id kennzeichnen
- [00:24:41] Beziehungen und Kardinalitäten mit JPA abbilden
- [00:28:14] Daten mit JPQL und Criteria-API abfragen
- [00:30:20] NoSQL mit Hibernate OGM anbinden
- [00:31:33] Weboberflächen mit JSF und Backing Beans
- [00:33:02] Expression Language und getrennte Seitenlogik
- [00:34:19] HTTP-Requests mit Servlets verarbeiten
- [00:34:45] Dependency Injection mit CDI
- [00:36:41] Eindeutige und mehrdeutige Abhängigkeiten
- [00:37:23] REST-Services mit JAX-RS und JSON
- [00:38:57] AngularJS an Java EE anbinden
- [00:39:51] Java EE im Abschlussprojekt und Fachgespräch
- [00:41:04] Dokumentation und weiterführende Links
- [00:41:39] CeBIT-Vortrag und Artikel zu relationalen Datenbanken
- [00:42:45] Feedback und Newsletter
- [00:43:27] Ausblick: Einstieg ins Abschlussprojekt
Inhalt
- Welche Versionen von Java gibt es?
- ME, SE, EE
- Was ist Java EE?
- Die Enterprise Edition. Eine Sammelspezifikation für mehrere Teilspezifikationen. Ermöglicht die Entwicklung von mehrschichtigen Enterprise-Anwendungen.
- Wer definiert die Standards in Java EE?
- Der Java Community Process bearbeitet Java Specification Requests.
- Wie werden Java EE-Anwendungen ausgeführt?
- In einem Container, dem Application Server.
- Welche Profile gibt es in Java EE?
- Web und Full
- Welche Application Server gibt es?
- WebSphere, Weblogic, JBoss, Wildfly, Glassfish, TomEE, Jetty, Tomcat
- Wie heißen die Referenzimplementierungen für die zentralen Komponenten von Java EE?
- JSF: Mojarra, JPA: EclipseLink, CDI: Weld, JAX-RS: Jersey, Bean Validation: Hibernate Validator, JAX-WS: Metro
- Was ist JPA?
- Java Persistence API
- Wie persistiere ich meine Daten mit JPA?
- Konfiguration in
persistence.xml, Annotation@Entity, weitere Annotationen wie@Idoder@ManyToMany
- Konfiguration in
- Wie werden Daten abgefragt?
- Mittels JPQL oder der Criteria API.
- Kann man auch NoSQL-Datenbanken anbinden?
- Ja, z.B. mit Hibernate OGM.
- Was ist JSF?
- Java Server Faces
- Was ist ein Servlet?
- Eine Java-Klasse, die Requests verarbeitet.
- Was ist CDI?
- Contexts and Dependency Injection
- Was ist JAX-RS?
- Java API for RESTful Web Services
- Wie veröffentliche ich eine REST-Ressource?
- Mittels Annotationen wie
@Path,@GETund@Produces
- Mittels Annotationen wie
Literaturempfehlungen
Die „offizielle“ Dokumentation von Oracle ist definitiv einen Blick wert: Java Platform, Enterprise Edition: The Java EE Tutorial Release 7 – Contents.
Als deutschsprachiges Buch kann ich Professionell entwickeln mit Java EE 7* empfehlen:
Sehr geholfen haben mir auch die Pluralsight-Kurse von Antonio Goncalves.
Links
- Permalink zu dieser Podcast-Episode
- RSS-Feed des Podcasts
- Java Platform, Enterprise Edition – Wikipedia
- Difference between Java SE/EE/ME? – Stack Overflow
- Java EE – Technologies | Oracle Technology Network | Oracle
- Java Community Process – Wikipedia
- Java Specification Request – Wikipedia
- O Java EE 7 Application Servers, Where Art Thou? – Antonio’s Blog
- Introducing the Java EE Web Profile – JAXenter
- Java EE Compatibility
- Java Persistence API – Wikipedia
- Java Persistence Query Language – Wikipedia, the free encyclopedia
- JavaServer Faces – Wikipedia
- Servlet – Wikipedia
- Contexts and Dependency Injection – Wikipedia
- Java API for RESTful Web Services – Wikipedia
Zusammenfassung
Java-Editionen und zeitlicher Kontext
Meine Lernzielkontrolle richtet sich an dich als IT-Azubi und behandelt Java EE 7 auf dem Stand der Aufnahme im März 2016. Die Beispiele entstehen mit Java 8, während Java EE 8 zu diesem Zeitpunkt noch vorbereitet wird. Die Versionsnummern der Sprache und der Enterprise-Plattform entwickeln sich eigenständig.
Zu den Java-Editionen gehören:
- Java ME, Micro Edition: Eine reduzierte Variante für mobile Geräte und beispielsweise Set-Top-Boxen.
- Java SE, Standard Edition: Sie umfasst die grundlegenden Java-Funktionen, mit denen du etwa Dateien verarbeitest oder Datenbankverbindungen aufbaust.
- Java EE, Enterprise Edition: Sie enthält Java SE und ergänzt die Plattform um weitere APIs und Spezifikationen.
Was Java EE festlegt
Unter Java EE 7 sind 38 Spezifikationen zusammengefasst. Sie beschreiben Schnittstellen und legen fest, wie bestimmte Aufgaben gelöst werden, beispielsweise das Speichern von Objekten in einer relationalen Datenbank. Für die ausführbare Funktion sorgt jeweils eine Implementierung.
Wenn ich gegen diese standardisierten APIs programmiere, kann ich meine Anwendung auf einem anderen Server betreiben, der dieselben Spezifikationen erfüllt. Beim Weiterentwickeln der Plattform soll die Kompatibilität erhalten bleiben, damit Anwendungen über Jahre einsetzbar bleiben.
Als sogenannte Umbrella-Spezifikation stimmt Java EE die enthaltenen Standards aufeinander ab. Dadurch lässt sich etwa Dependency Injection innerhalb anderer Java-EE-Technologien einsetzen, wodurch weniger Code nötig wird, um die Komponenten miteinander zu verbinden. Mit Java EE 7 kommt unter anderem eine standardisierte WebSocket-API hinzu.
Wie neue Standards entstehen
Über den Java Community Process, JCP, durchläuft ein Java Specification Request, JSR, einen festgelegten Prozess vom Vorschlag bis zur fertigen Spezifikation. Die beteiligten Mitglieder prüfen unter anderem, welche Standards bereits existieren und wie sich ein Vorschlag umsetzen lässt. Dieser Prozess kann mehrere Jahre dauern.
JSRs betreffen auch Funktionen der Java-Sprache. Für eine neue Java-EE-Version werden passende Spezifikationen ausgewählt und so zusammengeführt, dass sie zusammenarbeiten.
Anwendungen im Container betreiben
Meine Java-EE-Anwendung deploye ich in einen Application-Server, der sie startet und als Container die Infrastruktur bereitstellt. Dazu gehören beispielsweise Datenbankverbindungen und benannte Dienste. Auch Queues für Messaging können dort bereitstehen.
Die Anwendung fordert die benötigten Ressourcen beim Server an. Damit das funktioniert, müssen die Ressourcen eingerichtet sein und ihre Namen zur Anwendung passen. Der Container übernimmt außerdem Aufgaben wie das Verwalten von Abhängigkeiten, wodurch weniger Setup-Code in der Anwendung erforderlich ist.
Ein:e Administrator:in verwaltet den Server und richtet dort beispielsweise Datenbankverbindungen ein. Häufig übernimmt ein:e Entwickler:in diese Aufgaben selbst, etwa über die Weboberfläche des Servers.
Profile passend zur Anwendung wählen
- Full Profile: Der Server stellt sämtliche Funktionen bereit, die Java EE spezifiziert. Dazu gehören auch Technologien für umfangreichere Enterprise-Anwendungen, etwa JMS und die vollständigen EJB-Funktionen.
- Web Profile: Es umfasst eine kleinere Auswahl für klassische Webanwendungen, beispielsweise JSF und CDI. JAX-RS gehört standardmäßig nicht dazu.
Für eine Anwendung mit CRUD-Operationen auf Datenbanktabellen reicht die kleinere Auswahl häufig aus. Wenn der Server nur die benötigten Komponenten lädt, sinkt der Aufwand beim Starten und Deployen sowie der Bedarf an Ressourcen.
Beispiele für Server
Als bekannte Produkte gehören IBM WebSphere und Oracle WebLogic zum Java-Umfeld. Hinzu kommen JBoss und die Open-Source-Variante WildFly.
GlassFish ist die Open-Source-Referenzimplementierung der Java-EE-Plattform. TomEE gibt es in verschiedenen Varianten, etwa mit Web Profile oder zusätzlichen REST-Funktionen. Tomcat bietet einen reduzierten Funktionsumfang.
Jetty lässt sich direkt aus einem Java-Prozess starten, was beispielsweise automatisierte Tests einer Webanwendung erleichtert.
Wichtige Spezifikationen und ihre Referenzimplementierungen
Eine Referenzimplementierung setzt die Funktionen um, die eine Spezifikation vorgibt. Für die folgenden Technologien gehören diese Namen zum Grundlagenwissen:
| Spezifikation | Aufgabe | Referenzimplementierung |
| — | — | — |
| JSF, JavaServer Faces | Weboberflächen erstellen | Mojarra |
| JPA, Java Persistence API | Objekte in Datenbanken speichern | EclipseLink |
| CDI, Contexts and Dependency Injection | Abhängigkeiten bereitstellen | Weld |
| JAX-RS | REST-Webservices anbieten | Jersey |
| Bean Validation | Daten anhand von Regeln prüfen | Hibernate Validator |
| JAX-WS | SOAP-Webservices anbieten | Metro |
Für JPA gibt es beispielsweise auch Hibernate als alternative Implementierung. Weitere Java-EE-Spezifikationen betreffen unter anderem Servlets und JavaServer Pages. JNDI ermöglicht Lookups anhand von Namen, während JMS Nachrichten überträgt. APIs für Transaktionen und Autorisierung gehören ebenfalls zur Plattform.
Mit JPA Objekte speichern
Für meine Datenbankklassen schreibe ich zunächst POJOs, Plain Old Java Objects. Über Annotationen lege ich fest, wie sie gespeichert werden:
@Entitykennzeichnet eine Klasse, deren Objekte in der Datenbank abgelegt werden sollen.@Idmarkiert das Attribut, das eine Entität eindeutig identifiziert.
Eine Entität besitzt eine Identität, über die sie wiedergefunden werden kann. Ein Value Object wird durch seine Eigenschaften bestimmt. Bei den Begriffen aus der Datenmodellierung entspricht ein Entitätstyp einer Klasse; eine konkrete Entität entspricht einem Objekt dieser Klasse.
Für die übrigen Attribute übernimmt JPA standardmäßig deren Namen als Spaltennamen. Dieses Prinzip heißt Convention over Configuration. Auch private Attribute können dabei berücksichtigt werden, sodass die Klasse ihre Daten weiterhin kapselt.
Beziehungen abbilden
In meinem Java-Modell verknüpfe ich Objekte über Referenzen, beispielsweise ein Auto mit einer Liste von Personen, die es fahren. Der objektrelationale Mapper überführt diese Beziehungen in die Datenbankstruktur mit Fremdschlüsseln.
Mit Annotationen wie @ManyToMany beschreibst du die Kardinalität einer Beziehung. Daraus kann die Implementierung beispielsweise eine Zuordnungstabelle für eine M:N-Beziehung ableiten. Über weitere Angaben lässt sich festlegen, wie Schlüsselspalten heißen und wann verbundene Daten geladen werden:
- Eager Loading: Die verbundenen Daten werden direkt mitgeladen.
- Lazy Loading: Die Daten werden beim Zugriff nachgeladen.
Daten abfragen
Über JPQL, Java Persistence Query Language, formulierst du SQL-ähnliche Abfragen mit Klassen- und Attributnamen. Mit SQL-Kenntnissen lässt sich die Sprache gut lesen. Da die Abfragen als Strings vorliegen, fallen etwa Tippfehler in Namen erst beim Ausführen auf.
Die Criteria-API baut Abfragen über typisierte Methodenaufrufe auf. Dadurch kann der Compiler Fehler erkennen. Umfangreiche Abfragen werden dabei schwerer lesbar. Bei meinen Abfragen entscheide ich anhand der Komplexität und der gewünschten Unterstützung durch den Compiler, welchen Weg ich verwende.
NoSQL anbinden
Mit Hibernate OGM, Object Grid Mapper, lässt sich die bekannte JPA-Syntax auch für NoSQL-Datenbanken einsetzen. Ich habe damit bereits auf MongoDB zugegriffen. Das Framework unterstützt weitere Datenbanken und wird als zusätzliche Abhängigkeit eingebunden.
Weboberflächen mit JSF erstellen
Für JSF schreibe ich XHTML-Seiten mit vordefinierten Komponenten, etwa h:inputText. Das Framework erzeugt daraus die HTML-Elemente für den Browser.
Hinter einer Seite steht eine Java-Klasse, die Backing Bean. Sie enthält die Logik und verarbeitet beispielsweise Daten, die gespeichert werden sollen. Die Seite beschreibt, wie diese Daten angezeigt werden, einschließlich Listen oder Tabellen.
Über die Expression Language, EL, greife ich aus der Seite auf Eigenschaften der Bean zu. Ein Ausdruck wie #{meineBean.name} verbindet beispielsweise ein Textfeld mit dem entsprechenden Attribut. Die Logik in der Java-Klasse lässt sich separat testen.
Ein Servlet ist eine Java-Klasse, die HTTP-Requests verarbeitet und daraus HTTP-Responses erzeugt.
Mit CDI Abhängigkeiten bereitstellen
Wenn meine Klassen voneinander abhängen, übernimmt der Container das Bereitstellen der benötigten Objekte. Über @Inject kennzeichne ich beispielsweise ein privates Attribut für ein Repository, das automatisch gesetzt werden soll.
Im beschriebenen Beispiel besitzen die verwalteten Klassen einen parameterlosen Konstruktor, damit der Container sie instanziieren kann. Existiert genau eine passende Klasse für ein angefordertes Interface, erkennt der Container diese Zuordnung automatisch.
Bei mehreren passenden Implementierungen entsteht eine mehrdeutige Abhängigkeit. Solange diese ungeklärt bleibt, bricht der Container den Start der Anwendung ab. Dadurch erkenne ich entsprechende Fehler bereits beim Starten.
REST-Services mit JAX-RS anbieten
Mit JAX-RS, Java API for RESTful Web Services, veröffentliche ich Java-Klassen als REST-Ressourcen. Annotationen bestimmen beispielsweise, welche HTTP-Methode angesprochen wird und welches Datenformat zurückkommt.
Eine Methode, die Autos zurückliefert, kann mit @GET und @Produces(MediaType.APPLICATION_JSON) versehen werden. Das Framework übernimmt die JSON-Ausgabe der zurückgegebenen Objekte. Weitere HTTP-Methoden lassen sich passend zur Ressource festlegen.
Für meine CeBIT-Beispielanwendung habe ich so ein AngularJS-Frontend an eine Java-EE-Anwendung angebunden. Das Frontend erhält die Daten als JSON und zeigt sie an.
Was du für die Prüfung erklären können solltest
Für die allgemeine Abschlussprüfung halte ich konkrete Fragen zu Java EE für unwahrscheinlich, da IT-Azubis mit unterschiedlichen Programmiersprachen arbeiten. Allgemeine Konzepte wie Dependency Injection kommen als Prüfungsstoff infrage.
Wenn du dein Abschlussprojekt mit Java EE umsetzt, erwarte ich als Prüfer, dass du die darin eingesetzten Technologien fachlich erklären kannst. Dazu gehört beispielsweise, wie dein objektrelationaler Mapper arbeitet oder wie CDI die Abhängigkeiten deiner Anwendung auflöst.
Weiterführende Inhalte
Unter anwendungsentwicklerpodcast.de/54 habe ich Links zu offiziellen Dokumentationen und Wikipedia-Artikeln zusammengestellt. Mein erwähnter CeBIT-Vortrag behandelt leichtgewichtige Webentwicklung mit Java EE.
Im Blog verlinke ich außerdem einen kostenfreien Artikel darüber, wie relationale Datenbanken intern funktionieren. Er behandelt unter anderem Query-Optimierung und die verwendeten Datenstrukturen.
Über meinen Newsletter erhältst du wöchentliche Neuigkeiten sowie Checklisten zum Abschlussprojekt. Für die folgende Episode plane ich Tipps zum Einstieg in die Projektarbeit, sobald der Projektantrag genehmigt ist.
Transkription der gesamten Episode
Automatisch erzeugte Transkription der Episode
Herzlich Willkommen zum Anwendungsentwickler-Podcast, dem Podcast rund um die Ausbildung zum Fachinformatiker für Anwendungsentwicklung.
In dieser Episode gibt es eine Lernzimmerkontrolle zum Thema Java EE. Viel Spaß!
Hallo und herzlich Willkommen zur 54. Episode des Anwendungsentwickler-Podcasts.
Mein Name ist Stefan Macke und heute mache ich mal weiter mit einer Lernzielkontrolle.
Die letzte ist ja schon ein bisschen her. Da ging es damals um Java und auch heute geht es ein bisschen um Java.
Allerdings nicht um die Kernprogrammiersprache, sondern um die Plattform Java.
Und zwar ganz konkret um die Enterprise Edition, um Java EE.
Und zwar aktuell in der Version 7, also um alles das, was man da so benutzt und benutzen kann.
Und alles, was ich für abfragenswert halte, das habe ich heute mal in diese Episode gepackt.
Meine beiden Azubis lernen das auch gerade. Die setzen gerade ihre ersten Web-Anwendungen mit Java EE um.
Und da bietet es sich an, dass ich auch nochmal für die natürlich hier die Inhalte ein bisschen wiederhole.
Und das Wichtigste, was ich so abfragen würde, wenn ich das zum Thema mal irgendeiner Lernzielkontrolle machen würde, das habe ich hier heute mal zusammengefasst.
Gut, dann steigen wir doch einfach direkt ein mit einer simplen Einstiegsfrage.
Was gibt es denn von Java überhaupt so für Versionen in Anführungszeichen oder Varianten?
Und da gibt es eigentlich drei. Die ME, die SE und die EE.
Ausgesprochen wären das die Micro Edition, die Standard Edition und die Enterprise Edition.
Und die Enterprise Edition ist genau das Thema der heutigen LCK.
Im Prinzip haben wir bislang, wenn wir von Java gesprochen haben, immer von der Standard Edition gesprochen.
Das ist eigentlich die Programmiersprache, die man zum Beispiel in der Berufsschule, im Studium usw. auch immer lernt.
Alles das, was so eine Java so machen kann. Ja, was kann man denn da so machen?
Ich weiß nicht, XML-Dateien verarbeiten, Dateien überhaupt aufmachen, Web-Verbindungen herstellen, Datenbank-Verbindungen usw.
Das kann man alles mit der Standard Edition machen.
Allerdings geht es darum herum, sage ich mal, noch einen ganzen Haufen an Frameworks, die die Kernfunktionalität, sage ich mal, erweitern um bestimmte Inhalte.
Und dann sprechen wir von der Enterprise Edition. Darum geht es halt heute.
Die Micro Edition, das ist eine abgespeckte Variante von Java.
Die ist optimiert für mobile Geräte bzw. läuft auch auf solchen Dingern wie Set-Top-Boxen für Fernseher usw.
Da ist also nicht mehr alles drin, was in der SE drin ist.
Die EE enthält allerdings alles, was in der SE enthalten ist und erweitert die halt um zusätzliche Frameworks, Spezifikationen, APIs usw.
Sind wir auch gleich schon bei der nächsten Frage.
Also was ist jetzt konkret die Enterprise Edition von Java?
Das ist im Prinzip nichts weiter als eine Sammlung von verschiedenen Spezifikationen für zum Beispiel Frameworks oder Bibliotheken oder APIs, um Java um bestimmte Funktionalitäten zu erweitern.
Als Beispiel sowas wie den Datenbankzugriff über einen objektrelationalen Mapper.
Da gäbe es eine Spezifikation, die festlegt, wie man das vielleicht mit Java machen sollte, damit nicht jeder sein eigenes Ding da dreht.
Hat man halt sich irgendwann mal überlegt, das könnte man mal verallgemeinern und hat dafür eine Spezifikation geschrieben.
Und diese Spezifikation ist zum Beispiel Teil der Java EE Spezifikation.
Wenn man bei Oracle auf der Seite mal guckt, Oracle ist ja der Hersteller von Java und daran nachrichte ich mich auch immer, wenn ich an die Dokumentation denke und an irgendwelche Listen usw.
Da gucke ich da immer nach.
Und auf der Seite von Oracle habe ich mal gezählt, es sind insgesamt 38 Spezifikationen, die unter Java EE 7 in diesem Fall zusammengefasst werden.
Java EE, die Version ist übrigens nicht immer identisch zu der Version der Programmiersprache.
Java selber, die Sprache, hat ja aktuell die Version 8, aber EE hinkt dem immer so ein bisschen hinterher.
Also wenn wir jetzt hier von EE 7 sprechen, heißt das nicht, dass wir auch in Java Version 7 programmieren müssen, also zum Beispiel keine Lambdas benutzen können usw.
Wir können in Java 8 programmieren, aber diese Spezifikation hat halt die Version Nummer 7.
Und es ist auch schon Java EE 8 eigentlich gerade in der Mache und kurz vor der Veröffentlichung, aber es ist halt jetzt noch nicht freigegeben.
Deswegen arbeiten wir jetzt noch mit der Java EE Version 7, programmieren dann aber mit Java und allen Sprachmitteln, die Java 8 bietet.
Also muss man immer so ein bisschen aufpassen bei diesen Versionen, das passt nicht immer hundertprozentig zusammen.
Java EE 7 nun aber sind wie gesagt 38 Spezifikationen und da sind jetzt gerade in Java EE 7 im Vergleich zu EE 6 einige wichtige Spezifikationen dazugekommen,
die halt auch gerade die Erstellung von Web-Anwendungen deutlich erleichtern oder bestimmte Features überhaupt erst ermöglichen, wie zum Beispiel Websockets.
Websockets gab es in Java EE 6 noch nicht, da gab es zwar Frameworks, Bibliotheken, die das alles schon umsetzen konnten, aber es war halt noch nicht standardisiert.
Und jetzt mit Java EE 7 wird halt eine Websocket-API eingeführt und ist jetzt Teil des Standards, sodass ich mich also darauf verlassen kann,
dass auch in Zukunft, ja, wenn ich gegen diese API entwickle, die halt weiter gepflegt wird und es abwärtskompatibel bleiben wird.
Das ist eigentlich auch gleichzeitig der große Vorteil von Java EE, denn wenn ich mich an diese API halte und gegen diese Spezifikationen programmiere,
dann kann ich hundertprozentig sicher sein, dass das auch noch viele Jahre in der Zukunft so funktionieren wird.
Denn diese Spezifikation ist quasi wie in Stein gemeißelt, ja, und alle, zum Beispiel Server, die diese Spezifikationen implementieren,
die vereinbaren halt quasi wie einen Vertrag, ja, wie eine Schnittstelle, gegen die ich hier entwickle.
Und das bedeutet, dass ich auch sowohl einmal von meinem Server völlig unabhängig bin, ich kann den total austauschen gegen irgendeine andere Implementierung,
weil halt alle mit der gleichen API arbeiten müssen, aber ich kann halt auch sicher sein, dass bei dem Prozess der Weiterentwicklung von Java und von Java EE
darauf geachtet wird, dass diese APIs in Zukunft auch weiter funktionieren.
Das heißt, wenn ich jetzt eine Anwendung entwickle, die vielleicht noch zehn Jahre im Einsatz sein soll,
dann möchte ich vielleicht schon, dass die auch in zehn Jahren noch funktioniert und ich nicht alle zwei Jahre den Code neu schreiben muss,
weil sich auf einmal irgendeine API verändert hat.
Und das ist eigentlich der große Vorteil, deswegen setzen wir zum Beispiel auch auf Java EE,
weil wir sicher sein können, dass es eine langlebige Spezifikation ist und wir die Anwendung, die wir heute schreiben, auch in ein paar Jahren noch einsetzen können.
So, diese Spezifikationssammlung EE, wie gesagt, diese 38 Dinger, die ich da erwähnt habe,
da achtet jetzt der sogenannte Community-Prozess, der sich auch darum kümmert, die neuen Spezifikationen aufzunehmen und so weiter,
darauf, dass diese Spezifikationen alle gut zusammenarbeiten.
Das ist eigentlich jetzt genau der Vorteil dieser, sage ich mal, das heißt auch auf Englisch gerne Umbrella-Spezifikation,
also eine Regenschirm-Spezifikation im Prinzip, die alle anderen zusammenfasst.
Und da ist jetzt halt der Vorteil, wenn ich zum Beispiel Dependency Injection mir angucke und dafür gibt es eine Spezifikation,
dann kann ich dieses Dependency Injection in allen möglichen anderen Frameworks, die auch Teil der Spezifikationen von Java EE sind,
einfach so benutzen und ich kann sicher sein, dass es auch funktioniert.
Ich muss also zum Beispiel nicht, wenn ich mehrere verschiedene Spezifikationen nutzen will,
meinetwegen Datenbankzugriff und REST-API und auch noch CDI für Context and Dependency Injection,
dann muss ich nicht immer gucken, wie funktioniert das da und kriege ich das da irgendwie integriert
und hier muss ich noch irgendwie durch drei Reifen springen, um die API anzupassen und das überhaupt ansprechen zu können.
Nein, wenn ich diese Java EE Spezifikationen benutze, dann weiß ich, dass die aufeinander abgestimmt sind
und dass ich das eine mit dem anderen wunderbar kombinieren kann
und ich eben nicht mehr Aufwand habe, um die Sachen irgendwie miteinander zu verdrahten.
Das ist eigentlich der große Vorteil.
Das heißt, wenn ich mich daran halte und gegen diese Spezifikationen arbeite,
dann habe ich es als Entwickler einfacher.
Ich folge diesem Standard.
Ich weiß, ich habe eine langlebige Applikation.
Diese API wird sich nicht sehr schnell ändern, sage ich mal.
Und ich muss auch nicht meine Zeit mit Konfigurationen und Verdrahtungen verbringen,
sondern ich kann das einfach so benutzen und es funktioniert.
Das ist zumindest der Ansatz der Spezifikation.
Jetzt haben wir schon gerade grob gestriffen, wie neue Standards in Java EE dazukommen.
Da gibt es einen sogenannten Java Community Process, den JCP,
der selber sogar als ein sogenannter Java Specification Request damals ins Leben gerufen wurde.
Und dieser Community Process definiert den Prozess wie solche Spezifikationsanforderungen,
also Spezification Requests, ihren Weg durchlaufen von dem initialen Vorschlag bis hin zur fertigen Umsetzung.
Da gibt es also quasi einen ganzen Lebenszyklus, den so eine Spezifikation durchläuft.
Und da gibt es eben einen fest definierten Prozess, an dem man sich dann halten muss.
Dann wird zum Beispiel eine Anfrage gestellt und dann gibt es ein paar Mitglieder dieses Konsortiums,
die dann gucken, ob sowas schon gibt oder ob das sinnvoll ist und was man da standardisieren müsste
und wie man das dann umsetzen kann und so weiter und so fort.
Das ist teilweise ein mehrjahrelanger Prozess, bis so eine Spezifikation dann fertig ist.
Und diese Mitglieder, die kümmern sich dann eben darum, dass diese Spezifikation irgendwann einmal veröffentlicht wird
und dann zum Beispiel Teil von Java EE meinetwegen wird.
Muss es aber nicht. Es gilt auch für alle möglichen anderen Features.
Beispielsweise, wenn wir irgendwie Typ-Inferenz in Java haben wollten oder so.
Ja, das würde man auch über so eine Spezifikationsanforderung lösen.
Das muss nicht automatisch in Java EE münden. Das kann auch in Java, die Programmiersprache, letztlich dann eingehen.
Von daher, dieser Prozess ist für alle Features, die irgendwie in Java rein sollen, der gleiche.
Und am Ende wird dann halt eben ausgewählt, so für Java EE Version X,
nehmen wir jetzt diese 35 meinetwegen anderen Spezifikationen und bandeln die so zusammen,
dass sie halt miteinander arbeiten und verpacken das Ganze als ein hübsches Paket.
Und dann haben wir quasi eine neue Java EE Version.
Also, es gibt den Java Community Prozess und der bearbeitet die Java Spezifikation Requests.
Und durch diese Requests kommen halt die neuen Features in die Sprache und auch in die Plattform.
So, wenn wir uns jetzt mal die Anwendungen in dieser Plattform anschauen,
dann werden die etwas anders ausgeführt, als man es vielleicht von Java so kennt.
Die meisten werden wahrscheinlich Java irgendwie aus der Berufsschule kennen oder aus dem Studium.
Und da arbeitet man dann halt mit so einer Main-Methode und die wird dann auf der Konsole ausgeführt.
Oder man macht irgendwie eine Swing-Anwendung oder jetzt ganz neuerdings mit JavaFX irgendwie eine GUI-Geschichte.
Das ist alles wunderbar, funktioniert in Java EE aber ein bisschen anders.
Und zwar ist der Ansatz von Java EE, dass das Programm, das wir da bauen, in einem sogenannten Container läuft.
Und dieser Container, der stellt der Anwendung alle möglichen Sachen bereit, die sie so braucht.
Wie zum Beispiel Verbindungen zu Datenbanken oder ein Naming,
dass ich meinetwegen irgendwelche Services anhand eines Namens identifizieren kann.
Oder zum Beispiel, wenn ich Messaging benutze, irgendwelche Queues und so weiter.
Diese ganze Infrastrukturgeschichte, die, wenn ich sie per Hand schreiben müsste,
ziemlich kompliziert wäre und aufwendig wäre, die liefert mir quasi dieser Container schon out of the box.
Und der Container, das ist der sogenannte Application-Server.
Das ist das Ding, in dem meine Anwendung läuft.
Das heißt, ich kann nicht einfach auf der Konsole sowas sagen wie, hey, starte mal meine Java EE-Anwendung,
sondern ich muss die in einen sogenannten Application-Server eben deployen.
Das heißt, ich veröffentliche die in diesem Server und der stellt dann eben diese ganze Infrastruktur bereit,
sorgt dafür, dass das alles da ist und startet dann meine Applikation.
Wenn die Applikation dann zum Beispiel sagt, hey, ich hätte gerne eine Datenbankverbindung,
dann sagt der Application-Server, ja klar, hier hast du sie.
Vorausgesetzt natürlich die Konfiguration passt, der Name ist der gleiche und so weiter und so fort.
Also der Application-Server stellt potenziell diese Infrastruktur bereit.
Natürlich muss die Anwendung korrekt mit dem Application-Server kommunizieren
und zum Beispiel nach der richtigen Datenbankverbindung fragen.
Die muss es halt auch geben, logischerweise.
Aber grundsätzlich ermöglicht das halt dem Entwickler, sage ich mal,
diese ganze Infrastrukturgeschichte völlig außer Acht zu lassen.
Ich sage einfach nur, ich brauche eine Datenbank, ich brauche eine JMSQ
und ich sage, so und so soll die heißen und frage einfach den Application-Server,
der gibt mir das und dann lege ich los.
Ich habe also nicht diesen enorm vielen Setup-Code, den ich normalerweise hätte.
Als Beispiel, wenn ich so Dependency Injection machen würde,
vielleicht kennst du ja irgendwelche anderen Dependency Injection Frameworks,
wo du dann irgendwie erstmal in der XML-Konfiguration festlegen musst,
welche Instanz von welcher Klasse für welches Interface bereitgestellt werden soll.
Oder das machst du irgendwie über Code und dann hast du erstmal 10 Zeilen Code,
um diesen Dependency Injection Container zu starten, um irgendwelche Klassen zu registrieren
und so weiter und so fort.
Und diesen ganzen Kram kannst du im Prinzip sparen, wenn du einen Application-Server hast,
denn das macht der alles automatisch.
Ich muss also weder riesengroße XML-Dateien mit Konfiguration fliegen,
noch in meinem Programm erstmal ganz viel Setup-Code schreiben,
sondern ich sage einfach, hey, ich will eine Databank-Verbindung haben,
und der Application-Server gibt mir die einfach.
So jetzt mal ins Unreine gesprochen, so ganz bildlich dargestellt.
Ich habe deutlich weniger Code, deutlich weniger Konfiguration
und muss mich um diesen ganzen Kram halt nicht kümmern.
Hat aber auch zur Folge, dass irgendwer anders sich darum kümmern muss.
Das heißt, es wird einen Administrator geben, der diesen Application-Server veraltet
und der da zum Beispiel die Datenbank-Verbindung konfiguriert und monitort und so weiter.
Also irgendwer muss das natürlich tun, keine Frage.
Und meistens machen das auch die Entwickler dann tatsächlich selber.
Aber ich mache es halt eben nicht mehr in meinem Code und in meinem XML,
sondern es ist halt eben zum Beispiel beim Application-Server in der Web-Oberfläche,
der mir diese Funktionalitäten dann bereitstellt.
Jetzt gibt es allerdings bei diesen Application-Servern im Java-EE-Umfeld
zwei verschiedene sogenannte Profile.
Und zwar einmal das Web-Profile und einmal das Full-Profile.
Das Full-Profile, das bietet im Prinzip alle Funktionalitäten an, die Java-EE spezifiziert.
Also alle 38 Stück.
Das heißt, wenn ich irgendwie, ich weiß nicht, auf die Datenbank will oder REST oder SOAP
oder WebSockets oder was auch immer machen will, das ist alles da.
Und ich kann davon ausgehen, dass das Server das komplett anbietet.
Beim Web-Profile geht es darum, dass nicht alle Spezifikationen implementiert sind,
sondern nur ein paar, und zwar deutlich weniger.
Ich glaube, das sind ungefähr 10 oder so, also wirklich ein Drittel ungefähr.
Und bestimmte Spezifikationen, die man sehr selten braucht, sind dann z.B. nicht dabei.
Wie z.B. die REST-Geschichten.
JAX-RS, das ist das Framework, um REST-Services bereitzustellen,
das ist z.B. im Web-Profile standardmäßig nicht drin.
Und z.B. auch JMS oder die historisch bedingt sehr schwergewichtigen EJBs,
die sind nicht dabei.
Aber das Web-Profile umfasst z.B. sowas wie JSF fürs Frontend
oder CDI, Context Independency Injection und so weiter.
Also sage ich mal, für so eine klassische Web-Anwendung ist da alles Wichtige dabei.
Aber wenn es dann ein bisschen ins Eingemachte geht
und ich wirklich an Java Kernfunktionalität rein,
oder das brauche, sage ich mal, auch für so eine knackige Enterprise-Anwendung,
dann ist eben nicht mehr alles dabei.
Und dann brauche ich wirklich so einen full Java-IE-Server,
der mir das komplett anbietet.
Warum gibt es jetzt die beiden unterschiedlichen Varianten?
Naja, die Web-Anwendungen sind klassischerweise, oder sollten klassischerweise
eher so ein bisschen leichtgewichtig sein.
Ich will die knackig in ein paar Sekunden mal eben deployen können.
Und wenn der Application-Server erstmal einen riesen Stack mit 35 Frameworks laden muss,
obwohl ich die eigentlich alle gar nicht brauche,
dann ist das natürlich Zeit und vor allem vielleicht auch Arbeitsspeicher
und vielleicht auch Plattenplatz, der da eigentlich verloren geht,
obwohl ich die ganzen Dinge gar nicht brauche.
Genauso wie ich bei einem Web-Server, wenn ich den absichern,
nicht erstmal alle möglichen Services installiere,
wie FTP und Telnet und weiß der Geier was,
obwohl das eigentlich niemand braucht,
werde ich bei so einem Application-Server erstmal nur das nehmen,
was ich wirklich haben will.
Und zwar irgendwie die Datenbank-Anbindung und meinetwegen ein Web-Framework.
Und der Rest drumherum, der interessiert mich erstmal nicht.
Und genau deswegen gibt es diese beiden Profile.
Für so eine klassische Web-Anwendung, ich sag mal CRUD-Operationen
über so ein bisschen Datenbank-Tabellen im Hintergrund,
da brauche ich halt eben nicht diese ganzen Frameworks, die ich genannt habe.
Von daher lasse ich die da weg.
Kann halt eben schnell und sag ich mal einfach und leichtgewichtig etwas deployen.
Und wenn ich dann wirklich eine krasse Enterprise-Applikation mit SAP-Anbindung habe
und ich weiß nicht, asynchronen Nachrichten und weiß der Geier was,
dann nehme ich mir halt einen richtig dicken Server, in Anführungszeichen,
der halt diesen ganzen Kram dann auch umsetzt.
So, dann kommen wir doch mal ein bisschen zur Praxis.
Was gibt es denn jetzt so für Application-Server im Java-Umfeld?
Und so ein paar bekannte Namen, die sollte man schon mal gehört haben.
Zum Beispiel Websphere, das ist von IBM.
So eine richtig dicke Kiste, sag ich mal, die auch kommerziell ist und richtig teuer.
Weblogic wäre quasi der offizielle Server von Oracle, vom Hersteller quasi selber.
Dann gibt es noch JBoss als großen Vertreter.
Und es gibt auch viele Open-Source-Geschichten, wie zum Beispiel Wildfly.
Das ist die Open-Source-Variante von JBoss.
Dann haben wir den Glassfish, das ist die Referenzimplementierung übrigens,
also Referenz-Java-EE-Server von Oracle.
Das ist kein kommerzielles Produkt, sondern Open-Source und gleichzeitig auch die Referenzimplementierung.
Und es gibt zum Beispiel noch den Tommy, das ist so ein bisschen der Nachfolger von Tomcat.
Tomcat ist kein kompletter EE-Server, sondern wie gesagt so ein Web-Profile oder so ein abgespeckter.
Und der Tommy, davon gibt es gleich mehrere Varianten in verschiedensten Konstellationen.
Den gibt es mit Web-Profile, den gibt es mit Web und REST, den gibt es als kompletten EE-Server und so weiter.
Also da kann man sich genau die Versionen schnappen, die man wirklich braucht.
Und es gibt zum Beispiel auch einen Application-Server mit dem Namen Jetty.
Den kann ich dann zum Beispiel auch quasi aus meinem Java-Prozess heraus direkt selber starten.
Und damit kann ich zum Beispiel meine Applikationen sehr schön automatisiert testen.
Das ist quasi ein automatisierbarer Application-Server, den ich quasi mitliefern kann mit meiner Anwendung, wenn man so will.
Und welche Spezifikationen sind jetzt genau Teil von Java EE?
Also keine Angst, ich gehe jetzt hier nicht die 38 verschiedenen Spezifikationen durch.
Das kann sich eh keiner merken und das ist auch irrelevant.
Aber was man mal so ein paar wichtige gehört hat.
Es gibt zum Beispiel die Enterprise Java Beans, das sind die EJBs.
Dann gibt es die Servlets.
Dann gibt es Java Server Pages, womit jahrelang viele Web-Anwendungen gebaut wurden.
Dann gibt es zum Beispiel Web-Services.
Es gibt JMDI für Lookups anhand von Namen.
Es gibt JMS, Java Message Service.
Es gibt eine Transaction API und eine Autorisierungs-API.
Java Mail, XML, RPC, RESTful, tralala.
Also wirklich ganz, ganz viele verschiedene Spezifikationen sind halt da zusammengefasst.
Und ich nehme jetzt einfach mal ein paar Kernspezifikationen raus,
die man wahrscheinlich, sage ich mal, in seinem Entwickleralltag dann tatsächlich auch mal anwenden wird.
Es mag sein, dass du jetzt, wenn du mit Java arbeitest, tatsächlich auch irgendwie asynchrone Nachrichten über JMS verschickst.
Das kann alles sein.
Ich sage mal, für so eine klassische Web-Anwendung brauchen wir das allerdings nicht.
Da brauchen wir irgendwie Zugriff auf eine Datenbank.
Da brauchen wir ein bisschen Validierung und da brauchen wir ein Frontend.
Und dann haben wir es eigentlich.
Und deswegen gehe ich mal die wichtigsten Implementierungen aus meiner Sicht,
sage ich jetzt mal, für den Alltag mal einmal kurz durch.
Und da gibt es dann auch immer entsprechende Referenzimplementierungen.
Denn, wie gesagt, diese Spezifikationen beschreiben eigentlich nur eine Schnittstelle.
Das heißt, wenn ich dagegen arbeite, dann habe ich erstmal keine Implementierung.
Ich weiß zwar, wie die API aussieht und wie meine Programmieraufrufe aussehen müssen,
aber ich habe halt niemanden dahinter, der das tatsächlich dann auch umsetzt.
Und deswegen sollte man vielleicht für die Kernspezifikationen wissen, wie die Referenzimplementierung heißen.
Denn die sind natürlich immer dann am Puls der Zeit und setzen alle Funktionalitäten um,
die in der Spezifikation stehen.
Deswegen Referenzimplementierung.
Wenn ich halt andere Frameworks benutze, muss es nicht unbedingt so sein,
dass sie halt wirklich alles hundertprozentig so umsetzen.
Deswegen würde ich mich für bestimmte Aufgaben auf diese Referenzimplementierung berufen
und dann zum Beispiel, wenn ich irgendwie mit JPA auf den Datamarkt will,
halt vielleicht Eclipse Link als Referenzimplementierung nutzen
und nicht, was die Alternative wäre, Hibernate zum Beispiel.
Wobei ich jetzt keinen Streit anfangen will, ob Hibernate besser ist oder schlechter als EclipsLink.
Kann ich nicht bewerten, will ich auch gar nicht. Hibernate ist bestimmt genauso gut oder vielleicht sogar besser als EclipsLink.
Aber ich wollte nur sagen, es gibt eben diese Referenzimplementierung und da kann man sich halt eben sicher sein, dass die alles umsetzen, was gefordert ist.
Ich gehe jetzt einfach mal, wie gesagt, ein paar Spezifikationen durch.
JSF, da wäre die Referenzimplementierung Mojara oder Mojara wird es geschrieben, aber ich schätze, es wird Mojara ausgesprochen.
JSF, das ist das Frontend für die Webentwicklung.
Damit kann ich also HTML oder XHTML, besser gesagt mit Java Codefragmenten beziehungsweise einer speziellen Java-ähnlichen Sprache, der Expression Language, mischen und dann auch sehr einfach zum Beispiel Webfrontends erstellen.
Dann haben wir JPA, hatte ich eben schon gesagt, die Java Persistence API.
Das ist quasi meine Datenbankabstraktion, ein objektrelationaler Mapper im Prinzip.
Da ist die Referenzimplementierung das EclipsLink.
Dann haben wir CDI, das ist Context and Dependency Injection.
Das ist, wie der Name schon sagt, Dependency Injection.
Und da ist die Referenzimplementierung Welt.
Dann haben wir JaxRS, das ist die Bibliothek oder die Schnittstelle, um Rest-Web-Services zu veröffentlichen.
Die Referenzimplementierung heißt Jersey.
Und dann haben wir noch die Bean Validation.
Das ist also mein Validierungs-Framework, wo ich dann zum Beispiel sagen kann, dass der Name nur 30 Zeichen lang sein darf und so weiter.
Da ist die Referenzimplementierung Hibernate Validator.
Und als letztes habe ich dann noch JaxWS dazugenommen, also für die Web-Services, die guten alten Soap-Web-Services,
die in gefühlten 90% der Enterprise-Anwendungen immer noch eingesetzt werden und bei uns auch immer noch eingesetzt werden
und auch viele Jahre noch im Ereignis bleiben werden.
Dafür gibt es auch eine Referenzimplementierung und die heißt Metro.
So, jetzt habe ich eigentlich schon ein bisschen vorweggenommen, was ich eigentlich jetzt erzählen wollte.
Und zwar wollte ich mal so die aus meiner Sicht zentralen Spezifikationen durchgehen, die man auch tatsächlich bei der Programmierung braucht.
Das fängt für mich ganz unten an bei der Datenbank.
Das ist JPA, das ist die Java Persistence API und die legt fest, wie ich am besten in Java meine Objekte persistiere,
also klassischerweise in eine relationale Datenbank ablege.
Und da gibt es halt einen ganzen Haufen an Schnittstellen, wie ich das am besten machen kann
und wie ich meine Klassen auszeichne, damit sie automatisch in der Datenbank landen im Prinzip.
Und das definiert mir die Java Persistence API eben, das JPA.
So, Referenzimplementierung Eclipse Link, wie gerade gesagt.
Und wie mache ich das jetzt mit JPA? Was mache ich da eigentlich genau?
Grundsätzlich schreibe ich einfach erst mal POJOs, also Plain Old Java Objects, wie du das wahrscheinlich auch kennst.
Klasse machen mit Getter und Setter und Business-Logic drin und so weiter.
Und diese Klasse, die annotiere ich dann mit bestimmten Annotations aus JPA.
Und zwar schreibe ich ganz oben vor die Klasse zum Beispiel AddEntity.
Entity, das ist so ein bisschen der Begriff, der jetzt festlegt, dass diese Klasse auch in der Datenbank irgendwo persistiert werden soll.
Eine Entität, das kennen wir eigentlich schon aus dem Entity Relationship Model.
Eine Entität ist vergleichbar mit einem Objekt.
Ein Objekt aus der Objektorientierung, das beschreibe ich ja immer als ein Ding der realen Welt.
Und nichts anderes programmieren wir ja gerade, wenn wir diese Entitätsklasse bauen.
Wobei die Entität noch ein bisschen was anderes ist.
Die Entität hat nämlich eine wichtige Eigenschaft, die ist eindeutig identifizierbar.
Wenn ich mir also eine Entität anschaue, dann weiß ich, dass ich sie zum Beispiel anhand eines Schlüssels jederzeit eindeutig quasi wiederfinden kann.
Das unterscheidet zum Beispiel auch die Entität von einem sogenannten Value-Objekt, was allein aufgrund seiner Eigenschaften definiert ist.
Eine Entität hat eben zusätzlich zu diesen Eigenschaften noch eine, ja ich sag's mal ganz blöd, eine ID im Prinzip.
Und diese Entität, die schreiben wir jetzt quasi an unsere Java-Klasse dran.
addEntity schreiben wir davor und dadurch weiß jetzt JPA, aha, diese Klasse wird irgendwo in der Datenbank persistiert.
Die wird dort abgelegt.
Wie die da jetzt genau abgelegt wird, das entscheiden wir anhand einer weiteren Annotation, nämlich addId.
id, wie ich gerade schon sagte, das schreiben wir genau an das Attribut, was diese Entität jetzt eindeutig identifiziert.
Also wenn ich jetzt zum Beispiel, ja meinetwegen, sowas habe wie private long id,
also ein ganz einfaches Zahlenfeld, wo eben diese ID drin steht, dann schreibe ich davor addId
und dadurch weiß dann mein JPA, dass dieses Attribut in der Datenbank den Schlüssel enthält im Prinzip.
Ansonsten wird JPA hergehen und einfach jedes Attribut, was es in dieser Klasse findet, auf eine entsprechende Spalte in der Tabelle mappen.
Also wenn ich da einfach ein Attribut habe mit dem Namen Name, ja, ich bin gerade sehr einfallslos,
dann wird JPA in der Datenbank eine entsprechende Spalte anlegen mit dem Namen Name,
beziehungsweise wenn es die Tabelle nicht anlegt, weil es sie schon gibt, wird es halt eben eine Spalte mit dem Namen Name erwarten
und daraus die Daten ziehen, um sie in das Attribut zu packen.
Es ist also quasi schon fast wie bei Ruby on Rails, wo ich ganz viel Convention over Configuration habe.
Das heißt, ich konfiguriere nicht in meiner Java-Klasse mit 95 Annotationen, wie die Spalten in der Datenbank heißen,
sondern ich gehe einfach davon aus, dass die Spalten exakt genauso heißen wie die Attribute in meiner Klasse.
Und wenn ich davon ausgehe, muss ich einfach auch in meiner Klasse nichts weiter hinschreiben.
Ich muss einfach nur sagen, welches Attribut von meinen 27 in meiner Klasse ist denn die ID, denn das kann JPA nicht alleine rausbekommen,
aber die restlichen Spalten quasi werden einfach eins zu eins aus den Namen der Attribute übernommen.
Und die dürfen dann auch wunderbar private sein zum Beispiel.
Ich kann also auch die Kapselung einhalten, wie ich es auch aus Objektorientierung gelernt habe.
Und JPA sorgt dann dafür, dass es die Daten irgendwie aus der Datenbank ausliest und zum Beispiel Instanzen der Objekte dann erzeugt
und die Attribute entsprechend korrekt setzt.
Im Prinzip muss ich nicht mehr tun.
Also ich schreibe addEntity davor und ich spezifiziere ein Attribut als ID und die restlichen Spalten werden halt eins zu eins übernommen.
Ich kann aber auch dann noch meine Beziehungen abbilden.
Also wenn ich jetzt mehrere Entitäten habe, oder besser gesagt Entitätstypen,
also ich wiederhole das nochmal kurz.
In der Objektorientierung sprechen wir von Objekt und Klasse.
Ein Objekt ist eine Instanz der Klasse.
Und wenn wir jetzt hier von Datenbankmodellierung sprechen, dann reden wir von Entitäten und Entitätstypen.
Die Entitätstypen entsprechen quasi den Klassen und die Entitäten, das sind die konkreten Objekte.
Also meinetwegen das Auto mit der ID 57, das ist die eine Entität.
Und diese Entität kann natürlich auch in Beziehung zu anderen Entitäten stehen.
Aber ich meinte jetzt eigentlich gerade, dass wir natürlich die Entitätstypen zueinander in Beziehung setzen.
Also wie im Entity Relationship Model, wo wir unsere Kainalitäten abbilden.
Meinetwegen ein Auto hat mehrere Fahrer.
Dann muss ich das ja irgendwie in meiner Datenbank auch ablegen.
In diesem Fall Auto und Fahrer ist wahrscheinlich so eine M zu N Beziehung.
Ein Fahrer kann ja auch mehrere Autos fahren.
Und das muss ich jetzt irgendwo auch in meinem Datenmodell hinterlegen.
Und auch vor allem in meinem Objektmodell, also in meiner Klasse, die ich in Java programmiere.
Und das muss ich irgendwie Java beibringen, denn das kann er nicht von alleine wissen, wie diese Dinger in Beziehung stehen.
Und üblicherweise würde ich jetzt eben in der Objektorientierung mit Referenzen arbeiten.
Das heißt meine Klasse Auto, die hat dann zum Beispiel eine List of und dann meinetwegen Personen.
Und die heißt dann einfach Fahrer.
Das heißt ich habe zwei Klassen, Auto und Person.
Und eine Person kann halt als Fahrer eines Autos agieren.
Und weil es eben mehrere Fahrer geben kann, hat halt so ein Auto einfach eine List of Personen.
Das ist auf Objektebene wunderbar.
Ich kann direkt auf die Objekte zugreifen.
Ich habe jetzt also nicht irgendwie sowas wie Fremdschlüssel oder sowas.
Das passt auch nicht in meine objektorientierte Welt.
Das ist eben eine Datenbankdenkweise.
Aber die wenden wir hier in der Objektorientierung nicht an.
Sondern ich arbeite einfach mit Objektreferenzen.
Das Problem ist, wenn ich diese Referenzen in die Datenbank jetzt persistieren will, dann geht das nicht.
Denn die Datenbank kennt sowas wie Objektreferenzen nicht.
Die arbeitet nämlich mit Fremdschlüsseln.
Und genau diese Übersetzung, die macht jetzt dieser objektrelationale Mapper für uns im Hintergrund.
Und dafür spezifiziert JPA eben die Schnittstelle.
Ich kann also jetzt in meiner Klasse genau dieses Mapping hinterlegen.
Und zwar muss ich dafür jetzt einfach nur beibringen, der Klasse Auto,
dass zum Beispiel dieses Attribut, was ich da gerade angelegt habe mit dem Namen Fahrer, diese List of Personen,
dass das jetzt entsprechend eine Beziehung zu einer anderen Entität sein soll.
Und ich muss jetzt über eine bestimmte Annotation dann zum Beispiel sagen, wie die Schlüsselspalte heißen soll
und ob das zum Beispiel beim Lesen der Daten aus der Datenbank automatisch mitgeladen werden soll
oder erst wenn ich auf die Werte zugreife.
Also ein Lazy oder ein Eager Loading, so heißt das dann und so weiter.
Und dafür gibt es halt einige Annotationen, wie ich das ablegen kann.
Da gibt es zum Beispiel die Annotation at many to many.
Damit kann ich zum Beispiel eine M zu N Beziehung in meinem Klassenmodell abbilden.
Und JPA ist jetzt so intelligent und erkennt anhand dieser Abbildung, wie es die Daten in der Datenbank ablegen soll.
Er weiß jetzt zum Beispiel bei einer M zu N Beziehung,
aha, da muss ich wohl so eine Lookup-Tabelle in der Mitte, eine M zu N Zuordnungstabelle anlegen,
wo die beiden Fremdschlüssel auf die Entitäten drin sind.
Und das macht er automatisch im Hintergrund, ohne dass ich noch mehr irgendwie konfigurieren muss.
Ich muss ihm einfach nur sagen, das ist die eine Klasse und die hat eine Beziehung zu der anderen
und das ist entweder 1 zu 1, 1 zu N oder M zu N und den Rest, den macht JPA von alleine.
Das ist eben genau der Sinn von so einem Objekt-Relational-Mapper,
dass ich mich nicht mit beiden Welten auseinandersetzen muss,
sondern dass ich am besten in meinem Code einfach nur schreibe, wer wen kennt
und die Datenbank-Geschichten im Hintergrund, die werden quasi auf Knopfdruck automatisch generiert.
Wenn ich jetzt die Daten aus der Datenbank rausholen will,
auch dafür spezifiziert JPA eine nette Geschichte und zwar die sogenannte JPQL.
Das ist die Java Persistence Query Language.
Und damit kann ich sehr ähnlich zu SQL meine Daten abfragen.
Nur, dass ich eben nicht mit Tabellen hier arbeite, sondern mit Klassennamen.
Das heißt, ich würde nicht sowas machen wie SELECT Sternchen FROM Person oder sowas,
sondern ich würde machen SELECT Sternchen FROM Person, allerdings mit großem P,
weil wir hier von einer Klasse Person sprechen.
Und ich kann jetzt auch über die Namen der Attribute, zum Beispiel WHERE abfragen und so weiter machen.
Die Syntax ist quasi identisch zu SQL.
Nur, dass wir eben nicht mit Datenbank-Tabellen arbeiten, sondern mit echten Objekten in Anführungszeichen
und zum Beispiel auch mit Punkt Name direkt auf die Attribute zugreifen können.
Ist eine tolle Sache.
Das Problem dabei ist, dass das Ganze String-basiert ist.
Das heißt, es gibt kein Syntax-Highlighting.
Es gibt kein Syntax-Check zum Beispiel meiner IDI.
Das wird erst zur Laufzeit herausgefunden, ob das Ding überhaupt gültig war oder nicht.
Also ob ich mich irgendwo zum Beispiel vertippt habe bei einem Klassennamen oder sowas.
Das sehe ich bei der Programmierung nicht, sondern erst, wenn ich es ausführe.
Das ist also der zentrale Nachteil von JPQL.
Ansonsten ist das Ding super lesbar.
Denn wenn ich SQL kann, kann ich im Prinzip auch JPQL.
Deswegen gibt es noch einen weiteren Punkt, und zwar die Criteria-API.
Also quasi die Kriterien-API, wenn man so will auf Deutsch.
Darüber kann ich typisiert auf meine Inhalte zugreifen.
Ich schreibe also keine Strings, sowas wie SELECT Sternchen FROM irgendwas,
sondern ich schreibe quasi typisiert über Methoden solche Dinge,
wie zum Beispiel, keine Ahnung, ich weiß es jetzt nicht genau,
aber PERSON, PUNKT, SELECT und dann in Klammern irgendwie sowas,
dass ich also schon durch den Compiler prüfen lassen kann,
ob das, was ich da eingebe, auch wirklich korrekt ist.
Der Nachteil ist, dass es nicht mehr so schön lesbar ist.
Der Vorteil ist halt, der Compiler checkt, ob ich irgendwo einen Fehler drin habe.
Von daher muss ich immer genau wissen, was möchte ich denn haben.
Habe ich zum Beispiel ganz komplexe Abfragen,
dann ist es vielleicht sinnvoll, dass ich die möglichst lesbar gestalte und JPQL nehme.
Wenn ich aber einfach durch den Compiler unterstützt werden möchte
und möglichst wenig Fehler einbauen möchte,
nehme ich vielleicht eher die Criteria-API, weil der Compiler das halt eben checken kann.
So, kurze Frage noch am Ende zu JPA.
Kann man damit auch NoSQL anbinden?
Das muss natürlich heute sein.
Wenn man modern und hip und fesch sein will,
dann bindet man natürlich auch NoSQL-Datenbanken an,
wie zum Beispiel MongoDB und so weiter.
Und das geht auch, allerdings nicht direkt mit JPA
und zum Beispiel der Implementierung Hibernate, die dahinter liegt.
Denn das ist halt schon ein komplett anderes Konzept bei NoSQL-Datenbanken.
Aber es gibt ein nettes Framework, das heißt Hibernate OGM.
Das steht für Object Grid Mapper.
Und das ist quasi genau die Lösung für das Problem.
Dann kann man mit der Standard-JPA-Syntax, die man auch schon kennt,
mit dem Framework im Hintergrund auch zum Beispiel auf dokumentenorientierte Datenbanken,
wie zum Beispiel MongoDB zugreifen,
habe ich auch schon selbst gemacht, funktioniert einwandfrei, kein Problem.
Ist also eine Dependency, die man eintragen muss
und schwupp kann ich auch auf alle möglichen NoSQL-Datenbanken zugreifen.
MongoDB war jetzt nur ein Beispiel.
Es gibt noch wirklich für alle möglichen anderen Datenbanken.
Keine Ahnung, Cassandra und…
Also fällt mir jetzt gerade alles nicht ein.
Aber da wir auf jeden Fall 20 verschiedene Datenbanken haben,
die implementiert auf jeden Fall, damit kann man eigentlich alles abdecken,
was man heutzutage so an NoSQL-Datenbanken anbinden können sollte.
Ja, kommen wir zum nächsten Punkt.
JPA ist für mich abgehakt, Datenbank.
Das war es dann zu dem Thema.
Wir haben aber auch noch das Frontend, nämlich unsere HTML-Seiten.
Und dazu wird das JSF benutzt, die Java Server Faces.
Das ist quasi das Framework, was es mir ermöglicht,
eben recht einfach HTML-Frontends zu erzeugen.
Und das Ganze sieht dann so aus, dass ich quasi xHTML schreibe.
Da gibt es dann vordefinierte Tags,
die dann zum Beispiel auch aus so einer Bibliothek von JSF kommen.
Da würde ich dann zum Beispiel nicht eingeben
sondern ich mache dann halt im Namespace von JSF
sowas wie h.inputtext und so weiter und so fort.
Das heißt, ich schreibe nicht direkt HTML,
sondern ich schreibe quasi einen XML-Dialekt,
der dann übersetzt wird in die entsprechenden HTML-Elemente.
Aber ich kann dann relativ einfach zum Beispiel auch
auf meine Java Beans im Hintergrund zugreifen.
Das Konzept ist also, ich schreibe eigentlich XML
und hinter diesem XML sitzt noch so eine Java-Klasse,
die dann auch gerne Backing Bean genannt wird.
Bean, reden wir hier von Kaffeebohnen,
um in der Java-Sprechweise zu bleiben.
Und diese Bean, die ist dann dafür zuständig,
die Logik in dieser Seite abzubilden.
Das heißt, die füllt zum Beispiel die Daten
für die Textfelder aus der Datenbank
oder die nimmt meine Requests entgegen,
wenn ich Sachen speichern will und so weiter und so fort.
Prüft Logik und so weiter.
Das heißt, ich habe das genau getrennt.
Ich habe im Frontend mein XML quasi,
was mehr oder weniger genauso aussieht wie HTML,
nur vielleicht mal hier und da ein bisschen anders geschrieben
und mal mit einem anderen Attribut und so weiter.
Und dahinter habe ich halt so eine Java-Klasse, die Logik enthält.
Und ich kann dann über eine weitere Spezifikation,
über die EL, die Expression Language,
relativ einfach in meinem XML
auch tatsächlich auf die Attribute
der Java Bean im Hintergrund zugreifen.
Ich könnte also zum Beispiel einfach an so ein Textfeld dranschreiben,
pack hier bitte mal den Inhalt des Attributs Name
aus der Klasse XY rein.
Und das geht dann wirklich in einer Zeile.
Da muss ich jetzt also nicht ganz große Aufrufe machen.
Und ich leite das dann zum Beispiel ein,
indem ich schreibe hash geschweifte Klammer auf
und dann meinetwegen meine Bean Punkt Name geschweifte Klammer zu.
Das ist also wirklich ein ganz simpler, kleiner Ausdruck,
eben in dieser Expression Language.
Das ist also, wie man es auch aus anderen Webframeworks kennt,
zum Beispiel Ruby on Rails.
Da mache ich das auch so,
dass ich quasi meinen variablen Ausdruck
zum Beispiel mit dem Hash einleite.
Und dann kann ich das direkt eins zu eins da ausgeben.
Also mein Frontend sieht eigentlich relativ,
sag ich mal, clean aus.
Ich habe so ein bisschen XML und dazwischen
ein bisschen Expression Language und dann war es das schon.
Ich kann natürlich auch so etwas machen wie Schleifen.
Das geht auch alles im Frontend.
Wenn ich zum Beispiel eine ganze Tabelle ausgeben will
über mehrere, über eine Liste meinetwegen,
dann geht das auch.
Aber ich habe eigentlich keine Logik in meinem Frontend,
sondern wirklich nur die Präsentation.
Und die gesamte Logik dahinter liegt in einer sauberen Java Klasse,
die ich dann natürlich auch testen kann und so weiter.
Das ist im Prinzip das Konzept von JSF.
Was man vielleicht noch erklären können sollte,
ist, was ein Servlet ist.
Das kommt nämlich auch immer wieder hoch,
dieser Begriff.
Ein Servlet, das ist nichts weiter als eine Java-Klasse,
die meine Requests verarbeitet.
Das heißt im Prinzip gerade mal diese Backing Bean,
die ich da gerade genannt habe,
das ist im Prinzip ein Servlet,
denn da geht mein HTTP-Request rein
und die kümmert sich darum,
einen HTTP-Response daraus zu machen
oder schon so ein Servlet.
Und zum Schluss haben wir dann noch
zwei andere kleine Spezifikationen,
die ich gerne noch mal unterbringen würde,
die man auch häufig braucht heutzutage,
und zwar einmal CDI.
Eben schon erwähnt, Contexts and Dependency Injection.
Das ist sehr wichtig,
wenn ich meine Dependencies injizieren möchte,
wie der Name auch schon sagt.
Denn ich möchte, wenn ich so eine komplexe Web-Anwendung habe,
zum Beispiel, wo ich irgendwie
Repositories habe und Services und Backing Beans
und weiß der Geier nicht,
dass ich irgendwie miteinander interagieren muss,
dann wird das ganz schön schwierig,
die alle in der richtigen Reihenfolge zu instanziieren
und dann jeweils einander als Abhängigkeit unterzujubeln.
Und von daher gibt es ein komplettes Framework,
was sich einfach darum kümmert,
diese Abhängigkeiten aufzulösen.
Ich schreibe zum Beispiel einfach in meine Klasse rein,
hey, diese Klasse braucht meinetwegen
einen Datenbank-Repo.
Und dann schreibe ich einfach ein AddInject
zum Beispiel vor das Attribut dieses Repos
und dann wird mir das einfach automatisch injiziert.
Ich muss keinen Constructor dafür anlegen,
ich muss keinen Setter dafür anlegen, gar nichts.
Ich kann ein Private-Attribut anlegen
und schreibe einfach AddInject davor
und der Container, der kümmert sich halt darum,
eine Implementierung für dieses Ding,
was ich da eben haben will, zu suchen,
instanziiert die und injiziert mir die,
ohne dass ich irgendwas dafür tun muss.
Naja, ein bisschen muss ich schon tun,
und zwar das Ding, was injiziert werden soll,
das muss einen parameterlosen Constructor haben.
Das leuchtet, glaube ich, auch ein, sonst kann der Container
natürlich keine Instanz erzeugen.
Wenn es Abhängigkeiten gäbe,
in den Constructor reingeben muss,
meinetwegen eben die Name, ID und weiß der Geier was,
wie soll der Container das natürlich
zu Laufzeit wissen? Das kann er nicht.
Von daher, alle diese Dinge, die hier quasi
durch den Container gemanagt werden,
die müssen alle einen parameterlosen Constructor haben,
sonst kann der Container
sie einfach nicht instanziieren.
Aber wenn das dann der Fall ist, wie gesagt,
dann schreibe ich einfach irgendwo hin,
hey, ich hätte ganz gerne ein Objekt dieser Klasse
und schwupp, kriege ich das halt einfach,
ohne irgendetwas dafür tun zu müssen.
Das finde ich also sehr gut und das erleichtert einem
die Arbeit wirklich enorm. Und ich muss das
auch nicht irgendwie in riesengroßen XML-Dateien
konfigurieren. Wenn ich zum Beispiel ein Interface
habe und ich sage, ich hätte das ganz gerne
injected und es gibt nur eine einzige
Klasse, die dieses Interface implementiert,
dann ist der Container schlau genug, das zu erkennen
und instanziiert mir das. Und wenn
es eine Abhängigkeit gibt, die er nicht
auflösen kann, als Beispiel,
ich habe wieder das Interface, aber ich habe zwei Klassen,
die das Interface implementieren, dann wird der Container
die Anwendung gar nicht starten. Dann wird er mir nämlich sagen,
Moment mal, du hast hier eine Abhängigkeit definiert,
die kann ich nicht auflösen, denn ich kann nicht entscheiden,
welche Instanz du haben willst. Das heißt,
diese Anwendung starte ich gar nicht erst.
Das ist also relativ schön. Ich kriege das Ding
gar nicht hochgefahren, wenn ich
diese Abhängigkeit nicht aufgelöst bekomme.
Also als Entwickler habe ich es ziemlich einfach.
Ich sehe nämlich direkt beim Start der Anwendung, ob ich irgendwas falsch gemacht habe.
Also einfacher geht es fast nicht.
Und zuletzt habe ich noch ein wichtiges
Framework, und zwar JAX-RS
für REST-Services. Komplett ausgesprochen
heißt das Ding die Java API
for RESTful Web Services.
JAX-RS. Und das Ding wird
benötigt, um eben REST-Ressourcen
anbieten zu können. Also eine schöne REST-API,
wie eigentlich jede
Web-Anwendung, die heutzutage was auf sich hält,
es tun sollte. Und das kann man
wirklich sehr, sehr einfach machen. Also es gibt
schon fast keine Ausrede mehr, das mit Java nicht zu tun,
denn das sind wirklich zwei, drei Annotationen,
die ich an meine Klasse packe, und schwuppdiwupp
kann ich das Ding über REST aufrufen.
Also es ist wirklich super einfach.
Und das Ganze komplett typisiert. Ich kann
zum Beispiel, wenn ich eine Methode habe, die mir irgendwie
Autos zurückliefert, kann ich einfach
sowas machen wie public list of
auto, get all
cars, oder, na gut, das wäre jetzt doof,
get autos meinetwegen.
Wenn ich sowas habe, schreibe ich einfach ein
add get davor, und ein
add produces, und dann in
Klammern media type application json.
Und das reicht schon aus,
und ich kann das Ding im Webbrowser aufrufen
unter einem Pfad, und dann kriege ich halt eine
JSON-Repräsentation meines Autos
geliefert. Ohne, dass ich irgendwie
konfigurieren muss, wie die Darstellung
funktioniert, wie die Serialisierung
funktioniert, und so weiter. Das macht das Grimlock komplett
alleine. Und das ist wirklich
super trivial. Ich kann wirklich,
ich habe es mir mal in einem Beispiel angeguckt, mit vier
Annotationen kann ich eine komplette
Klasse als REST-Ressource
freigeben. Das ist wirklich
einfach, und das finde ich richtig cool
gelöst, und das kann man auch sehr gut nachvollziehen.
Und wie ich finde,
ja, für die Praxis top. Ich
habe das sehr gerne eingesetzt, und
habe jetzt zum Beispiel auch für meine
Beispielanwendungen, für meinen Talk auf der
CeBIT dieses Jahr, genau das genutzt,
um ein AngularJS Frontend
über meine Java-EE-Anwendung zu packen.
Weil es wirklich so einfach war. Ich gebe alle
Ressourcen einfach als REST-Ressource
frei. Ich habe automatisch GET, POST, PUT,
was auch immer ich haben will, das kann ich selber spezifizieren.
Und meine Angular-App zieht sich halt die
Daten, kriegt direkt JSON ausgeliefert,
und kann das Ding direkt verarbeiten und im Frontend anzeigen.
Also, einfacher geht es eigentlich nicht.
So, damit wäre ich jetzt mit meiner kleinen LZK zum Thema Java EE durch. Wir
haben jetzt auch, glaube ich, die wichtigsten Sachen abgehakt. Wir haben
den Datenbankzugriff, wir haben Dependency Injection, wir haben das Frontend. Ja, was
will man mehr? Damit kann ich ja schon mal eine lauffähige, ach ja, REST natürlich. Wie
konnte ich das vergessen, ja? Aber damit können wir auf jeden Fall jetzt eine
komplette Web-Anwendung von vorn bis hinten bauen mit Java EE. Von daher
reicht mir das jetzt für heute für meine LZK zu dem Thema. Ich hoffe, es war ein
bisschen was Spannendes für dich dabei. Vielleicht hast du ja noch ein bisschen was Neues
dazugelernt. Dass sowas jetzt in der Abschlussprüfung direkt so abgefragt
wird, halte ich für unwahrscheinlich. Man kann ja nicht von allen Prüflingen
erwarten, dass sie Java können und Java EE auch schon mal gar nicht. Ich kann die
Prüflinge natürlich auch nicht zu Ruby on Rails abfragen, ja? Das ist ja kein
Allgemeinwissen, was wir haben, sondern das ist eine konkrete Programmiersprache. Von daher
wird man höchstens über die allgemeinen Konzepte abgefragt werden, wie zum
Beispiel eben Dependency Injection und so, ja? Allerdings, wenn du ganz konkret ein
Abschlussprojekt umsetzt mit Java oder Java EE, dann darfst du natürlich auch davon
ausgehen, dass man dich dazu fragt. Also wenn ich da Prüflinge sitzen habe, die mit
Java EE gearbeitet haben und mir CDI nicht erklären können, dann haben die ein
Problem. Denn das erwarte ich natürlich, wenn du die Programmiersprache und diese
Plattform benutzt, dass du dich damit auch auskennst und mir fachlich dazu
Rede und Antwort stehen kannst. Also, wenn du tatsächlich vorhast, ein Java EE-Projekt
als Abschlussprojekt zu benutzen, hoffe ich, dass diese Episode für dich
hilfreich war, denn dann waren schon quasi einige Prüfungsfragen dabei, denn
genau so würde ich in einer möglichen Prüfung an die Sache rangehen. Ich würde
erwarten, dass du alles das, was du da benutzt, vom Objektrelationalen Mapper
bis Kontext- und Dependency Injection bis hin zu JSF und so weiter auch erklären
kannst und nicht einfach nur anwenden kannst. In den Shownotes zur heutigen
Episode habe ich noch einen Haufen Links reingepackt zu offiziellen Dokumentationen
und Wikipedia-Artikeln, zu diesem ganzen Kram, den wir heute besprochen haben.
Guck da gerne mal rein. Wenn das dein Projektthema zum Beispiel trifft, dann
kannst du gar nicht genug über diese Technologien wissen. Und davon abgesehen,
das ist nicht nur für die Prüfung relevant, sondern auch für deine tägliche Arbeit.
Wenn du wirklich gut programmieren willst, solltest du auf jeden Fall verstehen,
was du da tust und wie die Sachen zusammenhängen. Also schau gerne mal rein
unter anwendungsentwicklerpodcast.de slash 54, also die Ziffern 5 und 4,
für die heutige 54. Episode. Und wenn du schon im Blog bist, dann schau doch mal auch
im Blog tatsächlich vorbei. Letzte Woche habe ich nämlich einen fantastischen Bookmark oder
meinen Link der Woche veröffentlicht. Einen Fachartikel habe ich leider nicht geschrieben,
weil ich, wie gerade schon erwähnt, auf der CeBIT letzte Woche meinen Vortrag gehalten habe.
Eben nämlich zufällig genau zum Thema Java EE. Und zwar Leichtgewichtige Webentwicklungen mit
Java EE. Passt also haargenau zu dieser Lernzielkontrolle im Prinzip. Aber ich habe
am Freitag einen Link der Woche veröffentlicht. Und zwar, wie funktionieren relationale Datenbanken.
Und das ist also wirklich ein ganz toller Artikel. Der ist mehrere Seiten lang. Nicht nur Seiten,
das ist fast ein halbes Buch quasi. Komplett kostenfrei verfügbar. Und der geht da komplett
ins Detail, wie wirklich eine relationale Datenbank konkret im Hintergrund funktioniert.
Mit Query-Optimization. Und der erklärt Bäume und Listen und Arrays und also alles Mögliche,
was man braucht, um zu verstehen, wie ein Datenbanken funktioniert. Und das fand ich
einfach faszinierend. Also wenn du zum Beispiel täglich mit relationalen Datenbanken arbeitest,
aber gar nicht so genau weißt, wie die eigentlich intern funktionieren,
unbedingt eine Leseempfehlung. Schau dir das mal an. Also einen besseren Artikel,
der auch noch kostenfrei ist vor allem. Zu diesem Thema habe ich persönlich noch nicht gefunden.
Ansonsten würde ich mich wie immer freuen, wenn du mich weiterempfiehlst, wenn es dir gefallen hat.
Wenn es dir nicht gefallen hat, gib mir gerne ein Feedback. Schreib mir eine Mail an
mail.anwöchensentwicklerpodcast.de oder gib mir ein Feedback direkt unter der Episode oder über
eines der zahlreichen sozialen Netzwerke. Du kannst mich eigentlich überall finden,
wenn du nach meinem Namen suchst. Und ganz besonders würde ich mich freuen,
wenn du dich in mein Newsletter einträgst. Unter anwöchensentwicklerpodcast.de
slash Newsletter kannst du das tun. Dann kriegst du immer jede Woche einmal ein Update,
was es aktuell an Neuigkeiten so gibt. Und vor allem auch Zugriff auf die Checklisten
rund ums Abschlussprojekt, den Projektantrag, die Projektpräsentation und so weiter und so fort.
Also wenn du magst, trage dich doch ein. Kostet auch nichts und du hast auch nichts zu verlieren.
Wenn dir die Inhalte nicht gefallen, trage dich einfach wieder aus. Bzw. ich bin dir nicht böse
drum. Nächste Woche werde ich dann mal wieder das Thema Abschlussprojekt aufgreifen. Und zwar
habe ich jetzt schon ein paar Anfragen bekommen, ob ich nicht mal eine Episode machen kann,
wie man denn mit der Projektarbeit quasi anfängt. Wie steigt man ein ins Abschlussprojekt? Fängt
ja eigentlich schon mit dem Projektantrag an. Aber wenn es dann wirklich ans Tun geht,
Projektantrag ist genehmigt und jetzt geht es los. Wie findet man denn einen Einstieg? Ich
denke, da habe ich ein bisschen Tipps zusammengetragen, die ich nächste Woche mal
vorstelle. Und vielleicht hilft es dir ja auch. Vielleicht bist du ja gerade in der
Vorbereitungsphase oder sogar schon in der Umsetzungsphase. Ich nehme das ja hier schon
im März 2016 auf. Das ist ja schon fast die heiße Phase für die Sommerprüfung. Von daher hoffe ich,
dass du da wieder ein bisschen was rausziehen kannst. Wenn du noch konkrete Fragen zum Thema
hast, schicke mir einfach eine Mail. Noch kriege ich da sicherlich was untergebracht. Ansonsten
sage ich für heute erstmal vielen, vielen Dank fürs Zuhören und dann bis zum nächsten Mal. Tschüss.










Neueste Kommentare