Projets
Pages enfant
  • 3.3.2 Le fonctionnement

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Astuce
titleRelu

Relecture RB

Sommaire :

Sommaire
maxLevel3

...

Les points d'entrée

...

Bloc de code
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<aop:config>
 <aop:pointcut id="domainMethods"
  expression="execution(* org.esupportail.*.domain.DomainServiceImpl.*(..))" />
 <aop:advisor advice-ref="txAdvice" pointcut-ref="domainMethods" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="txManager">
 <tx:attributes>
  <tx:method name="add*" propagation="REQUIRED" />
  <tx:method name="delete*" propagation="REQUIRED" />
  <tx:method name="update*" propagation="REQUIRED" />
  <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
 </tx:attributes>
</tx:advice>

<bean id="domainService" class="org.esupportail.example.domain.DomainServiceImpl">
 <property name="daoService" ref="daoService" />
</bean>

...

En esup-commons V1 pour JSF, il fallait utiliser la servlet FacesServlet offerte par esup-commons (org.esupportail.commons.web.servlet.FacesServlet) qui gérait les sessions Hibernate. Ce n'est plus utile en esup-commons V2 grâce à l'utilisation de APO. La servlet utilisée est celle de JSF (dans web.xml) :

Bloc de code
<servlet>
 <description> The main servlet of the application. This class inherits
  from the MyFaces implementation and handles exceptions thrown for
  specific exception handling. <
 </description>
 <display-name>Faces Servlet</display-name>
 <servlet-name>Faces Servlet</servlet-name>
 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>

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

Par contre, avec JSF et JPA on peut faire une requête à la base de données dans la couche métier pour récupérer un objet et avoir besoin de naviguer des les fils de ce dernier au moment de l'affichage de la vue. Dans ce cas on peut avoir besoin de maintenir l'accès à la base de données pendant le temps du rendu de la vue afin d'éviter les erreurs de type LazyLoadingException. Pour ce faire on utilise un listerner particulier (dans le web.xml) :

Bloc de code
<filter>
 <display-name>JPA Filter</display-name>
 <filter-name>JPA Filter</filter-name>
 <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
 <filter-name>JPA Filter</filter-name>
 <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

...

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) :

Bloc de code
      <portlet>
                <portlet-name>esup-example</portlet-name>
                <display-name xml:lang="fr">esup-example</display-name>
                <portlet-class>javax.portlet.faces.GenericFacesPortlet</portlet-class>

...

En esup-commons V1, il fallait utiliser la servlet XFireServlet offerte par esup-commons (org.esupportail.commons.web.servlet.XFireServlet) qui gérait les sessions Hibernate. Ce n'est plus utile en esup-commons V2 grâce à l'utilisation de APO.

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.