Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

di il
9 risposte

Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

Ciao a tutti,
Vorrei implementare ad un mio progetto questo script:
https://www.baeldung.com/registration-with-spring-mvc-and-spring-security
e ci sono alcune cose che non comprendo.
In Thymeleaf qual è la differenza tra questi codici:

${...}
*{...}
#{...}
@{...}
~{...}

La @ e la ~ sono semplici da capire perché hanno usi ben precisi ma gli altri simboli sembrano intercambiabili. Per esempio ho provato a sostituire * con $ e tutto funziona alla meraviglia.
Sto leggendo qui ma ho un po' di confusione in mente:
https://www.thymeleaf.org/documentation.htm
riuscite a chiarirmi questo concetto?
Inoltre c'è anche questo:

${#...}
che rende tutto ancora più complicato.
Grazie

9 Risposte

  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    iBaffiPro ha scritto:


    In Thymeleaf qual è la differenza tra questi codici:
    
    ${...}
    *{...}
    #{...}
    @{...}
    ~{...}
    
    Allora:

    ${...} è una variable expression e contiene una espressione nel linguaggio chiamato OGNL che permette di "navigare" dentro gli oggetti per estrarre i dati partendo dal modello ad oggetti fornito a Thymeleaf (ad esempio da un controller Spring). Questa forma quindi serve per esporre dei dati (es. ${persona.nome}.

    #{...} è una message expression e serve per la localizzazione dei messaggi in più lingue. Il contenuto di #{...} è una "chiave" usata all'interno dei resource bundle per rintracciare il messaggio in una certa lingua. Con Spring Boot, Thymeleaf si basa sui concetti di internazionalizzazione di Spring Boot, quindi basta seguire qualunque guida che dice come/dove mettere i resource bundle dei messaggi con Spring Boot.
    Questa forma quindi serve per tutte le "diciture" fisse: etichette, intestazioni, note, tooltip, ecc...

    *{...} è simile a ${...} ma con una differenza: *{...} risolve l'espressione su un oggetto "selezionato" che deve essere specificato in un elemento più a monte con th:object. Guarda , l'esempio iniziale è davvero eloquente.

    @{...} si usa per emettere un url. Il vantaggio di @{...} è che "sa" come rendere completo/assoluto un url, se necessario, partendo da uno relativo. Il caso più tipico è quello di un url relativo alla context-root. Se scrivi @{/altrapagina.html} esso aggiunge in automatico il nome del contesto. Con Spring Boot per default il nome del contesto è vuoto (si può cambiare) ma se generi un myapp.war il nome del contesto è ... myapp e l'url emesso sarebbe /myapp/altrapagina.html che risulta quindi relativo alla server-root.

    ~{...} è una fragment expression e si usa nel contesto dei fragment (non li ho mai usati finora, leggi la guida ).

    E per la forma ${#xyz...} in realtà è sempre una variable expression, solo che il primo nome denota il riferimento ad un oggetto "speciale" messo a disposizione da Thymeleaf. La documentazione fa l'esempio di ${#locale.country} dove #locale è semplicemente un nome speciale che fa riferimento ad un oggetto java.util.Locale del locale determinato per la request corrente.
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    Grazie mille, ho capito tutto, sei stato davvero molto chiaro.
    Con ~{...} ho trovato questo esempio (una cosa simile a th:include):
    Esempio:
    <div th:insert="~{footer :: copy}"></div>
    Il codice sopra inserisce in una pagina html un tag specifico definito altrove.
    Il codice ~{...} può essere omesso infatti
    <div th:insert="footer :: copy"></div>
    produce lo stesso effetto del
    codice seguente:
    <div th:insert="~{footer :: copy}"></div>
    Se definisco il seguente tag in una pagina .html:
    <footer th:fragment="copy">
      &copy; 2011 The Good Thymes Virtual Grocery
    </footer>
    posso riutilizzare lo stesso tag in un'altra pagina in questo modo:
    <body>
      ...
      <div th:insert="footer :: copy"></div>
      <div th:replace="footer :: copy"></div>
      <div th:include="footer :: copy"></div>
    </body>
    Il risultato è il seguente:
    <body>
      ...
      <div>
        <footer>
          &copy; 2011 The Good Thymes Virtual Grocery
        </footer>
      </div>
      <footer>
        &copy; 2011 The Good Thymes Virtual Grocery
      </footer>
      <div>
        &copy; 2011 The Good Thymes Virtual Grocery
      </div>
    </body>
    Quello che non capisco è questo oggetto "speciale". Nel form che sto leggendo:
    https://www.baeldung.com/registration-with-spring-mvc-and-spring-security
    trovo questo pezzo.
    <p th:each="error: ${#fields.errors('firstName')}"
               th:text="${error}">Validation error</p>
    Questo fields.errors è un oggetto speciale di java?
    <!--/* La variabile #{...} può essere definita in un file .properties. */-->
    <h1 th:text="#{label.form.title}">Form</h1>
    <!--/* La variabile ${...} è un oggetto classico di java creato per contenere i parametri inviati dal form. */-->
    <form action="/" th:object="${user}" method="POST" enctype="utf8">
        <div>
            <label th:text="#{label.user.firstName}">first</label>
            <!--/* La variabile *{...} è una variabile dell'oggetto definito in th:object="${...}". */-->
            <input th:field="*{firstName}"/>
            <!--/* th:each="X: ${L}" è un ciclo for. L è un oggetto lista mentre X l'oggetto che compone tale lista. */-->
            <!--/* ${#...} definisce un oggetto speciale di java. ?????? lo devo creare???? esiste già???? */-->
            <p th:each="error: ${#fields.errors('firstName')}"
               th:text="${error}">Validation error</p>
        </div>
    Questo ${#fields.errors('firstName')} potrebbe essere un oggetto speciale di Spring Boot creato dalle annotazioni @NotNull e @NotEmpty di UserDto e quindi non dovrei assolutamente preoccuparmene?
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    iBaffiPro ha scritto:


    Questo fields.errors è un oggetto speciale di java?

    Questo ${#fields.errors('firstName')} potrebbe essere un oggetto speciale di Spring Boot creato dalle annotazioni @NotNull e @NotEmpty di UserDto e quindi non dovrei assolutamente preoccuparmene?
    No, non c'entra direttamente con Spring Boot ma c'entra con il modulo di integrazione di Thymeleaf con Spring.
    Infatti #fields è documentato nel
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    Grazie mille.
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    iBaffiPro ha scritto:


    Grazie mille. Nel mio caso, la lista ${#fields.errors('firstName')}, contiene gli errori intercettati dalle annotazioni @NotNull e @NotEmpty presenti nell'oggetto UserDto, giusto?
    Sì, la presenza di eventuali errori deriva dall'utilizzo della Bean Validation API e in sostanza dalla applicazione delle varie annotazioni di validazione tipo @NotNull ecc..
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    Grazie mille. Ho letto la parte restante dell’articolo. Ho anche visto velocemente le altre lezioni di questo tutorial e devo ammettere che c’è davvero molta carne al fuoco. Se mi concentrassi su questo Spring Security probabilmente non finirei neppure tra 100 anni senza ovviamente un valido supporto.
    Io ho implementato Spring Security solo ed esclusivamente per una questione di sicurezza però non ho esigenza di verificare se un’e-mail sia corretta oppure no. L’unica esigenza che posso avere è quella di permettere all’utente di cambiare la propria password. Quale altro sistema di registrazione potrei usare per semplificare le cose senza scrivere tutto questo codice? Io l’utente lo individuo con 3 campi (nome, password ed abilitato). La variabile abilitato è semplicemente un BOOLEAN che permette all’utente principale del sito (il sottoscritto) di definire chi può accedere ai servizi del sito oppure no dopo essersi registrato.
    Per contro se abbandono Spring Security rischio di mettere in pericolo la mia applicazione? Io ho bisogno di fare molte più cose con molto meno codice e meno complicanze. Mi sento molto vincolato nell’uso di questo codice. Ti faccio un esempio: se volessi creare io l’account e permettere all’utente la scelta della password? Destreggiarsi in tutto questo bordello di codice diventa praticamente impossibile. Mi serve una linea di pensiero pulita per legare le pagine al DB.
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    Sono riuscito a salvare un utente in un database ma non riesco a valorizzare questa variabile:
    <h1 th:text="#{label.form.title}">Form</h1>
    Per la verità non mi interessa molto internazionalizzare il mio sito ma dal momento che ho capito il concetto vorrei almeno per il form provare a creare il file .properties.
    La documentazione dice di creare accanto al file .html un file .properties che abbia il nome della pagina. Ho provato in 1000 altri modi diversi, anche a creare la cartella WEB-INF ma nulla, mi compare sempre questo messaggio:
    ??registration.title_it_IT??
    https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
    Devo aggiungere qualche classe/modulo? Sbaglio posizione?
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    iBaffiPro ha scritto:


    La documentazione dice di creare accanto al file .html un file .properties che abbia il nome della pagina.
    Sì ma vale solo quando si usa la logica predefinita di Thymeleaf, cioè quando lo si usa da solo e/o in altri contesti.

    Ma nel contesto di Spring Boot viene configurato un apposito resolver che si basa sul meccanismo di internazionalizzazione predefinito di Spring Boot. Dal reference:

    By default, Spring Boot looks for the presence of a messages resource bundle at the root of the classpath.

    Quindi:
    src/main/resources/messages.properties
    src/main/resources/messages_it.properties
    src/main/resources/messages_fr.properties
    ecc.....
  • Re: Qualche difficoltà ad implementare uno script al mio progetto (sono alle prime armi...)

    Grazie, hai ragione. Avevo provato anche quella soluzione ma non era andata a buon fine, mi sarò sbagliato a scrivere la parola "messages".
Devi accedere o registrarti per scrivere nel forum
9 risposte