Conseils d'implémentation

Cette section présente quelques conseils qui vous aideront à écrire des implémentations plus complexes de la bibliothèque:

Utiliser votre propre servlet

Les implémentations de sources de données les plus simples héritent de la classe DataSourceServlet de la bibliothèque. Pour hériter d'une classe autre que DataSourceServlet, implémentez une source de données comme suit:

  1. Implémentez l'interface DataTableGenerator, et ignorez getCapabilities() et generateDataTable().
  2. Appelez DataSourceHelper.executeDataSourceServletFlow() à partir du code de votre servlet pour exécuter le flux de source de données.Cette méthode utilise les paramètres suivants :
    • Un objet HttpServletRequest.
    • Un objet HttpServletResponse.
    • Votre implémentation de l'interface DataTableGenerator de l'étape 1 ci-dessus.
    • Booléen spécifiant le mode d'accès restreint ou non.

Par exemple, si vous souhaitez hériter de votre servlet d'une autre classe de servlet, appelée AuthServlet, qui fournit une authentification intégrée, vous pouvez réécrire le SimpleServletExample pour qu'il hérite de AuthServlet plutôt que de DataSourceServlet, comme suit:

  1. Implémentez l'interface DataTableGenerator.
  2. Déplacez generateDataTable() de votre implémentation DataSourceServlet vers votre implémentation DataTableGenerator.
  3. Ignorez getCapabilities() dans votre implémentation DataTableGenerator pour renvoyer Capabilities.None.
  4. Appelez DataSourceHelper.executeDataSourceServletFlow() à partir de votre code de servlet (doGet() ou doPost()), puis transmettez votre implémentation de DataTableGenerator. Cette méthode exécute l'intégralité du flux de la source de données, y compris le rendu des résultats de la source de données dans la réponse du servlet.

Vous pouvez utiliser la même technique si vous utilisez un framework de servlets dans lequel vous héritez normalement d'une classe abstraite fournie par le framework. Par exemple, si vous utilisez WebWork, vous pouvez hériter de la classe ActionSupport.

Définir des fonctionnalités

Si votre datastore contient une grande quantité de données et que vous souhaitez augmenter l'efficacité de votre source de données, vous pouvez utiliser les fonctionnalités d'interrogation de votre datastore. Par exemple, supposons que votre data store soit une base de données et que cette base de données comporte un grand nombre de colonnes. Si une visualisation ne demande que quelques-unes de ces colonnes, l'exécution d'une opération SELECT dans la base de données est plus efficace que de récupérer toutes les colonnes et d'utiliser les fonctionnalités d'interrogation de la bibliothèque pour effectuer l'opération SELECT. Pour mettre en œuvre les fonctionnalités SELECT, vous devez écrire du code afin d'exécuter une opération SELECT dans la base de données et de renvoyer une table de données.

Utilisez l'énumération Capabilities pour définir les fonctionnalités d'interrogation fournies par votre code. Les options disponibles sont les suivantes :

  • NONE: valeur par défaut. Votre code ne fournit aucune opération de requête.
  • SQL: votre code fournit des opérations de requête SQL.
  • SORT_AND_PAGINATION: votre code fournit à la fois des opérations de tri et de pagination.
  • SELECT: votre code fournit une opération de sélection.
  • ALL: votre code fournit des opérations SQL, SORT_AND_PAGINATION et SELECT.

Remarque: Dans tous les cas, la bibliothèque gère toutes les opérations de requête qui ne sont pas fournies par votre code.

Pour implémenter une fonctionnalité autre que NONE, remplacez Capabilities.getCapabilities() et implémentez DataTable.generateDataTable() pour interroger le datastore et renvoyer une table de données.

Trois exemples illustrent comment implémenter des capacités: AdvancedExampleServlet, AdvancedExampleServlet2 et SqlDataSourceServlet. Tous sont inclus dans le package example. AdvancedExampleServlet2 est abordé dans la section Définir des fonctionnalités et le flux d'événements.

Personnalisation du flux d'événements

Le flux d'événements par défaut est défini dans DataSourceHelper.executeDataSourceServletFlow. Le flux par défaut est le suivant:

  1. Extraire et analyser les paramètres de requête
  2. Pour le mode d'accès restreint uniquement, vérifiez que la requête provient du même domaine que le servlet.
  3. Analysez la requête pour créer deux objets de requête: la requête de source de données et la requête d'achèvement. Transmettez la requête de source de données à votre implémentation de generateDataTable().
  4. Votre implémentation de generateDataTable() génère une table de données.
  5. Exécutez la requête d'achèvement sur la table de données générée à l'étape 5.
  6. Affichez la table de données dans le format spécifié par la visualisation et définissez la réponse du servlet.

Pour spécifier votre propre flux d'événements, appelez les fonctions d'assistance dans datasource.DataSourceHelper. Consultez la section Définir des fonctionnalités et le flux d'événements pour obtenir un exemple de mise en œuvre.

Transmettre des paramètres à DataTableGenerator.generateDataTable

Vous pouvez utiliser HttpServletRequest.setAttribute pour transmettre des données qui ne font pas partie d'une requête ou d'un objet HttpServletRequest à DataTableGenerator.generateDataTable. Vous trouverez un exemple de code ci-dessous.

Dans le code de votre servlet, placez l'objet que vous souhaitez transmettre dans HttpServletRequest comme suit:

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

Dans l'implémentation de l'interface dataTableGenerator, récupérez l'objet à partir de HttpServletRequest comme suit:

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

Implémenter une source de données non-servlet

Si vous implémentez la bibliothèque sans utiliser de servlet, vous ne pouvez utiliser que les classes et les fonctions d'assistance qui ne nécessitent pas d'environnement de servlet. Celles-ci incluent les classes Query et DataTable, ainsi que certaines fonctions DataSourceHelper telles que parseQuery, applyQuery, validateQuery et splitQuery. Vous pouvez utiliser ces classes et ces fonctions pour effectuer les opérations suivantes:

  • analyser une requête de visualisation ;
  • Divisez la requête en une requête de source de données et une requête d'achèvement.
  • Exécutez la requête d'achèvement pour générer une table de données.
  • Renvoyez la table de données à la visualisation au format HTML, CSV ou JSON.