diff --git a/web/09/09_aufgaben.md b/web/09/09_aufgaben.md index 2c07ac6..44d70fe 100644 --- a/web/09/09_aufgaben.md +++ b/web/09/09_aufgaben.md @@ -16,7 +16,7 @@ Siehe [Hinweise zu Aufgaben 2 und 3](#Hinweise-zu-Aufgaben-1-und-2) weiter unten ## 2. Go-Übung: Datenbank UPDATE -**Aufgabenstellung**: Erweitern Sie das Programm aus Aufgabe 4 um einen neuen Endpunkt `/update`, der einen vorhandenen Datensatz in der Datenbank aktualisiert. +**Aufgabenstellung**: Erweitern Sie das Programm aus Aufgabe 1 um einen neuen Endpunkt `/update`, der einen vorhandenen Datensatz in der Datenbank aktualisiert. #### Hinweis Siehe [Hinweise zu Aufgaben 1 und 2](#Hinweise-zu-Aufgaben-1-und-2) weiter unten. diff --git a/web/09/demos/go/hobbies/01_save_db.go b/web/09/demos/go/hobbies/01_save_db.go new file mode 100644 index 0000000..73fd09d --- /dev/null +++ b/web/09/demos/go/hobbies/01_save_db.go @@ -0,0 +1,86 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "net/http" + + _ "github.com/lib/pq" +) + +type formExampleDBHandler int + +func (formHandler formExampleDBHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + + //Datenbank-Verbindung herstellen + + // Verbindungszeichenfolge: Benutzername, Passwort, DB-Name, Host, Port + connStr := "user=devuser password=devpass dbname=devdb host=localhost port=5432 sslmode=disable" + + // Verbindung zur Datenbank öffnen + db, err := sql.Open("postgres", connStr) + if err != nil { + log.Println("Fehler beim Öffnen der Verbindung:", err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + defer db.Close() + + // Verbindung testen + err = db.Ping() + if err != nil { + log.Println("Datenbank nicht erreichbar:", err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + log.Println("Verbindung erfolgreich hergestellt.") + + // INSERT-Anweisung vorbereiten + query := `INSERT INTO personen (name, hobbies) VALUES ($1, $2)` + // INSERT-Anweisung ausführen + _, err = db.Exec(query, "Louise", "Lesen, Wandern") + if err != nil { + log.Println("Fehler beim Einfügen:", err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + log.Println("Datensatz erfolgreich eingefügt.") + + // SELECT-Abfrage vorbereiten + rows, err := db.Query(`SELECT name, hobbies FROM personen`) + if err != nil { + log.Println("Fehler bei der Abfrage:", err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + defer rows.Close() + + // Ergebnisse durchlaufen + for rows.Next() { + var name string + var hobbies string + + err := rows.Scan(&name, &hobbies) + if err != nil { + log.Println("Fehler beim Auslesen:", err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + + fmt.Printf("Name: %s, Hobbies: %s\n", name, hobbies) + } + + // Fehler beim Iterieren prüfen + if err = rows.Err(); err != nil { + log.Println(err) + http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError) + return + } + +} + +func main() { + var r formExampleDBHandler + log.Fatal(http.ListenAndServe("localhost:8080", r)) +} diff --git a/web/09/demos/go/hobbies/go.mod b/web/09/demos/go/hobbies/go.mod new file mode 100644 index 0000000..859355f --- /dev/null +++ b/web/09/demos/go/hobbies/go.mod @@ -0,0 +1,5 @@ +module hobbies + +go 1.24.5 + +require github.com/lib/pq v1.10.9 diff --git a/web/09/demos/go/hobbies/go.sum b/web/09/demos/go/hobbies/go.sum new file mode 100644 index 0000000..aeddeae --- /dev/null +++ b/web/09/demos/go/hobbies/go.sum @@ -0,0 +1,2 @@ +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/web/09/demos/js/02_hello.html b/web/09/demos/js/02_hello.html new file mode 100644 index 0000000..b2de9af --- /dev/null +++ b/web/09/demos/js/02_hello.html @@ -0,0 +1,18 @@ + + + + + + + Hello World + + + +

Grüße an alle

+

TH Mannheim

+ +

Welt

+ + + + \ No newline at end of file diff --git a/web/09/demos/js/02_hello.js b/web/09/demos/js/02_hello.js new file mode 100644 index 0000000..4fde3b0 --- /dev/null +++ b/web/09/demos/js/02_hello.js @@ -0,0 +1 @@ +alert("Hallo Studierende!"); \ No newline at end of file diff --git a/web/09/demos/js/03_basics.js b/web/09/demos/js/03_basics.js new file mode 100644 index 0000000..c324e65 --- /dev/null +++ b/web/09/demos/js/03_basics.js @@ -0,0 +1,105 @@ +// DATENTYPEN +let zahl = 42; +let text = "Hallo Welt"; +let wahr = true; +let undefiniert; +let leer = null; +let symbol = Symbol("id"); // erzeugt einzigartigen Wert +let gross = 123n; // bigint: für sehr große Ganzzahlen + +// UNTERSCHIED ZWISCHEN null UND undefined +console.log(typeof undefiniert); // "undefined" +console.log(typeof leer); // "object" +console.log(undefiniert == null); // true → lose Gleichheit, beide gelten als "leer" +console.log(undefiniert === null); // false → strikte Gleichheit, Typen sind verschieden + +// OBJEKTE MIT METHODEN + +// Beispiel: const mit Objekt +const person = { name: "Moritz" }; +person.name = "Max"; +// person = {} //nicht erlaubt, weil const + +// Beispiel: Objekt mit Methode +let benutzer = { + name: "Galinda", + alter: 25, + begruessen: function() { + console.log("Hallo, ich bin " + this.name); + } +}; +benutzer.begruessen(); // Methode aufrufen +console.log(benutzer["alter"]); // Zugriff via Schlüssel + +// KONTROLLFLUSS +if (zahl > 40) { + console.log("Zahl ist größer als 40"); +} else if (zahl === 40) { + console.log("Zahl ist genau 40"); +} else { + console.log("Zahl ist kleiner als 40"); +} + +switch (text) { + case "Hallo Welt": + console.log("Begrüßung erkannt"); + break; + case "Hi": + console.log("Kurzform erkannt"); + break; + default: + console.log("Unbekannter Text"); +} + +switch (42) { + case "42": // kein Match, da Typ unterschiedlich -> Vergleich basiert auf strikter Gleichheit (===) + console.log("String"); + break; + case 42: + console.log("Number"); + break; +} + +for (let i = 0; i < 3; i++) { + console.log("Zähler:", i); +} + +// ARRAYS +let obst = ["Apfel", "Banane", "Kirsche"]; +obst.push("Mango"); +console.log(obst[1]); +obst.forEach(function(f) { + console.log("Frucht:", f); +}); +const zahlen = [1, 2, 3]; +// map erzeugt ein neues Array +const verdoppelt = zahlen.map(n => n * 2); +console.log(verdoppelt); // [2, 4, 6] + +// SPREAD-OPERATOR +const extendedZahlen = [...zahlen, 4]; +console.log(extendedZahlen); + +const extendedBenutzer = {...benutzer, beiname: "die Gute"} +console.log(extendedBenutzer["name"] + " " + extendedBenutzer["beiname"]) + +// ERROR HANDLING +// try-catch-finally funktioniert ähnlich wie in Java +try { + // Fehler absichtlich auslösen + throw new Error("Etwas ist schiefgelaufen"); +} catch (e) { + console.error("Fehler:", e.message); // Fehlerbehandlung +} finally { + console.log("Cleanup abgeschlossen"); // wird immer ausgeführt +} + +// JSON +// Objekt → JSON-String +const obj = { name: "Margaret", alter: 13 }; +const jsonStr = JSON.stringify(obj); +console.log(jsonStr); + +// JSON-String → Objekt +const parsed = JSON.parse(jsonStr); +console.log(parsed.alter); \ No newline at end of file diff --git a/web/09/demos/js/04_functions.js b/web/09/demos/js/04_functions.js new file mode 100644 index 0000000..afed174 --- /dev/null +++ b/web/09/demos/js/04_functions.js @@ -0,0 +1,53 @@ +// Normale Funktionsdeklaration +function add(a, b) { + return a + b; +} +console.log("Normale Funktion:", add(2, 3)); + + +// Anonyme Funktion +const multiply = function(x, y) { + return x * y; +}; +console.log("Anonyme Funktion:", multiply(4, 5)); + + +// Arrow Function +const subtract = (a, b) => a - b; +console.log("Arrow Function:", subtract(10, 3)); + +const square = x => x * x; +console.log("Quadrat:", square(6)); + +const greet = (name) => { + return "Hallo " + name; +}; +console.log(greet("Hans")); + + +// Funktionen als Parameter (Callbacks) +function doMath(a, b, operation) { + return operation(a, b); +} + +// Übergabe einer anonymen Funktion +console.log("Callback anonym:", doMath(3, 4, function(x, y) { + return x + y; +})); + +// Übergabe einer Arrow Function +console.log("Callback arrow:", doMath(3, 4, (x, y) => x * y)); + + +// Higher-Order Functions mit Arrays (map) +let zahlen = [1, 2, 3, 4, 5]; + +// Mit anonymer Funktion +let verdoppelt = zahlen.map(function(n) { + return n * 2; +}); +console.log("Verdoppelt (anonym):", verdoppelt); + +// Mit Arrow Function +let verdoppeltArrow = zahlen.map(n => n * 2); +console.log("Verdoppelt (arrow):", verdoppeltArrow); \ No newline at end of file