Salve, per una volta domando io ... giusto oggi ho ripreso il lavoro e mi hanno subito appioppato un lavoretto per niente banale. Riguarda principalmente JSF e il componente <h:dataTable>.
Faccio alcune premesse: il progetto di lavoro (applicazione server in ambito bancario) è abbastanza grande, per la parte front-end di amministrazione utilizza JSF 2.1 con anche PrimeFaces 3.4, più qualche Javascript qua e là e in alcuni punti anche JQuery.
La parte back-end è fatta principalmente con dei EJB che usano JPA e "sotto" c'è EclipseLink che accede a DB Oracle.
C'è una nuova funzionalità di amministrazione che è stata iniziata nelle scorse settimane da un altro sviluppatore e ora è passata a me. Sono già state fatte diverse pagine JSF di questa funzionalità e su due pagine in particolare c'è un tabella fatta con <h:dataTable>. Tecnicamente funzionano già, i dati vengono mostrati e gestiti correttamente.
Ora mi viene chiesto di implementare la “paginazione” ma non a livello “client” bensì a livello “server” su DB (preciso poi meglio dopo). Devo anche dire che nel resto del front-end ci sono diverse altre <h:dataTable> con la paginazione ma è gestita in modo basilare come inteso/supportato dal h:dataTable. Chi aveva integrato questa paginazione (e sicuramente alcuni anni fa) aveva preso praticamente quasi pari-pari l'esempio di componente <corejsf:pager> del capitolo 13 del libro “Core JavaServer Faces, 3rd Edition”.
Questa paginazione funziona andando solamente a indicare al dataTable l'indice “first” da cui mostrare i dati ma nel List<TipoElemento> assegnato al dataTable i dati ci sono sempre *tutti* e vengono caricati da DB solo all'inizio.
Questo, ora per queste due tabelle, non va bene. Ad ogni cambio di pagina si vuole fare una nuova query su DB limitando i record tramite una coppia di valori “pageNum/pageSize” (tramite JPA si usano poi i setFirstResult/setMaxResults di javax.persistence.Query).
In pratica ci saranno poi 2 metodi “dammi il conteggio delle righe” e “dammi i record per pageNum/pageSize”. Il mio dubbio adesso è come impostare/aggiungere la paginazione sapendo che “a valle” ci saranno questi due metodi per ogni tipologia di tabella.
1) Creando un nuovo componente custom (più o meno come quel <corejsf:pager>)?
2) Agendo (implementando qualcosa) in qualche modo a livello di data-model per il h:dataTable?
3) Usando componenti (es. un'altra data-table) già fatti di altre librerie?
4) Altro?
Il 3) è sicuramente off-limits, preferiscono non aggiungere altre librerie che potrebbero portare “altri” problemi. Tra l'altro nel front-end ci sono già alcune pagine che usano h:dataTable e altre che usano p:dataTable (di PrimeFaces).
L'obiettivo è anche di fare un qualcosa di abbastanza incapsulato e riutilizzabile (le tabelle sono 2 diverse ora ma potrebbero aumentare).
Sia 1) che 2) per me significano una curva di apprendimento discretamente alta. Nei mesi passati mi hanno fatto fare altro su JSF, semplici pagine con dei form, manutenzione (piccole modifiche di layout, diciture, ecc..) su altre, modifiche al menù fatto con PrimeFaces e cose del genere. Sono riuscito a farle, a volte con un po' di fatica e comunque ben sapendo/ammettendo di non aver potuto fare e comprendere tutto perfettamente.
Ma in generale su JSF me ne intendo relativamente poco e non conosco nemmeno bene tutto il “ciclo di vita” in JSF.
Personalmente lo ritengo un po' complesso, anche per me che comunque non sono certo “principiante” su Java (se al posto mio ci fosse uno “junior” …..)
Avete suggerimenti? idee?
Grazie, in anticipo!
P.S. dimenticavo di dire che c'è anche una piccola complicazione in più: le due tabelle hanno una colonna iniziale di checkbox per poter marcare più record. Cambiando pagina si vuole "ricordare" la selezione fatta fino a quel momento. La classe degli oggetti per le righe ha lo stato "selected" (boolean) ma non può (per quanto ne so) essere reso persistente su DB.