Definizione delle capacità e del flusso degli eventi

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

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 da planets, l'origine dati restituisce la tabella di dati sugli animali.
  • Se il parametro tableId viene specificato come planets, 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();
  List requiredColumns = 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();
  List requiredColumns = 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:

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:

  1. Il file web.xml che hai copiato in precedenza nella directory WEB-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> 
  2. Avvia Tomcat o riavvia Tomcat se è già in esecuzione.
  3. 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 con google.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:

  1. 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/.
     
  2. 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.