- Einstieg: Spring Boot als Java-DI-Framework vorstellen
- Nicht auf dem Titel verweilen
- Motivation: begruenden, warum serverseitige Themen jetzt Vorrang haben und an INF1/INF2 anschliessen
- Rahmenbedingung: Teamprojekt braucht skalierbares Backend, Architekturentscheidungen (Monolith vs. Services) vorwegnehmen
- Technologien einzeln aufgreifen: HTML, CSS, JS, TS, DI (Dependency Injection), REST; wir bauen darauf auf
- DI-Konzepte aus der DI-Vorlesung werden explizit auf Spring Boot uebertragen
- Erinnern: Java aus INF1/INF2 bekannt, Spring Boot nutzt diese Kenntnisse direkt
- Starter wie spring-boot-starter-web als Beispiel fuer Konvention-vor-Konfiguration; Community-Ressourcen (Spring Guides, Baeldung) nennen
- Historie: Spring als Reaktion auf schwergewichtiges J2EE (Java 2 Platform, Enterprise Edition)
- Uebergang zu Spring Boot als leichter Einstieg, der den Modulkatalog buendelt
- Alternativen knapp einordnen: Jakarta EE (Enterprise-Plattform), Micronaut/Quarkus (Cloud/Serverless), Play (reaktiv), Vaadin (UI-first)
- Empfehlung: bei Greenfield-Projekten Messwerte (Startup-Zeit, Speicher) aufnehmen, um Entscheidungen zu objektivieren
- Begriffe glossieren: IoC (Inversion of Control), SpEL (Spring Expression Language), JDBC (Java Database Connectivity), JPA (Jakarta Persistence API), AOP (Aspect-Oriented Programming)
- Beispiel: spring-boot-starter-data-jpa plus spring-boot-starter-web zeigen, wie Boot Module per Starter zusammenstellt
- Schichtenmodell erklaeren: Web (Controller + Views/REST), Service (Business-Logik, Transaktionen), Data (Repositories, Persistenz)
- Beispiel-Flow: HTTP-Request → Controller validiert → Service fuehrt Geschaeftsregel aus → Repository spricht DB an
- Fragen, wer bereits mit DI in Spring, Angular oder anderen Frameworks gearbeitet hat
- Ankuendigen: vom Konzept (Inversion of Control) zu Spring-Annotationen wie @Component oder @Service
- IoC: Objekte bekommen Abhaengigkeiten vom Container geliefert, statt sie selbst zu erzeugen
- Beispiel: MailService erhaelt echten SMTP-Client oder Fake-Adapter; @Primary/@Profile stellen beim Testen alternative Beans bereit
- Constructor Injection erzwingt vollstaendige Abhaengigkeiten (gut fuer Immutability), Setter fuer optionale/spaete Bindungen
- Beispiel: Feature-Flag-Service via Setter; im Alltag Constructor Injection, ggf. mit Lombok @RequiredArgsConstructor
- Annotationen registrieren Beans; Container instanziiert, verwaltet Scope (z.B. Singleton), ruft Lifecycle-Hooks
- Beispiel: CommandLineRunner zeigt beim Start, wann Beans entstehen; @PreDestroy schliesst Ressourcen wie DB-Verbindungen
- @Service kennzeichnet die Bean, Constructor Injection sorgt fuer ein final Repository, greet ruft repo.findTemplate().formatted(name) auf
- GreetingRepository kann ein Spring-Data-Repository sein; Umgang mit fehlenden Templates diskutieren (Optional, Exception, Fallback)
- Kandidaten: PaymentProvider, MailAdapter, StorageService
- Loesungsidee: erst Contracts schreiben, dann Implementierungen ueber @Profile("dev")/@Profile("prod") bzw. Mocks austauschen
- Zeigen, welche Werkzeuge noetig sind, um in Minuten ein Spring-Boot-Projekt aufzusetzen; GUI (Spring Initializr) vs. CLI
- Vom Setup direkt in IDE/Editor springen, Toolchain live demonstrieren
- Tools erlaeutern: Java 21 (LTS), Git, Maven/Gradle, IntelliJ oder VS Code plus Spring Boot DevTools (Hot Reload)
- Konkretes Setup: VS Code mit Spring Extension Pack, gemeinsames JDK im Team fuer reproduzierbare Builds
- Schritt fuer Schritt: start.spring.io oeffnen, Group/Artifact ausfuellen, Starter waehlen, ZIP laden, ins Repo legen
- Tipp: Maven/Gradle Wrapper (mvnw, gradlew) einchecken, damit alle dieselbe Build-Version nutzen
- Erwartung: spring-boot-starter-thymeleaf fuer Templates, H2 (in-memory) oder PostgreSQL fuer Prototyp
- Loesungsidee: application-dev.yml mit H2 + DevTools, application-prod.yml mit PostgreSQL + Flyway, aktiviert via spring.config.activate.on-profile
- MVC steht fuer Model-View-Controller; typischen HTTP-Lifecycle kurz beschreiben
- Vorwissen aktivieren: Wer hat @Controller, @RestController, @GetMapping schon genutzt?
- Model haelt View-Attribute; Rueckgabename muss zur Template-Datei passen (greeting → templates/greeting.html)
- Fuer REST-Endpunkte ResponseEntity erwaehnen (Statuscodes, Header exakt steuern)
- Flow: Browser → DispatcherServlet → Handler Mapping → Controller (ModelAndView) → View Resolver → View rendern → Response
- Beispiel: GET /teams landet im Controller, ruft TeamService/TeamRepository, Thymeleaf rendert die View
- Annotationen an Beispielen erlaeutern: @RequestParam mit defaultValue, @PathVariable fuer URL-Segmente, @RequestBody fuer JSON/Form-Data
- Zusatz: bei Formularen DTO + @Valid + BindingResult fuer saubere Validierungsfehler
- @Controller markiert die MVC-Komponente, @GetMapping("/greeting") mappt GET, @RequestParam liest Query-Parameter, Model fuellt die View
- Alternative: @RestController/@ResponseBody liefert JSON; Demo-URL http://localhost:8080/greeting?name=Sam
- SSR (Server-Side Rendering) vs. REST erklaeren; @ResponseBody/@RestController machen aus MVC-Controllern APIs
- Praxisfall: Admin-Interface per SSR, Mobile-App ueber REST; bei hybriden Szenarien CORS konfigurieren
- Erwartung: GET /team-board (Board zeigen), POST /tasks (Task anlegen) mit Titel, Beschreibung, Verantwortlichem
- Bonusloesung: Validierungsfehler via BindingResult + Rueckkehr zur View, in REST-Szenarien HTTP 400 mit Fehlerobjekt
- Loesungsfolie zur Routing-Uebung: GET zeigt Board, POST legt Task an
- @Valid + BindingResult fuer Validierung, RedirectAttributes fuer Flash-Message nach Redirect
- Thymeleaf: serverseitige Java-Template-Engine, vergleichbar mit Handlebars oder JSX, voll im Spring Stack integriert
- Vorteil: SSR ist SEO-freundlich und passt zu klassischen Formular-Workflows
- xmlns:th bindet Thymeleaf, th:text setzt den Textknoten mit Expression und escaped HTML automatisch
- Demo: name-Attribut im Model setzen, DevTools-Reload zeigen; th:utext liefert unescaped HTML
- ${...} greift verschachtelte Properties ab, th:object setzt Kontext, *{...} referenziert das aktuelle Objekt
- th:with fuer Hilfsvariablen (z.B. count=${members.size()}); SpEL kann Methoden aufrufen
- th:fragment="main" definiert wiederverwendbares Fragment, th:insert fuegt es ein; ~{::body} referenziert den Body des aktuellen Templates
- Variablen via th:with an Fragmente uebergeben; Layout-Dialekt erlaubt komplexere Masterpages
- th:text ersetzt Textinhalt, th:utext laesst HTML zu, th:each iteriert, th:if/th:unless steuern Sichtbarkeit
- Formular-Beispiel: <form th:object="${task}"> mit th:field="*{title}" und th:errors fuer Fehlermeldungen
- Aufgabe: members iterieren, <ul> bauen, Name + Rolle ausgeben, optional Profil verlinken
- Loesung folgt auf der naechsten Folie
- Loesungsfolie zur Team-Liste: th:each iteriert, th:text rendert Name/Rolle sicher (kein HTML-Injection)
- Link zeigt, wie Parameter mit @{} gesetzt werden; fuer reine Textausgabe kann der a-Block entfallen
- ORM = Object-Relational Mapping; Anekdote: Legacy-JDBC-Projekt motivierte die Einfuehrung eines ORM
- Ziel: Domainlogik von Persistenzdetails trennen (Wartbarkeit, Testbarkeit)
- Impedance Mismatch: relationale Tabellen vs. objektorientierte Konzepte (Vererbung, Assoziationen)
- Strategien erlaeutern und Beispiel skizzieren (PaymentMethod-Hierarchie → Single Table)
- Reines JDBC (Java Database Connectivity) erfordert viel Boilerplate und manuelles Mapping
- Risiken: fehlende finally-Bloecke → Connection-Leaks, Copy-Paste-SQL schwer wartbar, Tests brauchen viel Setup
- Hart codierte SQL-Strings, manuelles Mapping, hoher Aufwand bei Schemaaenderungen
- Loesungshinweis: wenn kein ORM moeglich, wenigstens RowMapper-Utilities oder DAOs bauen
- DAO (Data Access Object): kapselt DB-Zugriffe, stellt CRUD-Methoden bereit, kennt Connections/Queries/Transaktionen
- Beispiel: AccountDao-Interface mit create, find, delete; Tests mit H2 (In-Memory) oder Mocks
- JdbcConnectionSource verbindet zur H2-In-Memory-DB, DaoManager.createDao erzeugt das DAO, create persistiert
- Vergleich zu Spring Data (Container verwaltet DataSource); connectionSource mit try-with-resources schliessen
- Repository: Sammlung von Domain-Objekten mit fachlichen Methodennamen; DAO ist technisch (SQL-orientiert)
- Spring Data generiert Standardmethoden; Services koennen Domain-Events ausloesen
- Erwartung: Services fuer Business-Logik/Transaktionen, Repository fuer Datenzugriff
- Testvorschlag: Service-Tests mit Mock-Repositories (Mockito) plus Integrationstests mit H2/PostgreSQL
- JPA = Jakarta Persistence API, Spring Data baut darauf auf; Ziel: CRUD-Repositories erstellen und Queries anpassen
- Kontext: H2 (In-Memory) in dev, PostgreSQL in prod; JPA abstrahiert die Unterschiede
- @Entity mappt die Klasse auf eine Tabelle, @Id @GeneratedValue markiert den Primaerschluessel, @OneToMany(mappedBy = "customer") beschreibt die Beziehung
- @Table ueberschreibt Tabellennamen; equals/hashCode sorgfaeltig umsetzen
- JpaRepository erbt CRUD, Paging und Sorting; PagingAndSortingRepository/CrudRepository sind schlankere Alternativen
- Spring Data generiert Implementierungen zur Laufzeit per Proxy, es braucht nur Interfaces
- Kernvertrag: save, findById, findAll, deleteById, count
- Tipp: fuer Tests laesst sich eine In-Memory-Implementierung via Map<ID,T> erstellen
- Spring Data parst Methodennamen und generiert SQL/HQL daraus; Operatoren And, Or, Between, Like, IgnoreCase
- Beispiel findByEmailIgnoreCaseAndStatus; bei komplexen Namen ist @Query besser lesbar
- @NamedQueries definiert JPQL-Statements auf der Entitaet, entityManager.createNamedQuery ruft sie per Name auf
- Spring Data nutzt Named Queries automatisch bei gleichem Methodennamen (RecipeRepository.findAllRecipes())
- Spring Security mit Session-Management kombinieren; Minimal-Setup fuer Teamprojekte zeigen
- Vorwissen abfragen: Wer hat schon mit Spring Security oder JWT (JSON Web Tokens) gearbeitet?
- FilterChainProxy enthaelt Filter wie AuthenticationFilter, AuthorizationFilter, CsrfFilter; sie laufen sequenziell
- Diagramm: DelegatingFilterProxy → FilterChainProxy waehlt die passende SecurityFilterChain (z.B. /api/** vs /**), danach geht es weiter zum Servlet
- CSRF (Cross-Site Request Forgery) ist standardmaessig aktiv; Angriffsbeispiel: https://bank.example/transfer?to=hacker&amount=1000
- Best Practices: Session bei Login/Logout invalidieren, Tokens rotieren, Secure + HttpOnly Flags setzen
- @EnableWebSecurity aktiviert Spring Security; requestMatchers("/css/**") → permitAll, anyRequest().authenticated()
- formLogin() aktiviert die Standard-Login-Seite, logout() den /logout-Endpunkt; fuer REST-APIs ggf. csrf deaktivieren
- Annotationen sichern Service-Methoden ab, wenn URL-Regeln nicht reichen
- Beispiel: @PreAuthorize("#userId == authentication.principal.id"); DTOs auf erlaubte Felder pruefen
- Erwartung: offene Endpunkte (/public/**), Rollen (z.B. ROLE_ADMIN fuer /admin/**), /api/** via Session oder JWT
- Empfehlung: Ergebnisse als Security-Kapitel im Teamprojekt dokumentieren
- Leere Abschlussfolie wie im Original (pptx-Folie 62, Titel-Layout ohne Inhalt)
- Raum fuer Fragen und Abschlussdiskussion