Article complet: Servlet-Mapping : Des expressions pas très régulières

22/09/2008

Permalink 20:03:55, Catégories: RESTful, Astuce du Jour, Java, Web, 664 mots   French (FR) , Nicolas Zozol

[Java] Servlet-Mapping : Des expressions pas très régulières

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> 
  <class>User</class> 

  <id>12</id> 
  <lastName>Zozol</lastName> 

  <firstName>Nicolas</firstName> 
  <url>http://www.edupassion.com</url> 

  <subject>Computer Sciences</subject> 
  <school>Robusta Web</school> 

</resource> 

[Suite:]


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> 

  <servlet-name>course</servlet-name> 
  <url-pattern>/course/[0-9]+</url-pattern> 

</servlet-mapping> 
<servlet-mapping> 

  <servlet-name>course_students</servlet-name> 
  <url-pattern>/course/[0-9]+/students/*</url-pattern> 

</servlet-mapping> 
<servlet-mapping> 

  <servlet-name>course_teacher</servlet-name> 
  <url-pattern>/course/[0-9]+/teacher/*</url-pattern> 

</servlet-mapping> 


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> 

  <servlet-name>course</servlet-name> 
  <url-pattern>/course*</url-pattern> 

</servlet-mapping> 
<servlet-mapping> 

  <servlet-name>course_students</servlet-name> 
  <url-pattern>/course/*/students/*</url-pattern> 

</servlet-mapping> 
<servlet-mapping> 

  <servlet-name>course_teacher</servlet-name> 
  <url-pattern>/course/*/teacher/*</url-pattern> 

</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 !

Social Bookmarking:

                                     

Commentaires:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: Nicolas Zozol [Membre] · http://www.edupassion.com
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.
Permalien 22/09/2008 @ 21:48

Vous devez être identifié pour poster un commentaire.

Liste des blogs

Robusta : Java & RESTful Web Services

Il s'agit d'un Blog sur les meilleures utilisations de REST dans un environnement JAVA. Le Blog contient également du contenu sur la technologie Ajax et également un journal de bord sur le développement du site pédagogique http://www.Edupassion.com

Nicolas Zozol - Edupassion.com

Catégories


Rechercher

<  Février 2012  >
Lun Mar Mer Jeu Ven Sam Dim
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web