Conseils d'implémentation

Cette section fournit des conseils pour vous aider à écrire des implémentations plus complexes de la bibliothèque:

Utilisation de votre propre servlet

Les implémentations de source 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 remplacez 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 à l'étape 1 ci-dessus.
    • Booléen indiquant le mode d'accès restreint ou non restreint.

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 l'objet SimpleServletExample pour hériter de AuthServlet au lieu 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. Remplacez 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 DataTableGenerator. Cette méthode exécute l'intégralité du flux de la source de données, y compris l'affichage des résultats de la source de données dans la réponse du servlet.

Vous pouvez suivre 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éfinition 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 datastore soit une base de données comportant un grand nombre de colonnes. Si une visualisation ne demande que quelques-unes de ces colonnes, il est plus efficace d'exécuter une opération SELECT dans la base de données que de récupérer toutes les colonnes et d'utiliser les fonctionnalités de requête de la bibliothèque pour effectuer l'opération SELECT. Pour implémenter les fonctionnalités SELECT, vous devez écrire du code pour exécuter une opération SELECT dans la base de données et renvoyer une table de données.

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

  • NONE: 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 requête 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 non 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 des exemples illustrent comment implémenter des fonctionnalités: AdvancedExampleServlet, AdvancedExampleServlet2 et SqlDataSourceServlet. Tous sont inclus dans le package example. AdvancedExampleServlet2 est abordé dans la section Définir les fonctionnalités et le flux d'événements.

Personnaliser le flux d'événements

Le flux d'événements par défaut est défini dans DataSourceHelper.executeDataSourceServletFlow. Le flux par défaut se présente comme suit:

  1. Extrayez et analysez 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. Analyser la requête pour créer deux objets de requête: la requête de source de données et la requête de finalisation. 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 le tableau de données au 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 les 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 à DataTableGenerator.generateDataTable des données qui ne font pas partie d'une requête ou d'un objet HttpServletRequest. L'exemple de code est fourni 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 
} 

Mettre en œuvre une source de données sans servlet

Si vous mettez en œuvre la bibliothèque sans 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 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 de finalisation.
  • Exécutez la requête d'achèvement pour générer une table de données.
  • Revenez à la visualisation au format HTML, CSV ou JSON.