Vertiefung Programmierung - Architektur, Schnittstellen, Frameworks
Begriffe
(Software-)Schnittstelle / Interface
Allgemein irgendein Verfahren, über das Softwarekomponenten miteinander Informationen austauschen.
Vorsicht: In Java gibt es eine bestimmte Art von Klasse, die als Interface bezeichnet wird (siehe unten).
Framework
vgl. Softwarebibliothek ... aber nicht das gleiche
Bibliothen (Library)
- macht gewisse Vorgaben bei der Benutzung (z.B. kompatible Datentypen)
- als einzelne Programmkomponente relativ austauschbar
- übernimmt einzelne Aufgaben
- ein Programm nutzt idR. mehrere Bibliotheken für verschiedene Aufgaben
Framework
- macht strenge Vorgaben für den Aufbau des Programms
- idr. nutzt das Programm höchstens ein Framework
- durch die Anpassung des Programms an das Framework ist das Framework schwer austauschbar
Aber! Der Übergang ist fließend. Es gibt mehr und weniger aufdringliche Frameworks.
Interfaces in Java
- Verhält sich ein Bisschen wie eine abstrakte Klasse (wird nicht Klasse genannt!)
- Kann nicht als eigenes Objekt angelegt werden
- Enthält Definitionen von Methoden, aber nicht die Methoden selbst
Eine neue Klasse kann ein Interface implementieren (man sagt nicht erben/extenden!)
- Die implementierende Klasse ist dann gezwungen die vordefinierten Methoden anzulegen
- Vorteil gegenüber der abstrakten Klasse: Eine neue Klasse kann mehrere Interfaces implementieren (Vorteil gegenüber Vererbung in Java)
- Nachteil gegenüber der Abstrakten Klasse: Methoden dürfen im Interface selbst nicht implementiert sein! (Die abstrakte Klasse erlaubt dagegen abstrakte und nicht-abstrakte Methoden)
Einige Methoden aus der Java-Standard-Bibliothek (Java-API) benötigen Argumente, die ein bestimmtes Interface implementieren
- → dadurch erhält die Methode, die Garantie, in dem übergebenen Objekt bestimmte Methoden aufrufen zu können (nämlich die Methoden, die das Interface vorschreibt)
https://docs.oracle.com/en/java/javase/17/docs/api/allclasses-index.html
IHK-Prüfungsrelevant eigentlich nur bei Klassendiagrammen: https://de.wikipedia.org/wiki/Klassendiagramm
Beispiel für die Praxis: ObejctWriter und das Serializable-Interface
Empfehlung zum Java lernen
- W3-Schools, Englischsprachig: https://www.w3schools.com/java/java_intro.asp
- Deutschsprachig von der Uni Ulm: https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.proghilfe/skript.pdf
Empfehlung zum HTML / CSS Lernen
- Deutschsprachig: https://wiki.selfhtml.org/wiki/SELFHTML
- Englischsprachig: https://www.w3schools.com/
Was für Programmierkurse hattet ihr bisher?
Java Grundlagen
Klassen / Vererbung
Datentypen
Kontrollstrukturen
var-args
Interfaces
Java / Jakarta
Javascript
- JSON
Python
HTML/CSS
Apache LAMP / XAMP - (Linux) Apache MariaDB PHP
- Unter Windows
WSL installieren
Window-Features aktivieren / deaktivieren
- Hyper-V
- Windows-Subsystem für Linux
Windows CMD:
> wsl --install -d debian
...
> wsd --set-default debian
> wsl
~$
Ab jetzt können wir in der Windows-Eingabeaufforderung immer wsl
eingeben und landen damit in einer Linux Bash!
Mit exit
fallen wir wieder zurück in die Windows-Shell.
Außerdem finden wir im Windows-Explorer jetzt einen Eintrag um auf die Linux-Installationen zuzugreifen.
Aufgabe:
Legt eine Datei "hallo.html" an, in der einfach ein HTML Grundgerüst enthalten ist.
- Die Datei soll in "/var/www/html/" neben der bestehenden "index.html" liegen.
- Da der einfache user dort keine Schreibrechte hat, müsst ihr via
sudo nano ...
an der neuen Datei arbeiten.
Materialien:
- Handreichung HTML.pdf
- hallo.html
- hallo.js
- Apache Config-Datei: /etc/apache2/sites-available/000-default.conf
- zeit.sh
Aufgabe
Oben im Absatz stehen die Datei "zeit.sh" und die korrekte Config-Datei für den Apache Webserver.
Bringt den Webserver in einen Zustand, in dem die Uhrzeit im Browser abgerufen werden kann.
sudo a2enmod cgi
- Config-Datei übernehmen
- Webserver neu starten:
sudo service apache2 restart
- "zeit.sh" im Webroot ablegen
- "zeit.sh" ausführbar machen (Notfalls Copilot fragen ;-)
Im Browser http://IPADRESSE/zeit.sh
- → soll die Uhrzeit liefern
- Screenshot im Privatchat an mich posten
Schnittstelle: CGI (Common Gateway Interface)
- Applikation ist ein eigenständiges Programm
- wird vom Server ausgeführt, wenn die entsprechende URL aufgerufen wird
- lesen Serverinformationen aus Umgebubungsvariablen
- erhalten POST-Informationen auf
STDIN
- Schreiben eine Seite nach
STDOUT
- hallo.sh
Schnittstelle: Java Servlet
- Applikation ist eine Java-Klasse (muss aus
HTTPServlet
erben) - Webserver ruft eine Methode der Klasse auf
- Serverinformationen werden als Java-Objekt übergeben
- Antwort wird in ein anderes Java-Objekt geschrieben
Einrichtung Tomcat-Webserver
- Der Tomcat Webserver kann Java-Servlets ausführen
~# apt-get install tomcat10 tomcat10-examples tomcat10-docs tomcat10-admin
- In aktuellen distributionen stehen auch neuere Tomcat-Versionen zur Verfügung
- ggf.
~# service tomcat10 start
Test: Im Browser aufrufen
http://IPADRESSE:8080
- → Zeigt die "It Works!"-Seite des Tomcat
Die verlinkte "Manager webapp" Benötigt ein Passwort
Datei
/etc/tomcat10/tomcat-users.xml
anpassen- Dort ist der größte Teil auskommentiert
- Beispielzeilen für gültige User stehen dort bereit
Dokumentation zu Servlets allgemein
https://tomcat.apache.org/tomcat-11.0-doc/appdev/index.html https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html
Servlet erstellen in IntelliJ
- IntelliJ Ultimate
- Neues Projekt erstellen
- Wichtig: Template für
Web Application
In Tomcat10: jdk-Version nicht über 17, u. Jakarta EE Version nicht über 10
- Alternativ: aktuellen Tomcat benutzen
Quellcode-Dateien im Projekt sind:
webapp/index.jsp
... kann auch durchindex.html
ersetzt werden- zusätzlich können hier weitere statische Dateien abgelegt (z.B.
.css
,.js
) src/main/java/.../*.java
→ Servlet Klassen mit dynamischem Code
Im Maven-Menü eine
.war
-Datei erstellen.war
-Archiv erscheint imtarget/
-Verzeichnis des Projekts- ggf. auch explizit einen Rebuild des Projekts auslösen
.war
-Datei kann im Manager-UI von Tomcat deployed werden- vorherige Versionen vorher explizit undeployen
Aufgabe:
Werden in der Greeter-Applikation leere Felder absgesendet, so erscheint trotzdem ein "Sei Gegrüßt"-Text. Unter Umständen steht sogar "null" als Name dort.
Passt das Servlet so an, dass der Grußtext nur angezeigt wird, wenn wenigstens eines der beiden Felder ausgefüllt ist.
Schickt mir den Code dafür per Privatnachricht in Teams.
Testfälle:
- keine get-Parameter (dazu muss die URL-Zeile des Browsers editiert werden) → kein Grußtext
- leere get-Parameter (z.B. "Absenden" mit leeren Feldern) → kein Grußtext
- Vor- und Nachname ausgefüllt → "Sei gegrüßt ... ..."
Zusatz: achtet darauf, das HTML-Gerüst nur einmal im Programm zu haben. Zusatz: setzt das gleiche in hallo.sh um (vom Dienstag, erreichbar via Apache: http://IPADRESSE/hallo.sh)
- schickt mir den Code ;-)
- Dies kann auch als erster Schritt hilfreich sein, wenn euch der Java-Code noch zu kompliziert ist
Lösung:
- hallo2.sh
- HelloServlet2.class ... Achtung! Die muss nach dem Download umbenannt werden, damit sie mit dem Klassennamen übereinstimmt!
Reverse Proxy / Frontend Webserver
Verschiedene Webapplicationen laufen in verschiedenen Servern (Apache, Tomcat, php-fpm, Python-WSGI, Standalone).
Vorteil: verschieden Services können durch Benutzerkonten, Conteiner, etc. getrennt werden
Nachteil: Netzwerkkonfiguration werden in jedem Dienst auf andere Weise gesetzt. Jeder Service läuft auf einem eigenen Port, usw...
Lösung für das Problem
- die eigentlichen Dienste werden gefirewalled (bzw. laufen nur auf localhost oder Unix-Socket).
- Der einzige Dienst, der Online sichtbar ist, ist ein Reverse Proxy.
Beispiel Apache
~# a2enmod rewrite proxy proxy_http
- Config File:
[...]
RewriteEngine on
# leitet alle URI, die mit /greeter beginnen *genau* auf die greeter-App in Tomcat weiter
RewriteRule ^/greeter http://localhost:8080/WebApp-1.0-SNAPSHOT/greeter [P]
# Würde *genau* die URI /docs/ auf die /docs/ seite von Tomcat weiterleiten, aber *nicht* die Unterseiten
# RewriteRule ^/docs/$ http://localhost:8080/docs/ [P]
# Richtig: URI /docs/ und alle unterseiten werden an Tomcat und Unterseiten weitergeleitet
RewriteRule ^/docs/(.*) http://localhost:8080/docs/$1 [P]
[...]
Aufgabe
Schreibe ein Java-Programm, eine einzelne Klasse, die das amerikanische Sauflied "99 Bottles of Beer" ausgibt. Das Lied beginnt mit der Strophe:
99 bottles of beer on the wall 99 bottles of beer Take one down, pass it around 98 bottles of beer on the wall.
Die letzte Strophe lautet
1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around 0 bottles of beer on the wall.
Go to the Store, buy some more!
Optimiere schrittweise:
- a. das Programm soll erst einmal irgendwie laufen
- b. Programmgröße < 1kB
- c. beachtet das Singular ("bottle", nicht bottles) in der letzten Strophe
- d. Programmgröße < 512B
Schickt mir den Quellcode per Privatchat.
Lösung: Bottles.java
Aufgabe:
Baut eine HTML Seite mit dem Titel "William Howard Taft", und einem Bild von eben diesem! (siehe auch The Website Obesity Crisis)
- a. Die HTML-Seite zeigt nur das Bild an.
- b. Der Seiteninhalt soll horizontal zentriert sein
- c. Der Seiteninhalt soll auch vertikal zentriert sein.
Schickt mir den HTML-Code und einen Screenshot.
Lösung: Taft.html