Projets
Pages enfant
  • 3.3.2 Le fonctionnement

Vous regardez une version antérieure (v. /wiki/spaces/PROJ/pages/100663540/3.3.2+Le+fonctionnement) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 8) afficher la version suivante »

A compléter

Paragraphe AOP

Sommaire :


Les points d'entrée

En esup-commons V1 on devait modifier les différent points d'entrée de l'application (FacesServlet, FacesPortlet, XFireServlet). Cette approche avait 2 désavantages  :

  1. On était obligé de maintenir ces points d'entrées et il fallait reproduire ce travail si on voulait avoir un nouveau point d'entrée (servlet d'un framework REST par exemple)
  2. Ce qui était fait l'était notamment pour JSF (FacesServlet, FacesPortlet) ce qui rendait esup-commons V1 très dépendant de la technologie utilisée pour la vue.

C'est la raison pour laquelle esup-commons V2 utilise une technologie radicalement différente qui est l'utilisation de AOP (aspect-oriented programming via Spring AOP) pour gérer les connexions aux bases de données et les transactions.

Déclaration AOP

????

Déploiement en servlet

En déploiement servlet, il faut utiliser la servlet FacesServlet offerte par esup-commons, et qui gère les sessions Hibernate et les exceptions (cf /webapp/WEB-INF/web.xml) :

<servlet>
  <display-name>Faces Servlet</display-name>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>
    org.esupportail.commons.web.servlet.FacesServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
</servlet-mapping>

Déploiement en portlet

En mode portlet, il faut utiliser la servlet PortletServlet offerte par esup-commons, et qui gère également les sessions Hibernate et les exceptions (cf /webapp/WEB-INF/web.xml) :

<servlet>
  <display-name>esup-application</display-name>
  <servlet-name>esup-application</servlet-name>
  <servlet-class>
    org.esupportail.commons.web.portlet.PortletServlet
  </servlet-class>
  <init-param>
    <param-name>portlet-class</param-name>
    <param-value>
      org.esupportail.commons.web.portlet.FacesPortlet
    </param-value>
  </init-param>
  <init-param>
    <param-name>portlet-guid</param-name>
    <param-value>esup-diskquota.esup-diskquota</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>esup-application</servlet-name>
  <url-pattern>/esup-application/*</url-pattern>
</servlet-mapping>

Web services

En mode web service, il faut utiliser la servlet XFireServlet offerte par esup-commons, qui gère également les sessions Hibernate et les exceptions (cf. /webapp/WEB-INF/web.xml) :

<servlet>
  <servlet-name>xfire</servlet-name>
  <servlet-class>
    org.esupportail.commons.web.servlet.XFireServlet
  </servlet-class>
</servlet>


<servlet-mapping>
  <servlet-name>xfire</servlet-name>
  <url-pattern>/xfire/*</url-pattern>
</servlet-mapping>

Cela implique que les opérations effectuées soient unitaires, au sens transactionnel.

Accès batch

Les accès batch sont traités en détail dans un chapitre dédié.

Voir : 11 Commandes batch

La configuration de l'accès aux données

Les points d'entrées ci-dessus utilisent la classe statique DatabaseUtils qui, pour pouvoir gérer plusieurs connexions à des bases de données, s'appuie sur un « magasin de gestionnaires de bases  de données ».

Ce magasin, qui recense les gestionnaires de bases de données, est un bean nommé databaseManagerStore, qui doit implémenter l'interface DatabaseManagerStore. Une seule implémentation est fournie de base (BasicDatabaseManagerStoreImpl), elle doit permettre de répondre à toutes les demandes.

On trouvera par exemple dans le fichier /properties/dao/dao.xml :

<bean
    id="databaseManagerStore"
    class="[...].services.database.BasicDatabaseManagerStoreImpl" >
  <property name="databaseManagers">
    <list>
      <ref bean="databaseManager1" />
      <ref bean="databaseManager2" />
    </list>
  </property>
</bean>

Le magasin recense ici deux gestionnaires de bases de données (databaseManager1 et databaseManager2).

Les gestionnaires de bases de données sont chargés de l'accès à une base de données ; ce sont également des beans, qui doivent implémenter l'interface DatabaseManager. Les méthodes de cette interface sont :

  • void open(servletContext) : ouvre la connexion à la base de données et commence une transaction ; cette méthode est utilisée en mode web.
  • void open() : ouvre la connexion à la base de données et commence une transaction ; cette méthode est utilisée en mode batch.
  • void close(boolean) : valide (commit) ou invalide (rollback) la transaction courante et ferme la connexion.
  • void test() : teste la connexion; cette méthode est utilisée par la tâche ant test-database.
  • boolean isUpdatable() : indique si le gestionnaire est capable de créer et mettre à jour la structure de la base de données (on pourra dans ce cas appeler les méthodes create() et update()).
  • void create() : crée les structures de la base de données.
  • void update() : met à jour les structures de la base de données.

    Utiliser _esup-commons_ sans base de données

    Les utilisateurs ne s'appuyant sur aucune base de données devront utiliser l'implémentation EmptyDatabaseManagerStoreImpl pour le bean databaseManagerStore.

L'accès aux données depuis du code Java

Le service métier (le bean domainService) accède aux données via le service d'accès aux données (le bean daoService). Il est à la charge des implémentations de l'interface DaoService de récupérer les sessions courantes des bases données et d'effectuer les requêtes nécessaires.

La méthode utilisée par les implémentations Hibernate est détaillée dans la partie suivante.

  • Aucune étiquette