Skip to main content
Dat 2. semester
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Thymeleaf workshop

I dag skal vi udforske, hvad vi kan bruge Thymeleaf til.

I går brugte vi blandt andet:

  • th:text
  • th:each
  • th:if
  • session.user
  • attributes

I dag skal I bruge Thymeleaf på nye måder i jeres bibliotekssystem.

Brug Thymeleaf-materialet som opslagsværk.


Opgave 1: Søg efter bøger

Lav en søgefunktion, hvor den loggede bruger kan søge efter bøger.

Brug en formular:

<form action="/searchbooks" method="get">
    <input type="text" name="search">
    <button type="submit">Søg</button>
</form>

Controlleren skal modtage søgeteksten og finde de bøger, der matcher.

Vis resultatet med th:each.

Eksempel:

Harry Potter
Harry Potter og Hemmelighedernes Kammer
Harry Potter og Fønixordenen

Prøv selv at beslutte, hvad der skal ske, hvis der ikke findes nogen bøger.


Opgave 2: Forskellige brugere får forskellige resultater

Nu skal søgningen tage højde for brugeren.

Vi forestiller os, at en bruger kan være:

  • voksen
  • barn

Tilføj derfor fx en isChild property til User.

Når et barn søger efter bøger, må barnet kun få vist børnebøger.

En voksen må se alle bøger.

Udfordring

Brug Thymeleaf til at håndtere resultatet.

I skal altså have en liste af bøger og bruge betingelser inde i jeres iteration.

Fx noget i retning af:

<div th:each="book : ${books}">

    <div th:if="...">
        ...
    </div>

</div>

I skal selv finde ud af, hvilken betingelse der giver mening.


Opgave 3: Vis hvorfor en bog ikke vises

Udvid søgningen.

Hvis brugeren er et barn, og en bog ikke er en børnebog, skal den ikke vises.

Prøv at lave en side, hvor der i stedet står:

Denne bog kan ikke vises for din bruger.

I må gerne bruge th:if eller th:unless.


Opgave 4: Vis forskellige knapper

Forestil jer, at en bog kan lånes.

En almindelig bruger skal kunne se:

Lån bog

Hvis bogen allerede er udlånt, skal der i stedet stå:

Ikke tilgængelig

Brug th:if og th:unless til at vise den rigtige tekst eller knap.

Her kombinerer I iteration og betingelser:

for hver bog
    └── er bogen tilgængelig?
          ├── ja → vis "Lån bog"
          └── nej → vis "Ikke tilgængelig"

Opgave 5: Forskellige oplysninger til forskellige brugere

Brug th:if til at vise forskellige oplysninger afhængigt af den aktuelle bruger.

Hvis brugeren er admin:

Administrator

Hvis brugeren ikke er admin:

Bruger

Prøv også at vise forskellige links afhængigt af brugerens rolle.


Opgave 6: Lav et “ingen resultater”-view

Når man søger efter bøger, kan der være nul resultater.

Lav en pæn besked:

Vi fandt ingen bøger, der matcher din søgning.

Beskeden skal kun vises, når listen med søgeresultater er tom.

Undersøg, hvordan Thymeleaf kan teste, om en liste er tom.


Lav et link på hver bog:

Se detaljer

Linket skal føre til en bestemt bog.

Fx:

/books/17

hvor 17 er bogens id.

Brug th:href til at bygge URL’en.

Undersøg, hvordan man indsætter en variabel i en URL med Thymeleaf.


Opgave 8: Lav en bogdetaljeside

Lav siden:

/books/{id}

På siden skal I vise oplysninger om den valgte bog:

  • Titel
  • Forfatter
  • ISBN
  • Eventuelt andre oplysninger fra jeres model

Lav også et link tilbage til boglisten.


Opgave 9: Betinget indhold på bogdetaljesiden

Nu skal bogdetaljesiden være forskellig afhængigt af brugeren.

Et barn skal fx ikke kunne se bøger, der ikke er børnebøger.

En voksen må se alle bøger.

Prøv at håndtere det med Thymeleaf.

Overvej også:

Hvad skal der ske, hvis en bruger forsøger at gå direkte til URL’en?

Fx:

/books/42

Opgave 10: Brug th:src

Tilføj eventuelt et billede til bøgerne.

Hvis jeres Book har en billedsti, kan I bruge:

<img th:src="@{${book.imagePath}}">

Hvis I ikke har billeder i jeres model, kan I bare eksperimentere med et fast billede først.


Opgave 11: Gør navigationen dynamisk

Lav en navigation, som ser forskellig ud afhængigt af brugeren.

En almindelig bruger kan fx se:

  • Forside
  • Mine lån
  • Søg bøger
  • Log ud

En admin kan desuden se:

  • Alle brugere
  • Alle bøger
  • Find bruger
  • Find forfatters bøger

Brug Thymeleaf til at styre, hvilke links der vises.


Opgave 12: Genbrug HTML med fragments

Se på jeres Thymeleaf-sider.

Er der HTML, som går igen på flere sider?

Fx:

  • navigation
  • header
  • footer

Lav et Thymeleaf-fragment til noget af det.

Undersøg:

th:fragment

og

th:replace

Prøv derefter at bruge fragmentet på flere sider.


Ekstra udfordringer

Hvis I bliver hurtigt færdige, så vælg én eller flere af disse.

Udfordring A: Søgning uden præcist match

Hvis brugeren søger:

Harry

skal alle bøger med “Harry” i titlen vises.

Hvis brugeren søger:

harry

skal det også virke.


Udfordring B: Søg efter forfatter

Lav en søgning, hvor brugeren kan skrive et forfatternavn.

Vis alle bøger af den pågældende forfatter.

Brug th:each til resultatet.


Udfordring C: Flere betingelser

Lav en situation, hvor Thymeleaf skal tage højde for mere end én ting.

Fx:

Hvis brugeren er et barn, må kun børnebøger vises.

og:

Hvis bogen er udlånt, må der ikke vises en “Lån bog”-knap.


Udfordring D: Find selv en Thymeleaf-funktion

Find noget i Thymeleaf-materialet, som vi endnu ikke har brugt.

Prøv det i jeres eget bibliotekssystem.

I skal bagefter kunne forklare:

  1. Hvad gør det?
  2. Hvordan bruger man det?
  3. Hvor kunne det være nyttigt?

Dagens mål

I skal ikke kunne huske alle Thymeleaf-attributter.

I skal kunne:

  • læse Thymeleaf-kode
  • finde den syntaks, I har brug for
  • kombinere iterationer og betingelser
  • sende data fra Java til Thymeleaf
  • bruge Thymeleaf til at lave forskellige views afhængigt af data
  • eksperimentere selv

Thymeleaf skal ikke længere føles som noget, læreren viser jer.

Det skal være noget, I selv kan undersøge og bruge.