Représentation HTML d'une ressource REST avec Jersey et une JSP

25/02/2010

Jersey permet de créer des projets Java utilisant des ressources REST. L'utilisation d'une page JSP permet alors de simplifier la mise en oeuvre des représentations HTML. Petit exemple illustré pour y parvenir...

Jersey est un framework Java (respectant 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 (au sens REST), qui accède à l'objet métier et qui en fournit une représentation

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 à l'aide de simples annotations java. Pour cette ressource, il faut définir

Dans notre cas, il s'agit de l'URL /livre/isbn/123 qui permettra d'obenir une représentation de l'information. HTML

@Path("/livre/")<
public class LivreRessource {
    @GET
    @Produces("text/html")
    @Path("/isbn/{isbn}")
    public Viewable getLivreHTML(@PathParam("isbn") String isbn) {
    // code permettant de retourner la representation
    }
}

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/. C'est l'URL de base. Puis, la deuxième partie définit 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 pourra pas être 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 basée sur le package de la classe et sur son nom. Cette convention indique alors l'endroit où la JSP sera cherchée par défaut dans le classpathde l'application web. pour faciliter ce mécanisme. La mise en oeuvre de la ressource est une classe Java (B) qui se trouve dans un package donné (A):

package org.opikanoba.biblio.ressource;  // A
public class LivreRessource              // B

La page jsp ainsi identifiée par le nom "livre" (C) doit se trouver dans le projet web à l'endroit défini par A+B+C+.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>
exemple de requete

Enfin, pour information, voici comment est configurée la servlet Jersey pour qu'elle soit active lors de l'appel de la ressource. Cette configuration se passe dans le fichier web.xml (cette configuration est assez simple à trouver sur Internet dans les aides sur Jersey).

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