Pages JSP et beans de données

Un bean de données est un bean Java qui est utilisé dans une page JSP pour fournir du contenu dynamique. Un bean de données fournit normalement une représentation simple d'un bean d'entité HCL Commerce. Le bean de données encapsule les propriétés qui peuvent être récupérées ou définies dans le bean d'entité. En tant que tel, le bean de données simplifie la tâche d'incorporation de données dynamiques dans les pages JSP.

Un bean de données est activé de l'une des façons suivantes :

  • au moyen de la wcbase:useBean tag (recommandé)
  • au moyen de l'appel suivant :
    
    com.ibm.commerce.beans.DataBeanManager.activate(data_bean, request, response)
    

    data_bean est le bean de données à activer, request est un objet HTTPServletRequest et response est un objet HTTPServletResponse.

Les développeurs de magasins doivent tenir compte des propriétés du magasin et des problèmes liés à la mondialisation lors de l'élaboration de pages JSP.

Remarques relatives à la sécurité des beans de données

Une pratique de codage particulière pour l'utilisation des beans de données minimise la possibilité pour les utilisateurs malveillants d'accéder à votre base de données d'une manière non autorisée. Les parties Insérer, sélectionner, mettre à jour et supprimer des instructions SQL doivent être créées au moment du développement. Utilisez des inserts de paramètre pour recueillir des informations d'entrée d'exécution.

Voici un exemple d'utilisation d'un insert de paramètre pour collecter des informations d'entrée d'exécution :


select * from Order where owner =?

En revanche, vous devez éviter d'utiliser les chaînes d'entrée comme moyen de composer l'instruction SQL. Voici un exemple d'utilisation d'une chaîne d'entrée :


select * from Order where owner = "input_string"

Types de beans de données

Un bean de données est un bean Java qui est principalement utilisé pour fournir des données dynamiques dans les pages JSP. Il existe deux types de beans de données : les beans de données intelligents et les beans de données de commande.

Un bean de données intelligent utilise une méthode lazy fetch pour récupérer ses propres données. Ce type de bean de données peut fournir de meilleures performances dans les situations où toutes les données du bean d'accès ne sont pas nécessaires, puisqu'il récupère des données uniquement au besoin. Les beans de données intelligents qui nécessitent l'accès à la base de données doivent s'étendre à partir du bean d'accès pour le bean d'entité correspondant et implémenter l'interface com.ibm.commerce.SmartDataBean. Par exemple, le bean de données ProductDataBean étend le bean d'accès ProductAccessBean, qui correspond au bean de l'entité produit.

Certains beans de données intelligents ne nécessitent pas d'accès à la base de données. Par exemple, le bean de données intelligent PropertyResource récupère les données dans un regroupement de ressources plutôt que da,s la base de données. Lorsque l'accès à la base de données n'est pas nécessaire, le bean de données intelligent doit étendre la classe SmartDataBeanImpl.

Un bean de données de commande s'appuie sur une commande pour récupérer ses données et constitue un bean de données plus léger. La commande récupère tous les attributs du bean de données à la fois, que la page JSP les exige ou non. Par conséquent, pour les pages JSP qui n'utilisent qu'une sélection d'attributs du bean de données, un bean de données de commande peut être coûteux en termes de durée de performance. Bien que le contrôle d'accès puisse être appliqué au niveau du bean de données lors de l'utilisation du bean de données intelligent, ce n'est pas vrai pour le bean de données de commande. Utilisez uniquement le bean de données de commande si l'utilisation d'un bean de données intelligent n'est pas pratique.

Les beans de données de commande peuvent également s'étendre à partir de leurs beans d'accès correspondants et implémenter l'interface com.ibm.commerce.CommandDataBean.

Interfaces de beans de données

Les beans de données implémentent l'une ou l'autre des interfaces Java suivantes :

  • com.ibm.commerce.SmartDataBean.
  • com.ibm.commerce.CommandDataBean
  • com.ibm.commerce.InputDataBean (facultatif)

Chaque interface Java décrit la source de données à partir de laquelle un bean de données est rempli. En implémentant plusieurs interfaces, le bean de données peut accéder aux données à partir d'une variété de sources. Plus d'informations sur chacune des interfaces sont fournies ci-dessous.

Interface SmartDataBean

Un bean de données implémentant l'interface SmartDataBean peut récupérer ses propres données, sans commande de bean de données associée. Un bean de données intelligent s'étend habituellement à partir du bean d'accès d'un bean d'entité correspondant. Lorsqu'un bean de données intelligent est activé, le gestionnaire de beans de données appelle la méthode de remplissage du bean de données. A l'aide de la méthode de remplissage, le bean de données peut récupérer tous les attributs à l'exception de ceux des objets associés. Par exemple, si le bean de données s'étend depuis une classe de beans d'accès pour un bean d'entité, le bean de données appelle la méthode refreshCopyHelper. Tous les attributs du bean d'entité correspondant sont automatiquement remplis dans le bean de données intelligent. Toutefois, si le bean d'entité a des objets associés, les attributs de ces objets ne sont pas récupérés. Les principaux avantages de l'utilisation de beans intelligents sont les suivants :

  • La mise en œuvre est simple et il n'est pas nécessaire d'écrire une commande de bean de données.
  • Lorsque de nouveaux champs sont ajoutés au bean d'entité, des modifications du bean de données ne sont pas nécessaires. Une fois que le bean d'entité a été modifié, le bean d'accès doit être régénéré (à l'aide des outils de WebSphere Commerce Developer). Dès que le bean d'accès a été régénéré, tous les nouveaux attributs sont automatiquement disponibles pour le bean de données intelligent.
  • Les beans d'entité contiennent souvent des attributs représentant des objets associés. Pour des raisons de performance, le bean de données intelligent ne récupère pas automatiquement ces attributs. A la place, il est préférable de retarder la récupération de ces attributs jusqu'à ce qu'ils soient requis, comme indiqué dans le diagramme suivant :

    Cliquez sur le lien D pour sa description.

    Pour plus d'informations sur la mise en œuvre d'une récupération d'extraction fainéante, voir Récupération d'extraction fainéante.

Interface CommandDataBean

Un bean de données implémentant l'interface CommandDataBean récupère des données à partir d'une commande de beans de données. Un bean de données de ce type est un objet léger ; il s'appuie sur une commande de bean de données pour remplir ses données. Le bean de données doit implémenter la méthode getCommandInterfaceName() (telle que définie par l'interface com.ibm.commerce.CommandDataBean) qui renvoie le nom d'interface de la commande de bean de données.

Interface InputDataBean

Un bean de données implémentant l'interface InputDataBean récupère des données à partir des paramètres ou attributs de l'URL définis par la vue.

Les attributs définis dans cette interface peuvent être utilisés comme champs de clés primaires pour extraire des données supplémentaires. Lorsqu'une page JSP est appelée, le code de servlet JSP généré remplit tous les attributs qui correspondent aux paramètres de l'URL, puis active le bean de données en transmettant le bean de données au gestionnaire de beans de données. Le gestionnaire de beans de données appelle ensuite la méthode setRequestProperties() du bean de données (telle que définie par l'interface com.ibm.commerce.InputDataBean) pour transmettre tous les attributs définis par la vue. Il convient de noter que le code suivant est nécessaire pour que le bean de données soit activé :


com.ibm.commerce.beans.DataBeanManager.activate(data_bean, request, response)

data_bean est le bean de données à activer, request est un objet HTTPServletRequest et response est un objet HTTPServletResponse.

Activation des beans de données

Les beans de données peuvent être activés à l'aide des méthodes activate ou silentActivate qui se trouvent dans la classe com.ibm.commerce.beans.DataBeanManager. La méthode activate est une méthode d'activation complète dans laquelle l'événement d'activation n'est réussi que si tous les attributs sont disponibles. Même si un attribut n'est pas disponible, une exception est lancée pour l'ensemble du processus d'activation.

La méthode silentActivate ne lance pas d'exceptions lorsque les attributs individuels ne sont pas disponibles.

Appele les commandes du contrôleur à partir d'une page JSP

N'appelez pas les commandes du contrôleur à partir des pages JSP.

Récupération de données d'extraction fainéantes

Lorsqu'un bean de données est activé, il peut être rempli par une commande de bean de données ou par la méthode populate() du bean de données. Les attributs récupérés proviennent de l'entité correspondante du bean de données. Un bean d'entité peut également avoir des objets associés qui ont eux-mêmes un certain nombre d'attributs.

Si, lors de l'activation, les attributs de tous les objets associés ont été automatiquement récupérés, un problème de performance peut être rencontré. Les performances peuvent se dégrader à mesure que le nombre d'objets associés augmente.

Prenons un bean de données de produit qui contient un grand nombre de produits de vente croisée, de vente à plus haute valeur unitaire ou d'accessoires (objets associés). Il est possible de remplir tous les objets associés dès que le bean de données du produit est activé. Toutefois, remplir de cette manière peut nécessiter plusieurs requêtes de base de données. Si tous les attributs ne sont pas requis par la page, plusieurs requêtes de base de données peuvent être inefficaces.

En général, tous les attributs ne sont pas nécessaires pour une page. Par conséquent, un meilleur patron de conception consiste à effectuer une extraction fénéante telle qu'illustrée ci-dessous :


getCrossSellProducts () {
         if (crossSellDataBeans == null){
                 crossSellDataBeans= getCrossSellDataBeans();    
        }
         return crossSellDataBean;
          }