Questa sezione presenta AdvancedExampleServlet2
. AdvancedExampleServlet2
è un esempio di implementazione dell'origine dati che definisce le funzionalità e il flusso di eventi. In questa sezione vengono fornite anche istruzioni dettagliate su
come eseguire e testare AdvancedExampleServlet2
.
Nota: devi completare la sezione Per iniziare prima di iniziare questa sezione.
AdvancedExampleServlet2
La classe AdvancedExampleServlet2
si trova nel pacchetto examples
.
Questa classe fornisce un'implementazione di esempio che definisce le funzionalità e il flusso degli eventi.
Le parti più importanti di AdvancedExampleServlet2
sono
descritte nelle seguenti sezioni:
- Definizione del flusso degli eventi
- Gestione degli errori
- Utilizzo dei parametri URL
- Utilizzo delle funzionalità
Definire il flusso degli eventi
AdvancedExampleServlet2
definisce il flusso di eventi sostituendo il metodo HttpServlet.doGet()
e chiamando varie funzioni di supporto fornite da DataSourceHelper
.
Il seguente snippet esegue l'override di doGet()
. Il parametro HttpServletRequest
incapsula la richiesta fatta da una visualizzazione al servlet. Il parametro HttpServletResponse
incapsula la risposta dal servlet alla visualizzazione della query.
Inoltre, questo snippet imposta dsRequest
su null. dsRequest
viene utilizzato in diversi punti del resto del codice.
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { DataSourceRequest dsRequest = null;
Lo snippet che segue estrae i parametri della richiesta da HttpServletRequest
per creare il contesto in cui viene eseguita la richiesta.
try { // Extract the request parameters. dsRequest = new DataSourceRequest(req);
Il seguente snippet prende la query dall'oggetto dsRequest
e suddivide la query in due query separate. Una query è denominata query dell'origine dati, l'altra la query di completamento. Poiché la capacità dichiarata
dell'origine dati è SELECT
, la query sull'origine dati
è composta da un'operazione SELECT
se l'oggetto dsRequest
include un'operazione SELECT
.
La query di completamento include tutte le altre operazioni richieste, che potrebbero includere anche un'operazione SELECT
. Ad esempio, se la query richiesta è SELECT a ORDER
BY b
, la query nell'origine dati sarà SELECT a, b
e la query di completamento sarà uguale alla query originale SELECT a ORDER BY b
.
// Split the query. QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);
Lo snippet seguente prende la query di origine dati creata dallo snippet precedente e da HttpServletRequest,
e crea una tabella di dati. Per ulteriori dettagli, consulta la sezione sull'utilizzo delle funzionalità.
// Generate the data table. DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);
Il seguente codice prende la query di completamento prodotta quando è stata suddivisa la query, la tabella di dati prodotta dallo snippet precedente e le impostazioni internazionali dell'utente dalla visualizzazione della query. Il codice crea quindi una nuova tabella di dati.
// Apply the completion query to the data table. DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data, dsRequest.getUserLocale());
Il codice seguente prende la tabella di dati prodotta dallo snippet precedente e i parametri di richiesta da HttpServletRequest
. Il codice imposta quindi la risposta del servlet. Il container servlet restituisce questa risposta
alla visualizzazione di query.
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
Gestire gli errori
Lo snippet seguente genera un'eccezione, riceve il messaggio appropriato, formatta la risposta e imposta la risposta del servlet. Se dsRequest
è
null, DataSourceRequest
non è disponibile, probabilmente a causa di un errore
del costruttore. In questo caso, HttpRequest
viene utilizzato al posto di DataSourceRequest
.
catch (RuntimeException rte) { log.error("A runtime exception has occured", rte); ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR, rte.getMessage()); if (dsRequest == null) { dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req); } DataSourceHelper.setServletErrorResponse(status, dsRequest, resp); } catch (DataSourceException e) { if (dsRequest != null) { DataSourceHelper.setServletErrorResponse(e, dsRequest, resp); } else { DataSourceHelper.setServletErrorResponse(e, req, resp); } }
Utilizzare i parametri URL
Lo snippet seguente prende la query di origine dati che è stata creata quando la query è stata suddivisa e HttpServletRequest
.
HttpServletRequest
può facoltativamente includere un parametro tableId
specificato come URL. Questo parametro tableId
determina quale tabella di dati viene restituita come segue:
- Se il parametro
tableId
viene omesso o è diverso daplanets
, l'origine dati restituisce la tabella di dati sugli animali. - Se il parametro
tableId
è specificato comeplanets
, l'origine dati restituisce la tabella di dati dei pianeti.
Quando scrivi il tuo codice per restituire una tabella di dati, decidi quali parametri prendere.
private DataTable generateMyDataTable(Query query, HttpServletRequest req) throws TypeMismatchException { String tableID = req.getParameter("tableId"); if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) { return generatePlanetsTable(query); } return generateAnimalsTable(query); }
Utilizzare le funzionalità
Lo snippet seguente prende la query e genera la tabella dei dati animals
.
private DataTable generateAnimalsTable(Query query) throws TypeMismatchException { DataTable data = new DataTable(); ListrequiredColumns = getRequiredColumns(query, ANIMAL_TABLE_COLUMNS); data.addColumns(requiredColumns); // Populate the data table for (String key : animalLinksByName.keySet()) { TableRow row = new TableRow(); for (ColumnDescription selectionColumn : requiredColumns) { String columnName = selectionColumn.getId(); if (columnName.equals(ANIMAL_COLUMN)) { row.addCell(key); } else if (columnName.equals(ARTICLE_COLUMN)) { row.addCell(animalLinksByName.get(key)); } } data.addRow(row); } return data; }
Lo snippet seguente prende la query e genera la tabella dei dati planets
.
private DataTable generatePlanetsTable(Query query) throws TypeMismatchException { DataTable data = new DataTable(); ListrequiredColumns = getRequiredColumns( query, planetTableColumns); data.addColumns(requiredColumns); // Populate data table for (Planet planet : Planet.values()) { TableRow row = new TableRow(); for (ColumnDescription selectionColumn : requiredColumns) { String columnName = selectionColumn.getId(); if (columnName.equals(PLANET_COLUMN)) { row.addCell(planet.name()); } else if (columnName.equals(MASS_COLUMN)) { row.addCell(planet.getMass()); } else if (columnName.equals(GRAVITY_COLUMN)) { row.addCell(planet.getSurfaceGravity()); } else if (columnName.equals(MOONS_COLUMN)) { row.addCell(planet.getNumberOfMoons()); } } data.addRow(row); } return data; }
Esecuzione e test di AdvancedExampleServlet2
Questa sezione fornisce istruzioni su come eseguire e testare AdvancedExampleServlet2
.
Per eseguire e testare AdvancedExampleServlet2
, aggiorna l'applicazione web e configura una visualizzazione che esegue query sull'origine dati, come descritto nelle sezioni seguenti:
- Aggiornamento di un'applicazione web su Apache Tomcat
- Utilizzare una visualizzazione per visualizzare i dati
Aggiornamento di un'applicazione web su Apache Tomcat
Segui o segui le istruzioni riportate di seguito per aggiornare l'applicazione web su Apache Tomcat. Queste istruzioni sono specifiche per Apache Tomcat su un sistema Windows:
- Il file
web.xml
che hai precedentemente copiato nella directoryWEB-INF
contiene già la definizione e la mappatura richieste per questo esempio. Le righe che lo definiscono sono:
<servlet> <servlet-name>AdvancedExampleServlet2</servlet-name> <description> AdvancedExampleServlet2 </description> <servlet-class>AdvancedExampleServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>AdvancedExampleServlet2</servlet-name> <url-pattern>/advanced</url-pattern> </servlet-mapping>
- Avvia Tomcat o riavvia Tomcat se è già in esecuzione.
- Fai clic sul seguente link:http://localhost:8080/myWebApp/advanced
Lo schermo mostra 6-7 righe di testo, a seconda della larghezza dello schermo. Il testo inizia congoogle.visualization.Query.setResponse
e termina con{v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
Questa è la risposta che l'origine dati CSV di esempio invia a una visualizzazione.
Utilizzare una visualizzazione per visualizzare i dati
Il file all_examples.html
nella directory <data_source_library_install>/examples/src/html
può essere utilizzato per visualizzare una visualizzazione dei dati.
Il seguente snippet di all_examples
specifica il servlet advanced
, la tabella planets
, una query selezionata e una visualizzazione di un grafico a barre.
query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass'); ... var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));
Per una spiegazione delle altre visualizzazioni incluse in all_examples.html
, consulta la sezione Utilizzo di un datastore esterno.
Per ulteriori informazioni su come specificare una visualizzazione e utilizzare il linguaggio di query, consulta Utilizzo dei grafici e la documentazione sul linguaggio di query.
Segui o segui le istruzioni riportate di seguito per visualizzare una visualizzazione dei dati forniti dall'origine dati avanzata:
- Se non l'hai ancora fatto, copia il file
all_examples.html
dalla directory<data_source_library_install>/examples/src/html
alla directory<tomcat_home>/webapps/myWebApp/
.
- Fai clic sul seguente link: http://localhost:8080/myWebApp/all_examples.html in un browser. Dovresti visualizzare quanto segue:
Passaggi successivi
Per esplorare ulteriormente gli esempi forniti con la libreria, consulta la sezione Esempi di riferimento rapido. Per scoprire di più sull'implementazione di un'origine dati complessa, consulta i suggerimenti per l'implementazione.