Questa sezione introduce AdvancedExampleServlet2
. AdvancedExampleServlet2
è un esempio di implementazione dell'origine dati che definisce le funzionalità e il flusso di eventi. Questa sezione fornisce anche istruzioni passo passo su
come eseguire e testare AdvancedExampleServlet2
.
Nota: prima di iniziare questa sezione, devi completare la sezione Per iniziare.
Introduzione a AdvancedExampleServlet2
La classe AdvancedExampleServlet2
si trova nel pacchetto examples
.
Questa lezione fornisce un'implementazione di esempio
che definisce le funzionalità e il flusso di eventi.
Le parti più importanti di AdvancedExampleServlet2
sono
descritte nelle seguenti sezioni:
- Definire il flusso degli eventi
- Gestione degli errori
- Utilizzo dei parametri URL
- Utilizzo delle funzionalità
Definire il flusso degli eventi
AdvancedExampleServlet2
definisce il flusso di eventi eseguendo l'override del metodo HttpServlet.doGet()
e chiamando varie funzioni helper fornite da DataSourceHelper
.
Il seguente snippet sostituisce doGet()
. Il parametro HttpServletRequest
incapsula la richiesta effettuata da una visualizzazione al servlet. Il parametro HttpServletResponse
incapsula la risposta dal servlet alla visualizzazione delle query.
Inoltre, questo snippet imposta il valore dsRequest
su null. dsRequest
viene
utilizzato in vari punti nel resto del codice.
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { DataSourceRequest dsRequest = null;
Lo snippet seguente 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);
Lo snippet seguente prende la query dall'oggetto dsRequest
e la suddivide in due query separate. Una query è chiamata origine dati, l'altra query di completamento. Poiché la funzionalità dichiarata dell'origine dati è SELECT
, la query sull'origine dati consiste in un'operazione SELECT
se l'oggetto dsRequest
include un'operazione SELECT
.
La query di completamento
comprende tutte le altre operazioni richieste dalla richiesta, che potrebbero
includere anche un'operazione SELECT
. Ad esempio, se la query richiesta
è SELECT a ORDER
BY b
,
la query sull'origine dati sarà SELECT a, b
e la query di completamento
sarà la stessa della query originale SELECT a ORDER BY b
.
// Split the query. QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);
Lo snippet seguente prende la query
dell'origine dati creata dallo snippet precedente e da HttpServletRequest,
e
crea una tabella di dati. Consulta la sezione Utilizzo delle funzionalità per ulteriori dettagli.
// Generate the data table. DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);
Il seguente codice prende la query di completamento prodotta quando la query è stata suddivisa, la tabella dati prodotta dallo snippet precedente e le impostazioni internazionali dell'utente dalla visualizzazione delle query. Il codice quindi crea una nuova tabella di dati.
// Apply the completion query to the data table. DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data, dsRequest.getUserLocale());
Il seguente codice prende la tabella di dati
generata dallo snippet precedente e i
parametri di richiesta di HttpServletRequest
. Il codice imposta la risposta del servlet. Il container servlet restituisce questa risposta
alla visualizzazione delle query.
DataSourceHelper.setServletResponse(newData, dsRequest, resp);
Gestire gli errori
Lo snippet seguente acquisisce 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, viene utilizzato HttpRequest
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
dell'origine dati creata al momento della suddivisione e il HttpServletRequest
.
HttpServletRequest
può includere facoltativamente un parametro tableId
specificato come URL. Questo parametro tableId
determina la tabella di dati 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
viene specificato comeplanets
, l'origine dati restituisce la tabella di dati dei pianeti.
Quando scrivi il codice per restituire una tabella di dati, sei tu a decidere 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); }
Utilizzo delle funzionalità
Lo snippet seguente prende la query e genera la tabella di 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 di 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 AdvancedExampleServlet2
Questa sezione fornisce istruzioni su come eseguire e testare AdvancedExampleServlet2
.
Per eseguire e testare AdvancedExampleServlet2
, aggiorna
l'applicazione web e imposta una visualizzazione che esegua una query sull'origine
dati, come descritto nelle seguenti sezioni:
- Aggiornamento di un'applicazione web su Apache Tomcat
- Utilizzare una visualizzazione per visualizzare i dati
Aggiornare un'applicazione web su Apache Tomcat
Segui o adatta le istruzioni riportate di seguito per aggiornare la tua applicazione web su Apache Tomcat. Queste istruzioni sono specifiche per Apache Tomcat su un sistema Windows:
- Il file
web.xml
che hai copiato in precedenza nella directoryWEB-INF
contiene già la definizione e la mappatura necessarie per questo esempio. Le righe che definiscono questo aspetto 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
Puoi utilizzare il file all_examples.html
nella directory <data_source_library_install>/examples/src/html
per visualizzare una visualizzazione dei dati.
Il seguente snippet di all_examples
specifica il servlet advanced
, la tabella planets
, una query di selezione e una visualizzazione del 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 Riferimento per il linguaggio di query.
Segui o adatta le istruzioni riportate di seguito per vedere una visualizzazione dei dati forniti dall'origine dati avanzata:
- Se non lo hai già 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 link http://localhost:8080/myWebApp/all_examples.html in
un browser. Dovresti vedere quanto segue:
Passaggi successivi
Per esplorare ulteriormente gli esempi forniti con la libreria, consulta la documentazione di riferimento rapido di esempi. Per scoprire di più sull'implementazione di un'origine dati complessa, consulta i suggerimenti per l'implementazione.