Suggerimenti per l'implementazione

In questa sezione troverai alcuni suggerimenti che ti aiuteranno a scrivere implementazioni più complesse della libreria:

Utilizzare il proprio servlet

Le implementazioni più semplici delle origini dati ereditano dalla classe DataSourceServlet della libreria. Per ereditare da una classe diversa da DataSourceServlet, implementa un'origine dati nel seguente modo:

  1. Implementa l'interfaccia DataTableGenerator ed esegui l'override di getCapabilities() e generateDataTable().
  2. Chiama DataSourceHelper.executeDataSourceServletFlow() dal codice del servlet per eseguire il flusso dell'origine dati.Questo metodo prevede i seguenti parametri:
    • Un oggetto HttpServletRequest.
    • Un oggetto HttpServletResponse.
    • La tua implementazione dell'interfaccia DataTableGenerator nel passaggio 1 precedente.
    • Un valore booleano per specificare la modalità di accesso con o senza restrizioni.

Ad esempio, se vuoi ereditare il servlet da un'altra classe di servlet, chiamata AuthServlet, che fornisce l'autenticazione integrata, puoi riscrivere SimpleServletExample per ereditare AuthServlet anziché DataSourceServlet nel seguente modo:

  1. Implementa l'interfaccia DataTableGenerator.
  2. Sposta generateDataTable() dall'implementazione DataSourceServlet all'implementazione DataTableGenerator.
  3. Esegui l'override di getCapabilities() nell'implementazione DataTableGenerator per restituire Capabilities.None.
  4. Richiama DataSourceHelper.executeDataSourceServletFlow() dal codice servlet (doGet() o doPost()) e passa l'implementazione di DataTableGenerator. Questo metodo esegue l'intero flusso dell'origine dati, incluso il rendering dei risultati dell'origine dati nella risposta servlet.

Puoi utilizzare la stessa tecnica se usi un framework servlet in cui normalmente erediti una classe astratta fornita dal framework. Ad esempio, se utilizzi WebWork, potresti voler ereditare la classe ActionSupport.

Definizione delle funzionalità

Se il datastore contiene una grande quantità di dati e vuoi aumentare l'efficienza dell'origine dati, puoi utilizzare le funzionalità di query del datastore. Supponiamo, ad esempio, che il datastore sia un database che abbia un numero elevato di colonne. Se una visualizzazione richiede solo poche di queste colonne, l'esecuzione di un'operazione SELECT all'interno del database è più efficiente rispetto al recupero di tutte le colonne e all'utilizzo delle funzionalità di query della libreria per eseguire SELECT. Per implementare le funzionalità SELECT, scrivi il codice per eseguire un'operazione SELECT all'interno del database e restituire una tabella di dati.

Utilizza l'enum Capabilities per definire le funzionalità di query fornite dal tuo codice. Le opzioni disponibili sono:

  • NONE: impostazione predefinita, il codice non fornisce operazioni di query.
  • SQL: il tuo codice fornisce operazioni di query SQL.
  • SORT_AND_PAGINATION: il codice fornisce operazioni di query di ordinamento e impaginazione.
  • SELECT: il tuo codice fornisce un'operazione selezionata.
  • ALL: il codice fornisce operazioni SQL, SORT_AND_PAGINATION e SELECT.

Nota: in tutti i casi, la libreria gestisce le operazioni di query non fornite dal codice.

Per implementare una funzionalità diversa da NONE, esegui l'override di Capabilities.getCapabilities() e implementa DataTable.generateDataTable() per eseguire query sul datastore e restituire una tabella di dati.

Tre degli esempi mostrano come implementare le funzionalità: AdvancedExampleServlet, AdvancedExampleServlet2 e SqlDataSourceServlet. Sono tutti nel pacchetto example. AdvancedExampleServlet2 è parlato in Definizione delle capacità e flusso di eventi.

Personalizzare il flusso degli eventi

Il flusso predefinito di eventi è definito in DataSourceHelper.executeDataSourceServletFlow. Il flusso predefinito è il seguente:

  1. Estrarre e analizzare i parametri di query.
  2. Solo per la modalità di accesso limitato, verifica che la richiesta provenga dallo stesso dominio del servlet.
  3. Analizza la richiesta per creare due oggetti query: la query dell'origine dati e la query di completamento. Passa la query sull'origine dati alla tua implementazione di generateDataTable().
  4. La tua implementazione di generateDataTable() genera una tabella di dati.
  5. Esegui la query di completamento sulla tabella di dati generata nel passaggio 5.
  6. Esegui il rendering della tabella di dati nel formato specificato dalla visualizzazione e imposta la risposta del servlet.

Per specificare il tuo flusso di eventi, chiama le funzioni helper in datasource.DataSourceHelper. Consulta la sezione Definizione delle funzionalità e il flusso di eventi per un esempio di implementazione.

Passaggio dei parametri a DataTableGenerator.generateDataTable

Puoi utilizzare HttpServletRequest.setAttribute per trasferire a DataTableGenerator.generateDataTable dati che non fanno parte di una query o di un oggetto HttpServletRequest. Il codice di esempio è riportato di seguito.

Nel codice del servlet, inserisci l'oggetto che vuoi passare in HttpServletRequest come segue:

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

Nell'implementazione dell'interfaccia dataTableGenerator, recupera l'oggetto da HttpServletRequest come segue:

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

Implementare un'origine dati non servlet

Se implementi la libreria senza utilizzare un servlet, puoi utilizzare solo le classi e le funzioni helper che non richiedono un ambiente servlet. Queste includono le classi Query e DataTable e alcune delle funzioni DataSourceHelper come parseQuery, applyQuery, validateQuery e splitQuery. Puoi utilizzare queste classi e funzioni per:

  • Analizzare una query di visualizzazione.
  • Suddividi la query in una query sull'origine dati e in una di completamento.
  • Esegui la query di completamento per generare una tabella di dati.
  • Ripristina la tabella di dati alla visualizzazione in formato HTML, CSV o JSON.