avril
2006
Suite à mon précedent article à propos de DWR, je vais expliquer comment liér DWR avec le framework Spring.
Configuration de Spring
La première étape est de configurer Spring pour lui fournir non seulement les Beans qui seront utilisés dans votre site web, mais aussi le(s) bean(s) qui devront être accessible en Ajax, ainsi que le bean qui va remplacer la servlet de DWR.
En effet, toutes les requêtes passeront par le dispatcher de Spring, et DWR ne sera qu’un controlleur Spring dans notre application.
Le fichier web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/ajax-beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet id="dispatcher">
<servlet-name>dispatcher</servlet-name>
<display-name>dispatcher</display-name>
<description>Dispatcher Servlet</description>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
Dans cet exemple, tout les requêtes .htm et tout les requêtes sur le répertoire /dwr/ seront passées à la servlet de Spring.
Notez l’utilisation d’un listener du framework Spring, ainsi qu’un paramètre de contexte contextConfigLocation.
En fait, ceux ci ne sont pas absolument nécessaire. Ils servent à spécifier quels fichiers de configuration Spring doit utiliser pour charger les Beans de l’application.
Sans ces informations, Spring n’utiliserait que le fichier de configuration de la servlet ( dispatcher-servlet.xml ).
On aurait très bien pu mettre tout les Beans dans ce fichier, dans cet exemple ca n’aurait pas été fort génant.
Mais dans ces applications plus importantes, il peut être utile de faire plusieurs fichiers de configuration :
- Un pour les services
- Un pour les DAO
- Un pour les Bean Ajax
- …
Le fichier dispatcher-servlet
C’est dans ce fichier que la liaison DWR / Spring va être réellement créée, via la définition d’un controlleur DWR.
<bean id="mainController" class="be.hikage.test.mainController"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/*.htm">main</prop>
<prop key="/**/*">dwrController</prop>
</props>
</property>
</bean>
<bean id="dwrController" class="org.springframework.web.servlet.mvc.ServletWrappingController">
<property name="servletClass">
<value>uk.ltd.getahead.dwr.DWRServlet</value>
</property>
<property name="initParameters">
<props>
<prop key="debug">true</prop>
</props>
</property>
</bean>
</beans>
Tout d’abord, comme on peut le voir, on défini un bean dwrController, en utilisant la classe ServletWrappingController du framework Spring. Cette classe permet en fait d’intégrer n’importe quel servlet dans spring et de l’utiliser comme un controlleur Spring.
Il faut juste spécifier la classe de la servlet cible, via la propriété servletClass.
Et l’on peut fournir des paramètres d’initialisation, ici on spécifie que l’on est en mode débug pour DWR, pour rappel cela spécifie à DWR qu’il doit fournir une interface web pour effectuer des test sur les Bean Ajax.
Ensuite on lie un controlleur main a tout les url .htm tandis qu’on lie le controlleur DWR à toutes les requêtes de tout les sous répertoires.
En pratique cela veut dire que les urls
- http://localhost/monapp/something/index.html
- http://localhost/monapp/otherthing/index.html
- http://localhost/monapp/dwr/index.html
passeront par le controlleur de DWR.
Pour être sur de ne pas limiter les autres controlleurs, il faut mettre la ligne pour le controlleur DWR tout en dernier dans le mapping.
RQ : J’ai cherché un moyen de lier dwr uniquement sur le répertoire /dwr/*, mais je n’ai encore jamais réussi. Si quelqu’un réussi, je serais intéréssé de connaitre le méthode.
Fichier ajax-Beans.xml
Ici rien de compliqué, juste une définition des Beans selon la syntaxe de Spring.
Par exemple, on défini un Bean qui permettrait de travailler sur des utilisateurs ( via un DAO )
<bean id="userAjaxService" class="com.developpez.hikage.dwr.UserAjax">
<property name="userDAO" ref="userHibernateDAO"/>
</bean>
</beans>
Dans ce cas, on ajoute le DAO via l’injection de dépendance grâce à Spring. Dans cet article, le DAO n’est pas présenté mais il devrait lui aussi être défini dans Spring de la même manière.
Configuration de DWR
Passons maintenant à la configuration de DWR :
<allow>
<create creator="spring" javascript="userService">
<param name="beanName" value="userAjaxService"/>
</create>
</allow>
</dwr>
Par rapport à l’utilisation de DWR seul, les changements sont donc :
- Remplacement du créateur new par la créateur Spring
- Remplacement du paramètre class par un paramètre beanName qui prendra comme valeur l’id du bean dans la configuration Spring
Dès lors, on peut redeployer notre application web, et tester via l’url http://localhost/monapp/dwr/index.html, et si tout va bien normalement un Bean userService devrait être présent dans la liste.