Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

di il
32 risposte

Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

Come da titolo vorrei realizzare un progetto pilota, una sorta di script base, chiamatelo come volete, che sia riutilizzabile per tutti i miei progetti futuri. Pensavo di utilizzare gli strumenti più semplici di java perché sono poco esperto. Su Google ho trovato script che sembra alla mia portata. Non ho ancora provato a caricare su di un IDE lo script e non so neppure se riuscirò a comprenderlo nel dettaglio ne tantomeno se sarò in grado di implementare la fase di registrazione automatica del nuovo utente, la convalida dell'utente, l'invio di email all'utente registrato e molte altre cose che ho in mente ma desidero ugualmente fare un tentativo. Vi vorrei chiedere, prima di iniziare, se ritenete lo script moderno, attuale, scritto bene, robusto e valido al 100% per realizzare altre applicazioni ben più complesse di cui mi occuperò in futuro come la realizzazione di un blog, di un ecommerce o qualcosa di ancora più complesso ed articolato.
Al momento mi accontento, a scopo ludico, di realizzare un'applicazione dinamica in cui un utente possa registrarsi ma debba attendere la convalida dall'amministratore del sito prima di poter utilizzare un'applicazione di "alta" matematica che permetta all'utente registrato/abilitato/autenticato di fare la divisione tra 2 numeri.
Volevo anche un consiglio sul tipo di database più appropriato da usare. Sono molto indeciso tra MySQL e PostgreSQL. Nel caso riteniate lo script all'altezza e non superato da altri strumenti di java più potenti di cui ne ignoro l'esistenza, vorrei sapere quali sono i pro ed i contro di un database e l'altro. Personalmente sono indeciso perché tutti i principali CMS usano MySQL ma PostgreSQL è stato creato da Oracle che ha nel suo portfolio un DB ad oggetti forse potente quanto i DB venduti da Microsoft. Al momento sono più propenso verso Postgresql ma attendo un vostro suggerimento in merito.
Ho abbandonato l'idea di usare JPA perché mi sembra più complesso rispetto alle classiche query. Se mai un domani dovessi cambiare DB si tratta di aggiornare il file schema.sql di Spring Boot e le query sparse nelle classi che posso al limite raccogliere in un file query.sql.
Attendo un vostro riscontro ma soprattutto un incoraggiamento perché non sono bravo come voi.

32 Risposte

  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Guarda, volevo rispondere nell'altra discussione ma non ne ho avuto tempo ... questi sono giorni un po' concitati per me perché sto cambiando azienda ...
    Comunque dato che hai posto qui un po' di questioni, vediamo di chiarirle bene.

    iBaffiPro ha scritto:


    Come da titolo vorrei realizzare un progetto pilota, una sorta di script base, chiamatelo come volete, che sia riutilizzabile per tutti i miei progetti futuri.
    Allora: il fatto del "riutilizzo" è un altro discorso/livello. E questo riguarda anche il sistema di build che si utilizza (Maven o Gradle, tipicamente). Poter riutilizzare "facilmente" significherebbe poter poi avere un singolo artifact da poter tirare dentro in un qualunque altro progetto. E questo lo si fa solo conoscendo bene lo strumento di build in uso (Maven o Gradle, appunto).
    E nell'ottica di Spring Boot è anche possibile creare uno "starter" custom che fornisca le dovute autoconfigurazioni, default, ecc...

    Ma come ho appena detto, tutto questo è un altro discorso. Dovresti prima cercare di arrivare ad una applicazione perlomeno che funziona .... POI a quel punto, avendo fatto un po' di esperienza, provi a ragionare su come rendere "riutilizzabili" certe parti di quella applicazione a favore di n altri possibili progetti. Ripeto, è un lavoro fattibile ma non facile, specialmente se hai poca/nessuna esperienza su Spring/Spring Boot/Maven/Gradle.

    iBaffiPro ha scritto:


    Su Google ho trovato script che sembra alla mia portata. Non ho ancora provato a caricare su di un IDE lo script e non so neppure se riuscirò a comprenderlo nel dettaglio ne tantomeno se sarò in grado di implementare la fase di registrazione automatica del nuovo utente, la convalida dell'utente, l'invio di email all'utente registrato e molte altre cose che ho in mente ma desidero ugualmente fare un tentativo.
    Tutto quello che hai trovato può essere sicuramente uno "spunto" valido e utile. Ma non ti devi "fissare" troppo su quei progetti. Perché possono essere fatti con certi obiettivi particolari e potrebbero trascurarne altri che magari invece a te interessano. Oltre al fatto che potrebbero anche non essere scritti benissimo o contenere "forzature" varie poco eleganti.

    Quando si fanno applicazioni di questo tipo ci sono molte cose da studiare, valutare. E dovresti essere TU a fare queste valutazioni. Tanto per dirne una. Se la tua è una web app classica con pagine web, ci sono almeno due modi per gestire la interfaccia utente:
    - creando la interfaccia utente lato server. E' il classico caso in cui a fronte di una request si rimanda alla fine ad una "vista" interna alla webapp che poi diventa una pagina HTML inviata al client (browser). Spring Boot tra l'altro consente di usare almeno 4 sistemi di templating differenti: Thymeleaf, FreeMarker, Mustache e Groovy.
    - creando (anche proprio separatamente dalla webapp) la parte web usando framework "moderni" (Angular / React / Vue ecc...) che poi fa chiamate AJAX alla parte server per ottenere i dati. Questo è un altro livello e richiede anche ben altre competenze.

    iBaffiPro ha scritto:


    Vi vorrei chiedere, prima di iniziare, se ritenete lo script moderno, attuale, scritto bene, robusto e valido al 100% per realizzare altre applicazioni ben più complesse di cui mi occuperò in futuro come la realizzazione di un blog, di un ecommerce o qualcosa di ancora più complesso ed articolato.
    Ti stai aspettando requisiti molto "elevati" da script che si trovano qua e la su internet, che tipicamente sono solo esempi (anche validi, non metto in dubbio) ma che restano proprio solo esempi da cui prendere spunto.

    iBaffiPro ha scritto:


    in cui un utente possa registrarsi ma debba attendere la convalida dall'amministratore del sito prima di poter utilizzare un'applicazione
    Questa logica inevitabilmente complica le cose. Per quanto ne so, Spring Security non applica di serie una logica di questo tipo. Si può sicuramente fare ma bisogna "entrare" davvero molto di più dentro Spring Security. Significa che dovrai documentarti molto bene, leggendo la reference di Spring Security e possibilmente/preferibilmente prendendo anche un buon libro su questo argomento (ne è uscito uno della Manning appena ad Ottobre dello scorso anno)

    iBaffiPro ha scritto:


    Volevo anche un consiglio sul tipo di database più appropriato da usare. Sono molto indeciso tra MySQL e PostgreSQL. Nel caso riteniate lo script all'altezza e non superato da altri strumenti di java più potenti di cui ne ignoro l'esistenza, vorrei sapere quali sono i pro ed i contro di un database e l'altro. Personalmente sono indeciso perché tutti i principali CMS usano MySQL ma PostgreSQL è stato creato da Oracle che ha nel suo portfolio un DB ad oggetti forse potente quanto i DB venduti da Microsoft. Al momento sono più propenso verso Postgresql ma attendo un vostro suggerimento in merito.
    Allora: finché puoi far girare tutto su un tuo pc, puoi scegliere quello che vuoi. Il discorso cambierebbe se intendessi poi mettere la webapp su un hosting "reale". Qui potresti avere poca/nessuna scelta. In generale sulla maggior parte degli hosting più basilari è più facile trovare MySQL piuttosto che PostgreSQL. Anzi, per questioni di costi/licenze è ancora più facile che su un hosting ci trovi il MariaDB che è sostanzialmente un fork del MySQL che è stato mantenuto gratuito e open-source.

    iBaffiPro ha scritto:


    Ho abbandonato l'idea di usare JPA perché mi sembra più complesso rispetto alle classiche query.
    JPA/Spring Data JPA ovviamente non sono obbligatori. Ci sono comunque altre alternative, anche e soprattutto nel contesto di Spring Boot: usare MyBatis (è un framework per la persistenza ma NON è un ORM), oppure usare i template JDBC di Spring o anche altro.

    La questione quindi è: cosa hai provato a fare finora? Hai già provato a scrivere una banalissima webapp con Spring Boot ?da zero? che mostra una paginetta di "hello world" usando magari un template engine (tipo Thymeleaf)?
    Se non riesci nemmeno ancora su queste cose, tutto il resto che hai indicato è ovviamente poco raggiungibile ....
    E quindi potremmo stare a discutere fino alla fine del prossimo mese ....
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Prima di tutto in bocca al lupo per il tuo cambio e complimenti per la tua carriera.
    Io ho decido di usare Maven, il resto non mi interessa.
    Sulle valutazioni che dovrei fare io meglio stendere un velo pietoso…
    Il mio obiettivo è un’applicazione lato server non lato client e come template vorrei usare Thymeleaf.
    AJAX non lo conosco proprio per cui mi limito ad usare JS ed i relativi framework per risolvere problematiche di tipo grafico (menu, impaginazione, ecc…).
    Per risolvere il problema della registrazione con Spring Security potrei valutare di cambiare esercitazione oppure decidere di non utilizzare Spring Security (ultima spiaggia). Al momento non ho intenzione di mettere in conto la lettura di un libro per il login, forse in futuro, ti ringrazio per il suggerimento.
    Grazie per le info sui DB ma non capisco perché scrivi che PostgreSQL e MySQL non sono gratuiti. In passato avevo installato MySQL o PostgreSQL su un server senza pagare nulla, ho commesso un illecito? Per quanto riguarda la parte sistemistica in effetti è un grosso problema però pensavo di preoccuparmi solo in un secondo momento. A questo punto potrei decidere di cambiare idea e scegliere MySQL.
    Come strumento per gestire il DB mi piace molto JDBC e pensavo di usare quello.
    Si con Spring Boot ho già provato a fare qualcosa, è da un po’ che smanetto. La Web App “Hello Word” sono in grado di farla.
    Per farti capire, la Web App che ho postato, l’ho letta e l’ho compresa al 95%. Oggi e domani ragiono su questo 5% che resta. Appena arrivo al 100% provo a metterla sull’IDE e a farla girare.
    Un’altra preoccupazione è che questa applicazione che ho letto non è REST, non passa JSON da una pagina all’altra e questo mi convince poco.
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    iBaffiPro ha scritto:


    Io ho decido di usare Maven, il resto non mi interessa.
    Bene. Gradle infatti è meno conosciuto rispetto a Maven e di conseguenza anche meno usato.

    iBaffiPro ha scritto:


    Il mio obiettivo è un’applicazione lato server non lato client e come template vorrei usare Thymeleaf.
    Chiariamo una cosa: se fai una webapp che mostra pagine web fruibili da un qualunque browser (desktop o mobile non importa ora), un lato "client" ce l'hai comunque da fare/gestire. L'unica questione, come dicevo prima, è se la pagina web la genera il server (ad esempio con un template engine tipo Thymeleaf) oppure sta separata ed evolve sfruttando i moderni framework Javascript. In quest'ultimo caso c'è una separazione più netta e il front-end tipicamente fa chiamate asincrone (con varie tecniche AJAX a seconda del framework/libreria js) al server per ottenere dati (tipicamente JSON) o più raramente o in scenari particolari, pezzetti di HTML da inserire nel DOM.

    iBaffiPro ha scritto:


    AJAX non lo conosco proprio per cui mi limito ad usare JS ed i relativi framework per risolvere problematiche di tipo grafico (menu, impaginazione, ecc…).
    Vedi sopra e poi più al fondo.

    iBaffiPro ha scritto:


    Al momento non ho intenzione di mettere in conto la lettura di un libro per il login
    Peccato ... ma ok.

    iBaffiPro ha scritto:


    non capisco perché scrivi che PostgreSQL e MySQL non sono gratuiti.
    NON ho detto che non sono gratuiti! MySQL ha una licenza duale: GPLv2 e proprietaria. Finché rispetti la GPL non devi pagare niente. Se non la si può/vuole rispettare, serve una licenza commerciale.
    Per PostgreSQL dovrei andare a leggere ....

    iBaffiPro ha scritto:


    Un’altra preoccupazione è che questa applicazione che ho letto non è REST, non passa JSON da una pagina all’altra e questo mi convince poco.
    Che vuol dire .....
    Allora, lo ripeto (meglio):

    Se fai una webapp in cui le pagine vengono generate lato server (es. Thymeleaf con Spring Boot), il client che tipicamente è solo un browser fruisce direttamente quelle. In genere in questo caso le pagine web usano poco/nulla di Javascript .. al limite librerie tipo JQuery e simili. Perché tutto il HTML è già generato lato server e soprattutto ad OGNI singola request. E in questo contesto JSON di fatto NON c'entra nulla perché front-end e back-end NON si scambiano dei dati (a parte parametri nella request).

    Se fai una webapp in cui il back-end espone principalmente dati (tipicamente in JSON o XML), i client potrebbero essere di molti tipi: app Android, applicazioni "desktop" Java/Swing o C#/.Net ecc.. e infine ovviamente anche un browser. In quest'ultimo caso il front-end è fatto in HTML/CSS/Javascript, è separato dal back-end e utilizza appunto uno dei vari framework moderni (Angular, ecc...) o al limite JQuery. Il punto è che essendoci "in mezzo" solo dati, il front-end deve fare delle request asincrone (detto in generale, con tecniche AJAX) al back-end per ottenere i dati. E in un contesto come questo, Thymeleaf, FreeMarker e gli altri template engine lato server NON c'entrano niente perché il server NON genera le pagine web.

    Non denigrare o ignorare l'uno o l'altro approccio solo perché non ti è chiara la differenza .....

    iBaffiPro ha scritto:


    in bocca al lupo per il tuo cambio e complimenti per la tua carriera.
    Thanks
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Se MySQL ha una GPLv2 allora è sufficiente rivelare da qualche parte della WebApp gli strumenti utilizzati. In pratica bisogna scrivere “Realizzato con MySQL”. Non sapevo questo dettaglio!
    https://choosealicense.com/licenses/gpl-2.0
    PostgreSQL sembra distribuito con licenza BSD quindi senza obbligo di scrivere sul sito “Realizzato con Postgresql”.
    https://www.vitadastudente.it/2010/12/15/guerra-tra-licenze-software-gpl-vs-bsd/
    In entrambi i casi se realizzo un sito dinamico e mi faccio pagare non è necessario acquistare una licenza commerciale che non oso neppure pensare quanto possa costare.
    Quello che mi racconti in merito ai 2 approcci è chiarissimo, quello che allora non capisco è il significato di applicazione REST.
    Quando si parla di REST si parla sempre di JSON ma senza parlare di AJAX. Quando ad esempio si crea un blog sarebbe meglio che ogni notizia avesse il suo link distinto (esempio “/nomemagina?id=112”) in questo modo la pagina risulta indicizzabile e ricercabile dai vari motori di ricerca. A me AJAX al momento non interessa ma non mi dispiacerebbe avere quei link lunghi e strani che permettono di identificare la risorsa. Per fare questo bisogna conoscere a dovere Javascript e quindi AJAX?
    Se non erro le applicazioni che usano AJAX permettono di aiutare l’utente a ricercare una parola in un database perché sono in grado di suggerire al client la soluzione, questa cosa con i siti che faccio io non si può fare. E’ giusto questo?
    In futuro studierò AJAX e Spring Security a dovere perché sono componenti importanti che ormai usano tutti i programmatori.
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Oggi ho riletto tutto quanto e ho compreso il funzionamento dello script. Ho trovato qualche errore ma nulla di complesso da risolvere. Non ho capito quel "commit" nel database a cosa serve ed è l'unica domanda che ti pongo in merito a questo progetto. In application.properties io ho aggiunto questo:
    
    spring.datasource.initialization-mode=always
    spring.datasource.continue-on-error=true
    
    Il lato positivo di questo script è che è molto semplice da capire e da implementare ma ha come lato negativo la mancanza del processo di registrazione. Pensavo di cercarne un altro. AndBin tu non hai proprio nulla da consigliarmi?
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    iBaffiPro ha scritto:


    quello che allora non capisco è il significato di applicazione REST.
    REST è uno stile architetturale, non è un protocollo o specifica.
    https://it.wikipedia.org/wiki/Representational_State_Transfer

    iBaffiPro ha scritto:


    Quando si parla di REST si parla sempre di JSON ma senza parlare di AJAX.
    JSON è solo uno dei possibili formati di dati. E AJAX non c'entra direttamente con JSON. Per AJAX si intende in generale la tecnica che permette di fare chiamate asincrone, in background, da un browser web verso un server. Con AJAX puoi fare chiamate HTTP di qualunque tipo e stile ... poi se seguono lo stile REST, allora è anche ok.

    iBaffiPro ha scritto:


    Se non erro le applicazioni che usano AJAX permettono di aiutare l’utente a ricercare una parola in un database perché sono in grado di suggerire al client la soluzione, questa cosa con i siti che faccio io non si può fare. E’ giusto questo?
    Una ricerca così la si può fare in entrambi i modi che ho detto. Quello che cambia è ciò che vede (o non vede) l'utente come effetto finale.

    Se le pagine sono generate dinamicamente lato server, l'utente scrive in un campo, clicca su "cerca" e parte la request al server. Il server poi genera una NUOVA pagina completa che invia al client. Quindi il browser carica una pagina completamente diversa. Questo può essere di per sé più lento e questo effetto di ricarica comunque .. si vede.

    Se la pagina fa chiamate asincrone al server in background, l'utente scrive in un campo, clicca su "cerca" e parte la request al server ma "di nascosto", cioè l'utente non ne sa nulla di questa richiesta e non vede cambiare l'url nel browser. Il server risponde inviando dei dati (tipicamente JSON) che lato client con Javascript vengono elaborati e poi viene modificato il DOM della pagina per cambiare solo una parte minima della pagina (ad esempio una tabella). Il risultato finale è che il browser NON ha caricato tutta una nuova pagina e l'effetto finale è più simile ad una applicazione desktop piuttosto che le classiche pagine web.

    iBaffiPro ha scritto:


    Non ho capito quel "commit" nel database a cosa serve
    Scusa ma se non sai cosa è un commit a livello di database .... si parte male ....
    Sai almeno cosa è una "transazione" (riferito sempre ai database)?
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    1. Andbin mi consigli un buon sito dove cercare degli script validi per questa login che siano alla mia portata ovvero senza AJAX, magari anche con REST (temo che JSON sia troppo complesso ma posso fare un tentativo)?
    Io ho trovato questi:

    https://www.codebyamir.com/blog/user-account-registration-with-spring-boot
    https://hellokoding.com/spring-security-login-logout-thymeleaf/
    https://www.websparrow.org/spring/spring-security-jdbc-authentication-with-spring-boot
    https://www.concretepage.com/spring-boot/spring-boot-rest-jpa-hibernate-mysql-example
    Che ne pensi?
    2. Mi sembra di ricordare di aver letto qualcosa di commit insieme ad un'altra parola che se non erro era rollback. Se non ricordo male:
    COMMIT invia una segnalazione di errore nel caso una delle N transazioni precedenti alla parola COMMIT fallisca ma non riporta il DB allo stato originario, quindi può accadere che queste N transazioni vengano in parte applicate al DB.
    ROLLBACK invia una segnalazione di errore nel caso una delle N transazioni precedenti alla parola ROLLBACK fallisca ma riporta il DB allo stato originario, quindi se anche solo una delle precedenti transazioni fallisce il DB non viene assolutamente modificato. Con ROLLBACK il DB prima di eseguire le N modifiche le testa e verifica che non vi siano errori.
    Per definire le N transazioni atomiche queste ultime vengono precedute da "BEGIN TRANSACTION;" in PostgreSQL, da "START TRANSACTION;" in MySQL e vengono fatte seguire da "COMMIT;" oppure da "ROLLBACK;".
    Se mancano "BEGIN TRANSACTION;" oppure "START TRANSACTION;" le N transazioni sono rappresentate dall'intero file .sql.
    Nel caso in questione COMMIT non capisco a cosa possa servire. Negli altri script che avevo visto in precedenza questa parola non era mai presente nel file .sql. Potrebbe essere una specie di blocco: "se qualcosa è andato storto ferma tutto"?
    Sempre grazie e buona Pasquetta, per quello che rimane ovviamente!
    3. Perché tutti gli script che trovo sono in Java 8 quando siamo già a Java 16? Questi script che cerco di capire e di implementare sono stati superati/abbandonati? Non sarebbe meglio cercare qualcosa fatto con Java 16?
    sempre grazie
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    iBaffiPro ha scritto:


    mi consigli un buon sito dove cercare degli script validi per questa login che siano alla mia portata ovvero senza AJAX, magari anche con REST (temo che JSON sia troppo complesso ma posso fare un tentativo)?[/b]
    Io ho trovato questi: [...]
    Le risorse che hai trovato non le ho guardate in dettaglio ma .. non sono sicuramente "male" nel senso che possono sicuramente essere degli "spunti" utili e validi. La questione è che ti aspetti di trovare un esempio che faccia esattamente tutto quello che vuoi. Può darsi che esista da qualche parte .... o può darsi di no ....
    Sei tu che devi saper cogliere le possibilità nei vari ambiti (es. persistenza, security, esposizione di viste o dati ecc...) e poi metterle insieme. Come già dicevo prima, le scelte sono molte nei vari ambiti.

    Se sei già in grado di fare da zero una webapp Spring Boot che usa Thymeleaf per mostrare qualche pagina ... sei ad un buon 25-30%. Per il resto, devi continuare a studiare ...

    iBaffiPro ha scritto:


    2. Se non ricordo male: COMMIT invia una segnalazione di errore nel caso una delle N transazioni precedenti alla parola COMMIT fallisca ma non riporta il DB allo stato originario
    NO. Il commit rende permanenti su DB le modifiche che fino a quel momento (durante l'arco della transazione) erano "pendenti".

    iBaffiPro ha scritto:


    3. Perché tutti gli script che trovo sono in Java 8 quando siamo già a Java 16? Questi script che cerco di capire e di implementare sono stati superati/abbandonati? Non sarebbe meglio cercare qualcosa fatto con Java 16?
    Allora: innanzitutto Java 16 è stato rilasciato appena 3 settimane fa. Quindi ad oggi non ci si può aspettare di trovare chissà quanti esempi e progetti per Java 16.
    E comunque tutte le ultime versioni (circa da Java 12 in poi) hanno sì portato delle novità ma sono molto marginali e non "epocali".
    In Java 16 ad esempio sono stati resi ufficiali e permanenti i "record" che in Java 14/15 erano delle preview feature (in "anteprima"). Lo dico sempre: per chi sta iniziando con Java tutte queste novità non sono rilevanti/importanti. Punto.

    Poi c'è comunque da considerare che da Java 9 esiste il JPMS, Java Platform Module System. Il module system permette di rendere veramente "modulare" il framework stesso di Java ma anche librerie esterne. Fortunatamente non è obbligatorio usarlo, si può ancora fare tutto usando il preesistente concetto di classpath "piatto". Ma anche questa del module system è tutta una grossa novità che deve essere studiata e capita bene (e non è banale ...).
    Inoltre nelle versioni recenti, specialmente tra Java 9 e Java 11 sono state rimosse delle API dal framework standard. Un esempio eclatante è la API di JAXB (il binding per XML) che in Java 11 non fa proprio più parte di JavaSE. Significa che se una applicazione è stata fatta e impacchettata per Java 8 e usa JAXB, con un runtime Java 11 non funziona e bisognerebbe fare delle scelte per tirare dentro una apposita implementazione di JAXB.
    Tutto questo non riguarda il linguaggio, che è perfettamente retrocompatibile. Un banale codice scritto per Java 5 continua a funzionare anche in Java 16. Semplicemente sono state fatte delle scelte per snellire e migliorare il framework standard, a discapito però della portabilità assoluta.
    Questi sono alcuni dei motivi per cui ancora oggi molti (e specialmente a livello aziendale) sono ancora un po' fermi a Java 8.
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Il mio obiettivo è partire da uno di quegli esempi e fare delle modifiche, ammesso che ne sia in grado. Se vuoi sbilanciarti mi farebbe molto piacere. Fra tutti, il migliore sembra quello di hellokoding.com ma avrei preferito un tuo giudizio certamente più autorevole e arguto del mio.
    Chiarissima la tua spiegazione su Java 16, grazie davvero!
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Provo per un po' di giorni a cimentarmi sullo script iniziale con JDBC e guardo cosa riesco a combinare. JPA credo sia troppo per me. Inoltre gli ORM non mi ispirano molto se devo essere onesto.
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    iBaffiPro ha scritto:


    Provo per un po' di giorni a cimentarmi sullo script iniziale con JDBC e guardo cosa riesco a combinare. JPA credo sia troppo per me.
    Come forse ho già detto in precedenza ma lo ripeto, JPA non è né obbligatorio, né l'unica cosa possibile. Esiste una varietà di altre soluzioni possibili già solo nell'ambito dei db relazionali:
    • l'uso di JDBC "nudo e crudo". Tecnicamente possibile ma sconsigliato solo perché prolisso/noioso
    • l'uso del template JDBC di Spring (JdbcTemplate)
    • l'uso di Spring Data JDBC che si basa sul concetto dei repository ed è una sorta di ORM super-super-leggero (ma non è un ORM come JPA/Hibernate! Ed ha comunque diversi aspetti sconvenienti)
    • l'uso di librerie esterne come ad esempio MyBatis che si può integrare facilmente in Spring Framework/Boot
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    L'uso di JDBC nudo e crudo l'ho usato ma è troppo prolisso, concordo.
    L'uso di JdbcTemplate è il mio preferito.
    Spring Data JDBC è quello che sto usando ora. Potresti dirmi quali sono gli aspetti sconvenienti?
    MyBatis mi piace come JdbcTemplate ma il secondo lo preferisco.
    Chiaramente io so poco e nulla di tutto.
    Sempre grazie per il tuo supporto.
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    iBaffiPro ha scritto:


    Spring Data JDBC è quello che sto usando ora. Potresti dirmi quali sono gli aspetti sconvenienti?
    Nella documentazione ufficiale (9.6. Persisting Entities) c'è un paragrafo abbastanza eloquente:

    If the aggregate root is not new, all referenced entities get deleted, the aggregate root gets updated, and all referenced entities get inserted again. Note that whether an instance is new is part of the instance’s state.

    Spiego meglio: Spring Data JDBC si basa sul concetto di "aggregate" e "aggregate root" oltre che di "repository". Un esempio molto semplice è: Persona è una entity "aggregate root" e Telefono è una entity associata a Persona (Persona e Telefono fanno parte di un aggregate). Nella tabella TELEFONI chiaramente ci sarà una foreign-key verso PERSONE perché logicamente un telefono è associato solo ad una determinata persona. Quindi a livello Java avrai una classe Persona che ha un List<Telefono> ad esempio.

    Se crei un nuovo oggetto Persona (non ha ancora un Id = nuovo) che contiene 3 oggetti Telefono e lo salvi, Spring Data JDBC inserisce tutto correttamente facendo complessivamente 4 INSERT.

    Ora: mettiamo che tiri su da db un oggetto Persona (quindi ha un certo Id = non "nuovo") che ha i 3 telefoni associati. Poi modifichi l'oggetto Persona e magari aggiungi 1 telefono e salvi di nuovo tutto. Che succede??
    Il punto è che Spring Data JDBC non è un ORM completo, non ha meccanismi di caching, non traccia le entity e non ha nemmeno logiche di dirty-tracking. Quindi non sa come era lo stato precedente (cioè solo 3 telefoni) e pertanto non è in grado di fare un "diff" e capire quali siano le query "minime" da fare.

    Con la implementazione attuale, Spring Data JDBC fa una cosa molto banale ma brutale: elimina tutti gli aggregati, quindi nell'esempio fa un DELETE dei 3 telefoni e poi re-inserisce tutti i telefoni facendo 4 INSERT, oltre ovviamente a fare un UPDATE sulla tabella delle persone.

    Questo è un ("bel") lato negativo da tenere presente ....
  • Re: Creare un sito dinamico in cui gli utenti possono registrarsi per usufruire di un servizio

    Anche JPA ha lo stesso problema, è pesante e lento.
Devi accedere o registrarti per scrivere nel forum
32 risposte