Suggerimenti per l'implementazione

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

Utilizzo dei propri servizi

Le implementazioni delle origini dati più semplici ereditano dalla classe DataSourceServlet della libreria. Per ereditare da una classe diversa da DataSourceServlet, implementare un'origine dati come segue:

  1. Implementa l'interfaccia DataTableGenerator ed esegui l'override di getCapabilities() e generateDataTable().
  2. Chiama DataSourceHelper.executeDataSourceServletFlow() dall'interno del codice del servlet per eseguire il flusso dell'origine dati.Questo metodo utilizza i seguenti parametri:
    • Un oggetto HttpServletRequest.
    • Un oggetto HttpServletResponse.
    • La tua implementazione dell'interfaccia DataTableGenerator del 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 invece di DataSourceServlet come segue:

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

Puoi utilizzare la stessa tecnica se usi un framework di servlet in cui normalmente erediti una classe astratta fornita dal framework. Ad esempio, se utilizzi WebWork potresti 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. Ad esempio, supponiamo che il tuo datastore sia un database e che il database abbia un numero elevato di colonne. Se una visualizzazione richiede solo alcune di queste colonne, l'esecuzione di un'operazione SELECT nel database è più efficiente del recupero di tutte le colonne e dell'utilizzo delle funzionalità di query della libreria per eseguire l'SELECT. Per implementare le funzionalità SELECT, scrivi il codice per eseguire un'operazione SELECT nel database e restituire una tabella di dati.

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

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

Nota: in tutti i casi, la libreria gestisce le operazioni delle query che non sono 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 illustrano come implementare le funzionalità: AdvancedExampleServlet, AdvancedExampleServlet2 e SqlDataSourceServlet. Sono tutti inclusi nel pacchetto example. AdvancedExampleServlet2 è discusso in Definizione delle funzionalità e del flusso di eventi.

Personalizzare il flusso di eventi

Il flusso predefinito di eventi è definito in DataSourceHelper.executeDataSourceServletFlow. La procedura predefinita è la seguente:

  1. Estrazione e analisi dei parametri di ricerca.
  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 quella di completamento. Passa la query sull'origine dati all'implementazione di generateDataTable().
  4. L'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 servlet.

Per specificare il tuo flusso di eventi, chiama le funzioni helper in datasource.DataSourceHelper. Per un esempio di implementazione, consulta Definizione delle funzionalità e del flusso degli eventi.

Trasmissione dei parametri a DataTableGenerator.generateDataTable

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

Nel codice del tuo servlet, inserisci nell'HttpServletRequest l'oggetto da trasmettere come segue:

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

Nell'implementazione dell'interfaccia di 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. Tra questi ci sono le classi Query e DataTable, oltre ad alcune delle funzioni DataSourceHelper come parseQuery, applyQuery, validateQuery e splitQuery. Puoi utilizzare le seguenti classi e funzioni per:

  • Analizza una query di visualizzazione.
  • Suddividi la query in una query di origine dati e in una di completamento.
  • Esegui la query di completamento per generare una tabella di dati.
  • Torna la tabella dei dati alla visualizzazione in formato HTML, CSV o JSON.