septembre
2008
Le Servlet Mapping dans un serveur Web permet de rediriger une URL vers un fichier acceptant une requête : une servlet ou une page JSP.
Par exemple la requête GET /wsedupassion/account/12 sera redirigé vers la page /wsedupassion/service/account/account.jsp. Cette page JSP sera capable de traduire le ’12’ pour récupérer le compte d’index 12 et enverra donc sous forme XML les informations lié à l’utilisateur 12.
<resource> <br />
<class>User</class> <br />
<id>12</id> <br />
<lastName>Zozol</lastName> <br />
<firstName>Nicolas</firstName> <br />
<url>http://www.edupassion.com</url> <br />
<subject>Computer Sciences</subject> <br />
<school>Robusta Web</school> <br />
</resource> <br />
Mais il y a dans le Domaine d’une école, des cas plus complexes que récupérer les informations d’un utilisateur. Par exemple récupérer l’ensemble des élèves du cours 24. On utilisera la requête :
GET /wsedupassion/course/24/students
Pour connaitre le professeur de ce groupe, ce sera :
GET /wsedupassion/course/24/teacher
Pour ajouter l’étudiant 18 à ce cours:
PUT /wsedupassion/course/24/students?idstudent=18
Et pour tout connaitre de ce cours :
GET /wsedupassion/course/24/
Et pour traiter ces requête, on utilisera les pages jsp :
– /wsedupassion/service/course/course.jsp
– /wsedupassion/service/course/teacher.jsp
– /wsedupassion/service/course/students.jsp
Le serveur (Apache, Glassfish, JBOSS, …) doit donc analyser très correctement l’uri pour dispatcher vers la bonne JSP. Voici un petit tutoriel pour les bases.
En première intention, j’avais prévu :
<servlet-mapping> <br />
<servlet-name>course</servlet-name> <br />
<url-pattern>/course/[0-9]+</url-pattern> <br />
</servlet-mapping> <br />
<servlet-mapping> <br />
<servlet-name>course_students</servlet-name> <br />
<url-pattern>/course/[0-9]+/students/*</url-pattern> <br />
</servlet-mapping> <br />
<servlet-mapping> <br />
<servlet-name>course_teacher</servlet-name> <br />
<url-pattern>/course/[0-9]+/teacher/*</url-pattern> <br />
</servlet-mapping> <br />
Mais les expressions régulières ne sont en fait absolument pas reconnues. Le serveur ne connnait que ‘*’ et privilégie le pattern selon 4 règles hierarchiques from outer space :
– Il préfère le pattern exact :/wsedupassion/account plutot que /wsedupassion/*
– Il préfère le pattern le plus long : /course/12/teacher/ plutot /course/*
– Il préfère les xyz/* (chemin) plutôt que *.xzy (type de fichier)
– Il choisit / si cette servlet racine existe
Et sinon le serveur envoit l’erreur 404( Source).
Mon fichier web.xml ressemblera donc à :
<servlet-mapping> <br />
<servlet-name>course</servlet-name> <br />
<url-pattern>/course*</url-pattern> <br />
</servlet-mapping> <br />
<servlet-mapping> <br />
<servlet-name>course_students</servlet-name> <br />
<url-pattern>/course/*/students/*</url-pattern> <br />
</servlet-mapping> <br />
<servlet-mapping> <br />
<servlet-name>course_teacher</servlet-name> <br />
<url-pattern>/course/*/teacher/*</url-pattern> <br />
</servlet-mapping>
De quoi faire hurler tout prof de fac tatillon sur ses expressions régulières. Mais c’est à priori suffisant pour fonctionner, et en plus intuitif. Que demande le peuple ? Apparemment plus, puisque ca ne fonctionne pas. Deux ‘*’, ca fait beaucoup.
/school/*/student/ n’est pas différencié de /school/*/teacher et renvoient d’ailleurs toutes les deux une erreur 4004 !
Pour dispatcher des uri un peu sophistiquées, il faudrait donc
– un servlet-mapping vers un dispatcher
– le dispatcher analyse l’uri
– on forward la requete vers une autre servlet
Je n’aime pas du tout ce mélange des genres : le servlet mapping a pour objet de rediriger, et devoir faire à la main une redirection dans le processus de redirection via des classes barbares comme un RequestDispatcher. Beurk ! Quelqu’un a mieux ?
Sinon, autant garder l’uri de la JSP. Et tant pis pour les dogmes !
Le serveur Resin (http://caucho.com/resin/doc/) permet de faire un servlet mapping à base d’expression régulière. J’espère que cela rentrera vite dans les todos de Sun.