Definizione delle funzionalità e del flusso di eventi

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:

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

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:

  1. Il file web.xml che hai precedentemente copiato nella directory WEB-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> 
  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

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:

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