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

Framework.svg
  • 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

Empfehlung zum HTML / CSS Lernen

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

  1. 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:

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.

  1. sudo a2enmod cgi
  2. Config-Datei übernehmen
  3. Webserver neu starten: sudo service apache2 restart
  4. "zeit.sh" im Webroot ablegen
  5. "zeit.sh" ausführbar machen (Notfalls Copilot fragen ;-)
  6. Im Browser http://IPADRESSE/zeit.sh

    • → soll die Uhrzeit liefern
  7. 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 durch index.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 im target/-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:

  1. keine get-Parameter (dazu muss die URL-Zeile des Browsers editiert werden) → kein Grußtext
  2. leere get-Parameter (z.B. "Absenden" mit leeren Feldern) → kein Grußtext
  3. 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:

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]

[...]

https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

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