Définir des fonctionnalités et le flux d'événements

Cette section présente AdvancedExampleServlet2. AdvancedExampleServlet2 est un exemple d'implémentation de source de données qui définit les fonctionnalités et le flux d'événements. Cette section fournit également des instructions détaillées sur l'exécution et le test de AdvancedExampleServlet2.

Remarque: Vous devez terminer la section Premiers pas avant de commencer cette section.

Présentation de AdvancedExampleServlet2

La classe AdvancedExampleServlet2 se trouve dans le package examples. Cette classe fournit un exemple d'implémentation qui définit les fonctionnalités et le flux d'événements.

Les parties les plus importantes de AdvancedExampleServlet2 sont décrites dans les sections suivantes:

Définir le flux des événements

AdvancedExampleServlet2 définit le flux des événements en remplaçant la méthode HttpServlet.doGet() et en appelant différentes fonctions d'assistance fournies par DataSourceHelper.

L'extrait de code suivant remplace doGet(). Le paramètre HttpServletRequest encapsule la requête effectuée par une visualisation auprès du servlet. Le paramètre HttpServletResponse encapsule la réponse du servlet à la visualisation des requêtes. Cet extrait définit également dsRequest sur null. dsRequest est utilisé à différents endroits dans le reste du code.

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

L'extrait de code suivant extrait les paramètres de requête de HttpServletRequest pour créer le contexte dans lequel la requête s'exécute.

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

L'extrait de code suivant extrait la requête de l'objet dsRequest et la divise en deux requêtes distinctes. L'une s'appelle la requête de source de données, l'autre requête d'achèvement. Étant donné que la capacité déclarée de la source de données est SELECT, la requête de la source de données consiste en une opération SELECT si l'objet dsRequest inclut une opération SELECT. La requête d'achèvement comprend toutes les autres opérations requises par la requête, qui peuvent également inclure une opération SELECT. Par exemple, si la requête demandée est SELECT a ORDER BY b, la requête de source de données sera SELECT a, b et la requête d'achèvement sera identique à la requête d'origine SELECT a ORDER BY b.

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

L'extrait suivant reprend la requête de source de données créée par l'extrait précédent et l'HttpServletRequest,, puis crée une table de données. Pour en savoir plus, consultez la section Utiliser les fonctionnalités.

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

Le code suivant reprend la requête d'achèvement générée lors de la division de la requête, le tableau de données produit par l'extrait précédent et les paramètres régionaux de l'utilisateur issus de la visualisation de la requête. Le code crée ensuite une table de données.

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

Le code suivant utilise la table de données produite par l'extrait précédent et les paramètres de requête de HttpServletRequest. Le code définit ensuite la réponse du servlet. Le conteneur de servlet renvoie cette réponse à la visualisation des requêtes.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Gérer les erreurs

L'extrait de code suivant détecte une exception, obtient le message approprié, met en forme la réponse et définit la réponse du servlet. Si dsRequest est nul, DataSourceRequest n'est pas disponible, peut-être en raison de l'échec du constructeur. Dans ce cas, HttpRequest est utilisé à la place de 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);
      }
    }

Utiliser des paramètres d'URL

L'extrait suivant reprend la requête de source de données créée lors de la division de la requête, ainsi que l'HttpServletRequest. HttpServletRequest peut éventuellement inclure un paramètre tableId spécifié en tant qu'URL. Ce paramètre tableId détermine la table de données à renvoyer comme suit:

  • Si le paramètre tableId est omis ou s'il est différent de planets, la source de données renvoie la table de données sur les animaux.
  • Si le paramètre tableId est spécifié en tant que planets, la source de données renvoie la table de données des planètes.

Lorsque vous écrivez votre propre code pour renvoyer une table de données, vous décidez des paramètres à utiliser.

  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);
  }

Utiliser les fonctionnalités

L'extrait de code suivant utilise la requête et génère la table de données 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;
}

L'extrait de code suivant utilise la requête et génère la table de données 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;
}

Exécution et test de AdvancedExampleServlet2

Cette section fournit des instructions sur l'exécution et le test de AdvancedExampleServlet2.

Pour exécuter et tester AdvancedExampleServlet2, mettez à jour votre application Web et configurez une visualisation qui interroge la source de données, comme décrit dans les sections suivantes:

Mettre à jour une application Web sur Apache Tomcat

Suivez ou adaptez les instructions ci-dessous pour mettre à jour votre application Web sur Apache Tomcat. Ces instructions sont spécifiques à Apache Tomcat sur un système Windows:

  1. Le fichier web.xml que vous avez précédemment copié dans le répertoire WEB-INF contient déjà la définition et le mappage requis pour cet exemple. Les lignes qui le définissent sont les suivantes:

    <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. Lancez Tomcat, ou redémarrez Tomcat s'il est déjà en cours d'exécution.
  3. Cliquez sur le lien suivant:http://localhost:8080/myWebApp/advanced
    L'écran affiche 6 à 7 lignes de texte, en fonction de la largeur de votre écran. Le texte commence par google.visualization.Query.setResponse et se termine par {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    Il s'agit de la réponse que l'exemple de source de données CSV envoie à une visualisation.

Utiliser une visualisation pour afficher les données

Le fichier all_examples.html du répertoire <data_source_library_install>/examples/src/html permet d'afficher une visualisation des données.

L'extrait de code suivant de all_examples spécifie le servlet advanced, la table planets, une requête SELECT et une visualisation sous forme de graphique à barres.

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

Pour en savoir plus sur les autres visualisations incluses dans all_examples.html, consultez la section Utiliser un datastore externe.

Pour en savoir plus sur la spécification d'une visualisation et l'utilisation du langage de requête, consultez Utiliser des graphiques et la documentation de référence sur le langage de requête.

Suivez ou adaptez les instructions ci-dessous pour afficher une visualisation des données fournies par la source de données avancée:

  1. Si vous ne l'avez pas déjà fait, copiez le fichier all_examples.html du répertoire <data_source_library_install>/examples/src/html
    vers le répertoire <tomcat_home>/webapps/myWebApp/.
     
  2. Cliquez sur le lien suivant: http://localhost:8080/myWebApp/all_examples.html dans un navigateur. Le résultat suivant doit s'afficher:

Étapes suivantes

Pour explorer plus en détail les exemples fournis avec la bibliothèque, consultez le guide de référence rapide pour les exemples. Pour en savoir plus sur la mise en œuvre d'une source de données complexe, consultez les conseils d'implémentation.