TITRE

25/02/2010

Jersey est un framework (JAX-RS, JSR 311) permettant de mettre en place l'architecture REST.

L'exemple ci-dessous montre comment fournir une représentation HTML d'une ressource, en utilisant une page JSP. Le propos ici n'est pas de faire une introduction à l'architecture REST, mais de montrer comment, avec Jersey, il est possible d'utiliser une technologie éprouvée, les JSP, pour fournir une représentation HTML d'une ressource. L'exemple est bâti autour d'un objet métier, un Livre et d'une ressource définissant le livre, LivreRessource. La représentation utilisera le type Mime défini pour le HTML, à savoir text/html.

Ainsi, l'architecture très simple de cet exemple est construite autour de trois compostants :

  1. un package modele contenant l'objet métier
  2. un package DAO qui permet d'accéder aux données et de remplir l'objet métier
  3. un package ressource contenant la ressource définie et qui accède à l'objet métier

Le modèle est composé d'un seul POJO, le livre :

public class Livre { 
    private String isbn; 
    private String titre; 
    private String auteur; 
}

Le DAO permet d'accéder aux données concernant le livre en spécifiant son code ISBN.

public class LivreDAO { 
    public Livre getLivre(String isbn){ 
}

La ressource est définie par la classe LivreRessource.

public class LivreRessource { 
}

Jersey permet de construire des ressources REST via de simples annotations java. Pour cette ressource, il faut définir

Dans notre cas, il s'agit de l'URL /livre/isbn/123 pour obtenir une représentation de l'information. Le type MIME supporté est le HTML

@Path("/livre/")<
public class LivreRessource {
    @GET
    @Produces("text/html")
    @Path("/isbn/{isbn}")
    public Viewable getLivreHTML(@PathParam("isbn") String isbn) {
    }
}

Dans cet exemple, l'URL est définie en 2 parties. La première est valable pour toutes les méthodes mises en oeuvre par la classe, ici /livre/ qui est l'URL de base. Puis, la deuxième partie définie le complément d'URL qu'implémente la méthode. Ainsi, l'URL complète sera /livre/isbn suivi d'un numéro d'ISBN.

La méthode d'accès à la ressource définie par cette classe est GET, ainsi la ressource ne sera pas modifiée.

Le type de représentation est HTML (text/html), c'est sous cette forme que la ressource sera renvoyée au demandeur (un navigateur web, un programme ajax, un programme classique, etc.)

Pour fournir la représentation HTML, une page JSP reste une technologie éprouvée. Ainsi, au lieu de construire dans la méthode de la ressource le texte html à envoyer, le corps de la méthode se contente de remplir un objet métier contenant les informations. Cet objet est alors fourni à une page JSP qui va se charger de la mise en forme.

public Viewable getLivreHTML(@PathParam("isbn") String isbn) {
    LivreDAO dao=new LivreDAO();
    Livre livre=dao.getLivre(isbn);
    return new Viewable("livre",livre);
}

La méthode renvoie un objet Viewable qui se base sur la page jsp identifiée par le nom "livre", passé en argument.

Jersey met en place une convention pour faciliter ce mécanisme. La ressource est définie par une classe Java qui se trouve dans un package donné :

package org.opikanoba.biblio.ressource;
public class LivreRessource

La page jsp ainsi identifiée par le nom "livre" doit se trouver dans le projet web à l'endroit défini par le nom du package suivi du nom de la classe suivi du nom de la page JSP : org/opikanoba/biblio/ressource/LivreRessource/livre.jsp

Dans un projet eclipse, le répertoire doit être créé dans le répertoire WebContent.

Par convention, l'objet transmis à la page JSP, est contenu dans le bean nommé it

<h1> Livre ${it.isbn}</h1>
<ul>
<li>Titre : ${it.titre}</li>
<li>Auteur : ${it.auteur}</li>
</ul>

Enfin, la dernière partie de cet exemple concerne la configuration de la application web pour que la servlet Jersey se mette en route lors de l'appel de la ressource. Cette configuration se passe dans le fichier web.xml.

<servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>com.sun.jersey.config.feature.Redirect</param-name>
    <param-value>true</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/res/*</url-pattern>
</servlet-mapping>