Róznica spowodowana jest koncepcja z czym dane operatory występują
- ${...}- Wyrażenie określa zmienne Tą są praktyczne wyrażenie odnoszące się do zmiennych np
- *{...} To jest selektywne wyrażenie, które zazwyczaj idą w parze z th:boject
Przykład, masz na stronie formularz, który przyjmuje jakiś obiekt- zmienna, jako klasyczne wyrażenie
<form th:object="${form}"
dla takiego formularza, korzystasz z selektywnego operatora ( selektywny, bo ściśle jest związany z obiektem ${form}
te selektory będą wykonywane własnie, na wcześniej wybranym przez wyrażenie ${...} obiekcie, formularza.
Dlatego pola tego formularza selektywnie odwołują się poprzez *{...} do pól tego formularza.
Często idą w parze z elementami th:field
Dokumentacja: https://www.thymeleaf.org/doc/articles/standarddialect5minutes.html
Tu masz wszystko tak naprawdę omówione.
Jak widzisz masz obiekt ksiązki wybrany poprzez operator normalny wyrażenia, nastepnia specyficznym elementem tej ksiązki jest jej tytuł, dlatego odwołujesz się specyficznym operatorem *{...}
<div th:object="${book}">
...
<span th:text="*{title}">...</span>
...
</div>
A jak to wygląda z poziomu kodu javy?
No jak obiekt book, i odwołanie się do zmiennej tytuł jako właściwość książki
// th:object="${book}"
final Book selection = (Book) context.getVariable("book");
// th:text="*{title}"
output(selection.getTitle());