Sunday, 17 September 2006
Astuce DWR -- encapsulez getSession()
Un des avantages de DWR, c'est que côté Java, son
utilisation est invisible. Invisible mis à part l'emploi des
méthodes statiques d'une classe glorieuse,
uk.ltd.getahead.dwr.WebContextFactory, qui permet aux
Listeners DWR de communiquer avec la session et ServletContext de
l'application web. Sans cette classe, la gestion de l'état de
l'application serait impossible (ou très difficile en tout cas).
Il en resulte que nous retrouvions
WebContextFactory.get().getSession() dans pratiquement
toutes les méthodes de toutes les classes Listener (comme nous
appelions les Creator déclarés dans
dwr.xml).
L'expérience a pourtant montré que d'appeler
directement WebContextFactory.get().getSession() dans les Listener n'est
pas une bonne pratique. Du moins, dans notre projet on a
découvert que ça nous enlevait de la
flexibilité : en l'occurance, on voulait effectuer un
contrôle supplementaire sur la session avant d'y accéder
(genre AOP), pour gérer plus proprement l'expiration des
sessions, par exemple.
Au lieu donc de vérifier dans chaque methode de chaque
Listener qui utilise la session, que la session n'est pas
invalidée (!!), on a centralisé la récuperation de
la session dans un seul endroit,
AJAXListener.getSession() (AJAXListener est la classe
mère des listeners dans notre application, réunissant
les fonctions d'utilité globale). Là on peut mettre le
code pour gérer les sessions expirées (dans notre cas,
en levant une fille de RuntimeException maison pour laquelle on a
créé une gestion particulière avec
DWREngine.setErrorHandler()).
Cette encapsulation a en plus le bénéfice que le code
Java ne fait référence à dwr.jar que dans
une seule méthode, au lieu de plusieurs douzaines, ce qui rend
l'application moins dépendante de la couche technique sur
laquelle elle répose.




