IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Robusta Web Library : Simplifiez REST et Ajax


précédentsommairesuivant

III. JSP et JSF

III-A. Sites web avec JSP et JSF

S'il est parfaitement possible de travailler avec des JSP pour contrôler les requêtes, utiliser JAX-RS est à mon avis largement préférable. Cependant on n'a pas toujours le choix, et JSP permet également d'écrire plus proprement du xml. La construction de tags spécialisés est de plus un outil puissant.

Notons que les outils de ce chapitre sont également valables pour JSF. Si vous souhaitez utiliser des composants JSF pour la vue, alors votre site web peut être RESTful et utiliser Robusta.

III-A-1. Quand utiliser JSP plutôt que JAX-RS ?

JSP a été créé pour éviter que les servlets n'envoient trop souvent out.println(« some html with \ » everywhere"). JSF en est une évolution majeure. On utilisera donc JSP par ordre de préférence pour :

  • afficher une page Web, sans Ajax. La méthode HTTP sera toujours GET ;
  • afficher le résultat d'un formulaire HTML sans Ajax. La méthode sera en général POST ;
  • afficher un fragment de page web par Ajax, pour gérer l'affichage par Java plutôt que par Javascript ;
  • faire un service Web : JAX-RS est interdit dans le projet ou le XML produit est complexe.

J'utilise par exemple JSP pour un service Web sur Google App Engine, car le Container fourni par Google a des restrictions incompatibles avec Jersey. Il existe un « patch » non officiel qui fonctionne, mais avec des exceptions par moment.

III-A-2. La structure avec JSP

L'utilisateur envoie une requête en tapant une adresse dans son navigateur, ou par Ajax. Cette requête arrive dans une page JSP spécifique, comportant un javabean comme ResourceController et le tag <robusta:request/> . Ce javabean doit implémenter l'interface ResourceController, et peut étendre la classe JspResourceController.

Image non disponible
Structure générale d'une page ou d'un service REST par JSP

III-A-3. Le tag <robusta:request> et son JspResourceContoller

Supposons que notre Espion ait supprimé l'ennemi numéro 1. Place au suivant, une mise à jour est nécessaire en faisant une requête PUT vers une page jsp.

 
Sélectionnez
<!--/*
PUT /mywebapp/resources-jsp/ennemi1.jsp
Authorization : James Bond
<idEnnemyNumero1>14</idEnnemyNumero1>
*/-->
<html>
    <head>
        <title>Test PUT avec Ajax vers JSP</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="/mywebapp/lib/js/prototype.js"></script>
        <script type="text/javascript" src="/mywebapp/lib/js/robusta.js"></script>
    </head>
    <body>
        <div id="message" style="background-color:yellow;font-weight:bold"></div>
    </body>
    <script type="text/javascript">
        var url ="/mywebapp/resources-jsp/ennemi1.jsp?_method=PUT";//à cause du postBody, le param est obligatoire.
        var postBody="<idEnnemyNumero1>14</idEnnemyNumero1>";
        new Ajax.Request(url, {
            method: 'PUT',
            contentType :'application/xml;charset=UTF-8',
            postBody : postBody,
            requestHeaders:$H({Authorization:"James Bond"}),
            onSuccess: function(transport) {              
                //dépend de ce que renvoie le serveur : xml ou html ?
            }
        });
    </script>
</html>

La requête doit être analysée, et un tag JSP fourni par Robusta permet de décortiquer cette requête. Essayons tout d'abord la requête PUT vers ce tag associé au JspResourceController :

 
Sélectionnez
<?xml version="1.0" encoding="UTF-8"?>

<%@page contentType="application/xml" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.robustaweb.com"  prefix="robusta" %>

<jsp:useBean id="controller" class="robusta.rest.implementations.JspResourceController" scope="request" />
<robusta:request controller="${controller}"/>
<root>
    <method>${controller.method}</method>
    <uri>${controller.uri}</uri>
    <authorizationValue>${controller.authorizationValue}</authorizationValue>
    <postBody>${controller.postBody}</postBody>
    <remoteIp> ${controller.remoteIpAdress}</remoteIp>
    <isGet>${isGet}</isGet>
    <isPost>${isPost}</isPost>
    <isPut>${isPut}</isPut>
    <isDelete>${isDelete}</isDelete>
</root>
<robusta:response controller="${controller}"/>

Si on exécute la requête Ajax dans cette page web vide, Firebug nous informe :

Image non disponible

La console de Glassfish (ou Tomcat, JBOSS…) va également nous aider lorsque le Tag est mis en mode debug.

Image non disponible

III-A-4. Exemple avec un fragment HTML

Envoyons la requête PUT sur la page /mywebapp/resources-jsp/ennemi1.jsp. Cette page JSP va appeler un ResourceController spécifique que nous appellerons ici Ennemi1Controller.

III-A-4-a. Le code Ajax

On reprend la même page HTML précédente :demoPUTversJSP.html. Le code va insérer le fragment HTML dans le div message.

 
Sélectionnez
onComplete: function(transport) {
                    $("message").update(transport.responseText);
                }
III-A-4-b. La page JSP

Voici le code qui comporte quatre parties : l'entête, le travail sur le ResourceController, l'affichage du résultat selon la méthode, et le statusCode de la réponse.

 
Sélectionnez
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<%@ taglib uri="http://www.robustaweb.com"  prefix="robusta" %>

<jsp:useBean id="controller" class="jspcontrollers.Ennemi1Controller" scope="request" />
<jsp:setProperty name="controller" property="*" />
<robusta:request controller="${controller}"/>

<%-- GET : --%>
<c:if test="${isGet}"><!-- Nothing --></c:if>

<%-- POST : --%>
<c:if test="${isPost}"><!-- Nothing --></c:if>

<%-- PUT : --%>
<c:if test="${isPut}">
    <c:choose>
        <c:when test="${controller.updateOK}">
            <div> Some HTML saying next <a href="http://www.007.com">James Bond</a> Movie will show a new Ennemy with codeName:${controller.nextVillain} </div>
        </c:when>
        <c:otherwise>
            <x:parse var="error" doc="${controller.classicFailure}"/>
            <div>Error : <x:out select="$error//message"></x:out> </div>
        </c:otherwise>
    </c:choose>
</c:if>

<%-- DELETE : --%>
<c:if test="${isDelete}"><!-- Nothing --></c:if>

<robusta:response controller="${controller}"/><!-- Send the status from the controller -->
III-A-4-c. Le ResourceController

Le ResourceController dérive de JspResourceController et implémente une des quatre fonctions de contrôle parmi isReadOK, isCreateOK, isUpdateOK et isDeleteOK.

L'interaction avec JSP suppose la création de fonctions getter/setter. Les setters seront utiles si la requête contient des paramètres url classiques.

 
Sélectionnez
public class Ennemi1Controller extends JspResourceController {

    Integer nextVillain;

    @Override
    public boolean isUpdateOK() {
        try {
            if (getAuthorizationValue().contains("Bond")) {
                //Business Code
                nextVillain=new VsxSax().getSimpleInteger(getPostBody(),"idEnnemyNumero1");

            } else {
                throw new UnauthorizedException("User :" + getAuthorizationValue() + " is not accepted");
            }           

            return true;
        } catch (Exception ex) {
            setClassicFailure(ex);
            return false;
        }
    }

    public Integer getNextVillain() {
        return nextVillain;
    }    
}
III-A-4-d. Résultats

Si l'utilisateur utilise dans sa requête le header Authorization : « James Bond », alors cette requête Ajax aura grâce à transport.responseText à disposition le fragment HTML.

Image non disponible

Sinon ce sera le fragment :

 
Sélectionnez
<div>Error : http statusCode : 401 ; message :User : S.M.E.R.S.H is not accepted </div>

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Nicolas Zozol. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.