should I send a JSON instead of HTML from the server and construct the
page at the client using jQuery templates - or can this be achieved
even if the Controller returns a ModelAndView?
No. Quello sarebbe reinventare la ruota. Esistono già quadri per lavorare in questo modo. Sebbene, in qualche modo incompatibile con il tipo di applicazione proposto da Spring MVC.
Spring MVC non è stato progettato per essere implementato in questo modo.
I have considered having the login JSP and the contacts JSP combined
into one and hide/unhide based on response
Dal punto di vista del design front-end, è una pessima idea. Ancora una volta, stai cercando di risolvere qualcosa che è già stato risolto da altri framework. E cercando di sconfiggere il design dell'applicazione proposto da Spring MVC.
Il problema principale che vedo qui è che hai abusato del framework.
Le applicazioni Spring MVC rientrano nel gruppo di applicazioni Web in cui il server controlla lo stato di entrambe le applicazioni, server e client.
In breve, il client è "compilato" (generato) dal server e fornito al client nel suo stato finale. Il browser visualizza semplicemente il contenuto così com'è e attende l'interazione dell'utente.
Per Spring MVC per controllare lo stato dell'intera applicazione, è necessario inviare richieste al server, in modo che il server calcoli il nuovo stato e restituisca la rappresentazione (principalmente la vista come documento html) al browser.
Questo si applica anche alla navigazione. Ogni volta che navighiamo, cambiamo lo stato dell'applicazione, quindi la richiesta e la pagina si ricaricano.
Detto questo, e tornando alla domanda, la tua implementazione sta sconfiggendo il design sopra, quindi la complessità in quasi tutto ciò che provi a fare.
Nelle applicazioni MVC di Spring, JQuery e AJAX svolgono un ruolo diverso. Sono usati per fornire la vista con un certo grado di dinamismo; Ad esempio, aggiornare piccole sezioni della pagina. Pensa alle paginazioni, alle liste dinamiche e alle combo, alle ricerche, agli effetti visivi, ai processi in background, ecc. Funzionalità che farebbero riscrivere il server e aggiornare l'intera pagina solo per piccole (o impercettibili) modifiche. Come puoi immaginare, è abbastanza inefficiente. E noioso, dal punto di vista dell'esperienza utente.
I think this is a very common problem so there should already be best
practices/design approaches for handling this.
Sì, erano 10-15 anni fa; quando AJAX e JQuery (più tardi), hanno rivoluzionato il mercato delle applicazioni web. Questi due hanno causato una sorta di nevrosi che ha portato molte persone a sviluppare applicazioni web esilaranti. Tieni presente che le librerie e i browser JavaScript non erano così sofisticati come al momento.
Fortunatamente, queste tecnologie si sono evolute in base alle tendenze e alle esigenze del mercato. Più o meno, verso consentire i client web disaccoppiati.
Riassumendo, suggerirei due possibili soluzioni:
-
Continua ad implementare Spring MVC, ma smetti di usare JQuery e AJAX come lo stai facendo ora. Supponiamo che JQuery non debba fare sul lato client cosa dovrebbe essere fatto da Spring sul lato server.
-
Modifica Spring MVC di Spring Web. Sostituisci @Controllers con @RestControllers, estrai le viste dal server, rendi il server stateless e implementa il front-end in modo indipendente dal back-end.
Indipendentemente dalle opzioni di cui sopra, ciò che conta è fare un uso corretto degli strumenti. O in altre parole, per scegliere lo strumento giusto per ogni problema.