JSP

Java Server Pages pour afficher les pages HTML

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Java peut être utilisé avec succès pour développer les applications web. Mais dans ce cas, pour la couche de présentation, on n'utilisera pas Swing mais une de multiples solutions de templating. L'une d'elles s'appelle Java Server Pages (JSP).

Lancée en 1999 par Sun, cette solution ressemble au PHP qui lui-même en partie une couche de "transition" entre la partie serveur et navigateur. Elle est basée sur les balises statiques (mise en forme) et les balises dynamiques (traitement d'une donnée, par exemple : des boucles).

Conventions JSP

JSP, comme tous les membres de la famille Oracle, est bien documenté. Les conventions d'utilisation doivent aider les développeurs frontend et backend à collaborer ensemble. Voici certains standards du JSP (la liste complète se trouve sur le site offciel de Java) :

  1. Commentaires d'ouverture
    <%-- 
      - Author(s):
      - Date:
      - Copyright Notice:
      - @(#)
      - Description: 
      --%>
    
    Ce code permet de documenter la page. Il sera visible uniquement du côté serveur. L'internaute ne le verra pas dans son navigateur.
  2. Directives JSP comprises entre <%@ et %> Tout comme dans HTML ou XML, JSP se base sur des balises. Contrairement à ces langages des tags, il s'agit ici des directives. Ce sont des bouts de code qui permettent d'exécuter une action, comme par exemple importer un package Java ou indiquer si la session doit être créée pour une page donnée.
    <%@ page    eeesession="false"
                import="java.util.List,java.util.ArrayList"
    %>
    
  3. Les déclarations entre <%! et %> En JSP, comme en PHP, on peut déclarer des méthodes et des variables à l'intérieur de la page. Cependant cette pratique est très contestée et plutôt déconseillée.
    <%! private int hitCount; %>
    <%! public int getHitCount() {
           return hitCount;
        }
    %>
    
  4. Indentation L’indentation du code doit être faite avec les espaces blanches et non pas des tabulations. Une indentation doit correspondre à 4 espaces blanches, comme ici :
    <%@ page    eeeattribute1="value1" 
                attribute2="value2"
                attributeN="valueN" 
    %>
    <myTagLib:forEach var="client" items="${clients}">
        <myTagLib:mail value="${client}" />
    </myTagLib:forEach>
    


    Parfois le code JSP doit être mélangé avec HTML. Il est alors plus lisible d'utiliser les mêmes règles d’indentation pour les deux technologies :
    <table>
        <%  if ( tableHeaderRequired ) { %>
            <tr>
                <th>Last Name
                <th>First Name
            </tr>
        <%  } %>
        <c:forEach var="customer" items="${customers}">
            <tr>
                <td></td>
                <td></td>
            </tr>
        </c:forEach>
    </table>
    
  5. JSP Scriptlets
    L'utilisation des scriptlets devrait être limitée au minimum. Un scriptlet est un block de code Java compris entre les balises <% et %> . Il est conseillé de remplacer leur utilisation par JSP Standard Tag Library (JSTL). Cette dernière s'inscrit mieux dans la logique View de l'architecture Model-View-Controller (MVC).

    Voici l'exemple d'un scriptlet et son homologue en librairie des tags JSP :
    // scriptlet 
    eee<table>
        <%  for ( int i=0; i
            <tr>
                <td><%= customers[i].getLastName() %></td>
                <td><%= customers[i].getFirstName() %></td>
            </tr>
        <%  } %>
    </table>
    // Standard Tag Library
    <table>
        <c:forEach var="customer" items="${customers}">
            <tr>
                <td></td>
                <td></td>
            </tr>
        </c:forEach>
    </table>
    

    En plus, aucune exécution d'une action ne devrait pas se retrouver dans le code d'une page JSP. Donc à la place d'écrire une connexion à la base de données et une récupération des éléments, on devrait encore une fois se référer au JSTL, comme sur cet exemple :

    <myTags:dataSource
        name="customerDS"
        table="customer" 
        columns="name"
        var="result" />
    <c:forEach var="row" items="${result.rows}">
        <c:out value="${row.name}" />
        <br />
    </c:forEach>
    
  6. Le nommage

    Les noms des fichiers devraient commencer par une minuscule. S'il est composé de plusieurs mots, les mots suivants doivent commencer par une majuscule. On devrait également éviter les noms avec un seule verbe. Par contre un seul substantif est admis.

    L'écriture camel-case s'applique aussi aux noms des tags (par exemple MyTags ou forEach déjà cités).

JSP Standard Tags Library

Comme évoqué ci-dessus, JSTL est une collection des balises permettant d'éviter d'écrire le code Java à l'intérieur des fichiers de vue. Pour des personnes familiarisées avec le monde du PHP, elle ressemble un peu à des tags dans les systèmes de templates (Smarty, Twig). Le code PHP y est remplacé par des éléments correspondants (foreach => {foreach}, echo $variable => {$variable}), jugés plus faciles à apprendre pour les développeurs frontend.

Voici un exemple d'une page avec l'utilisation des balises JSTL :

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!-- simple set of value -->
<c:set var="bookId" value="23"/>

Book has id : ${bookId}.

<!-- exemple of collection reading -->
<jsp:useBean id="countries" class="java.util.HashMap">
    <%
        countries.put("pl", "Poland");
        countries.put("fr", "France");
        countries.put("en", "England");
    %>
</jsp:useBean>
 
<table border="1" cellspacing="5">
    <thead>
        <tr>
            <th>ISO code</th>
            <th>Full name</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${countries}" var="country">
            <tr>
	            <th>${country.key}</th>
            	<th>${country.value}</th>
            </tr>
        </c:forEach>
    </tbody>
</table>
<hr />
<!-- if-else case -->
<c:choose>
    <c:when test="${bookId == '21'}">
    	Value of bookId is 21.
    </c:when>
    <c:otherwise>
        Value of bookIs isn't 21.
    </c:otherwise>
</c:choose>
<hr />
<!-- simple if case -->
<c:if test="${bookId == '21'}">
    Book's id is 21.
</c:if>
<!-- containts test for String value -->
<c:if test="${fn:contains(bookId, '23')}">
    Found 23 string
</c:if>

Des inconvénients JSP

JSP, malgré d'être une technologie flexible, possède quelques inconvénients. La majorité d'entre eux résultent de sa mauvaise utilisation :

  1. Maintenabilité

    Si les possibilités JSP sont poussées trop loin et le code opérationnel de Java se trouve dans les templates, la maintenabilité de toute l'application devient plus compliquée. Il est donc important de surveiller ce qu'on met dans les fichiers .jsp afin d'éviter les problèmes avec l'évolution du programme.

  2. Difficulté d'approche

    Cet argument est bien connu dans le monde du développement web où les compétences frontend et backend ne se croisent pas forcément toujours dans les profils. C'est pourquoi pour certains développeurs frontend l'apprentissage du JSP qui, grâce à ses nombreuses fonctions, peut vite tourner au cauchemar. Pour lui éviter de souffrir trop, le développeur backend doit effectuer le plus grand nombre d'opérations au niveau des couches Controller.

Bartosz KONIECZNY Vues

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Un scroll avec dialog box de jQuery UI ?

Si vous voyez une barre horizontale qui apparaît après l'ouverture d'un dialog box sous IE8, il peut s'agit d'un problème de ce module pour le navigateur en question. Pour y remedier, on peut utiliser la méthode open() et forcer le navigateur à cacher cette bare. Prenons un exemple vivant :

var dialogBox = $(href).dialog({ autoOpen: false, closeOnEscape: true,
  open: function() {  
        $('body').css('overflow-x', 'hidden');
  },
  close: function() {
        $('body').css('overflow-x', 'auto');  
  }
});  
dialogBox.dialog("open");