web-dev-qa-db-fra.com

JSTL vs JSP Scriptlets

Je veux que quelqu'un explique certains points de la réponse étonnante de BlausC dans cette question .

Il a dit que les scriptlets présentaient certains inconvénients, à savoir:

  1. Réutilisation: vous ne pouvez pas réutiliser les scriptlets. Ma question: comment pourrais-je réutiliser le code JSTL?

  2. Remplaçabilité: vous ne pouvez pas rendre les scriptlets abstraits. Que signifie abstrait et comment JST pourrait-il devenir abstrait?

  3. OO: vous ne pouvez pas utiliser l'héritage/la composition. Comment pourrais-je utiliser les paradigmes OO dans JSTL?

  4. Débogage: si un scriptlet lève une exception à mi-chemin, tout ce que vous obtenez est une page vierge.

  5. Testabilité: les scriptlets ne peuvent pas être testés à l'unité. Qu'est-ce que cela signifie et comment peut-on tester JSTL à l'unité?

  6. Maintenabilité: par saldo, plus de temps est nécessaire pour maintenir la logique du code mélangé/encombré/dupliqué. Qu'est-ce que ça veut dire?

La dernière chose est ce qu'il a cité dans la recommandation d'Oracle:

Les scriptlets JSP ne doivent pas être utilisés pour écrire la logique métier.

Dans le modèle MVC, j'utilise des scriptlets uniquement dans la couche de présentation. Que veut-il dire ici?

36
palAlaa

Vous semblez vous concentrer uniquement sur la partie présentation et contrôle de flux des scriptlets comme dans l'utilisation des instructions if, for et switch et out.print(). Vous semblez comparer les scriptlets 1: 1 avec JSTL. C'est faux. Je ne parlais pas seulement de la partie contrôle de flux (qui doit en effet être remplacée par JSTL), mais de l'écriture du code brut Java code dans les fichiers JSP en général. C'est-à-dire la collecte des paramètres de requête, la validation et la conversion valeurs, interaction avec la base de données et d'autres Java classes/méthodes, etc. Tout ce que vous faites normalement (indirectement) dans un servlet ou un filtre.

16
BalusC

Vous devriez pas avoir du code de scriptlet dans les JSP. Je recommanderais 100% JSTL et zéro code de scriplet.

Les JSP doivent être purement de présentation. C'est l'avantage caché d'écrire des JSP en utilisant uniquement JSTL, car ils obtiennent toutes leurs données dynamiques ailleurs. Laissez la couche service avoir la logique métier et déterminez les données dont le JSP a besoin.

Cela répond également à votre question de test unitaire. Vous ne devriez pas avoir à tester les JSP unitaires; ce seraient des tests d'interface utilisateur de type sélénium. Si la logique est dans le niveau de service, la façon dont vous la testez est évidente.

Les JSP ne doivent pas être hérités. Vous pouvez certainement les composer ensemble en utilisant quelque chose comme SiteMesh, mais l'héritage n'a aucune part dans vos JSP. Une fois qu'ils héritent de Servlet, la chaîne doit être terminée.

De plus, c'est une fausse alternative. Ni l'un ni l'autre ne devrait exiger la réutilisation, l'héritage ou les tests unitaires. Mais cela ne veut pas dire qu'il n'y a pas de gagnant clair: c'est JSTL. Personne ne devrait utiliser de scriptlets dans les JSP, à l'exception des très rares lignes simples. Les scriptlets implorent des ennuis.

Ces jours-ci, je préfère Velocity comme solution de modèle d'interface utilisateur Web pour Java, bien plus que les JSP. Juste mon avis.

14
duffymo

Je ne peux pas parler pour BalusC mais en général, je pense qu'il pensait que ce genre de choses devrait être accompli par votre code Java code Java (dans les couches Controller et Model si vous '' re dans toute la chose MVC).

  1. Vous ne pouvez pas réutiliser littéralement les balises JSP à un niveau individuel, mais vous pouvez réutiliser les classes dans lesquelles ils appellent.

  2. JSTL ne peut pas être abstrait, mais le code Java Java (que vous pouvez peut-être invoquer depuis JSTL) peut l'être.

  3. Encore une fois, vous ne pouvez pas créer utilement d'objets en jstl, mais vous pouvez le faire dans toutes les classes appelées.

  4. JSTL en lui-même n'est pas testable à l'unité. Mais les classes et les méthodes que vous appelez via le sont.

4
Dan

Cela dépend du modèle que vous utilisez. En utilisant le [~ # ~] mvc [~ # ~] ( ressort, jambes de force, ... ) vous devez éviter l'utilisation de scriptlets dans votre JSP, car ils représentent la vue qui doit contenir des balises XHTML pures. JSTL est un langage déclaratif une sorte de XML, contrairement au scriplet.

En particulier, j'ai utilisé JSTL en combinaison avec AJAX via prototype pour générer RIA sans avoir besoin d'implémenter un autre modèle. Récemment, j'ai vu ce type de programmation avec ExtJS et DWR . Dans mon cas, j'ai trouvé qu'il était nécessaire de combiner JSTL et scriplets en préférant toujours JSTL lorsque cela était possible.

<!-- simple controller, each action is called by means of AJAX -->
<% String signExt="jpg"; %>
<% int r=0, iMaxRows=0, iMaxCols=0;%>
<c:choose>

    <c:when test="${param.action == 'get_chrequest_profile_table_by_family_and_date'}">
        <sql:query var="dataset">
            CALL GetProfilesView('<c:out value="${param.family_name}" />', '<c:out value="${param.reg_date}" />')
        </sql:query>

        <c:set var="strElements"><c:out value="${dataset.rowCount}" /></c:set> 
        <%  
        String strElements = pageContext.getAttribute("strElements").toString();
        int iElements = (int)Integer.valueOf(strElements).intValue(); 
        String to = "";
        %>

        <table class="tb_profiles" id="tb_profiles" iElements="<%=iElements%>"
               width="100%" frame=void border="0" cellPadding="0" cellSpacing="0" style="border-top: 3px solid gray; border-left: 1px solid gray">

            <%for(int i=1, j=0, col=0; i<100; i++){%>
            <tr>
                <%for(j=0; j<4; j++, col++){%>
                <c:set var="c" scope="page"><%=col%></c:set>

                <td name='<c:out value="${dataset.rows[c].chreqprofile_id}" />' >
                    <table width="100%" frame="below" cellPadding="0" cellSpacing="0"style="border-right: 1px solid gray;">

                        <%if( col < iElements){%>
                            <tr style="height:10mm">
                                <td class="td_function" style="cursor:default;">
                                    <c:out value="${dataset.rows[c].description}" />
                                </td>
                            </tr>
                            .................
                            <tr style="height:14mm">                        
                                <td class="td_signature" align="center" vAlign="middle">
                                    <img class="img_signature"
                                         src='../xdata/signatures/<c:out value="${dataset.rows[c].responsible_name}"/>.<%=signExt%>'
                                         alt='<c:out value="${dataset.rows[c].email}" />' 
                                    />
                                </td>
                            </tr>
                            .................

                            <c:set var="sMail"><c:out value="${dataset.rows[c].email}"/></c:set>
                            <% if( col < iElements-1){
                                    to = to + pageContext.getAttribute("sMail").toString() + ","; 
                               }else{
                                    to = to + pageContext.getAttribute("sMail").toString();
                               }
                            %>                      
                        <%}else{%>
                            <tr style="height:10mm">
                                <td class="td_function" style="cursor:default;">x</td>
                                .............
                            </tr>
                        <%}%>
                    </table>
                </td>               

                <%}%>
            </tr>
            <%
                if( col >= iElements){break;}
            }%>
        </table>
        <span id="span_mail_to" style="display:none;"><%=to%></span>        
    </c:when>   
    <c:when test="${param.action == 'functions_form_insert'}">  
        .............
    </c:when>   
</c:choose>
1
ArBR

Je ne vois pas que les scriplets sont trop mauvais spécialement si vous suivez le modèle de conception, je travaille beaucoup sur Spring mvc, dans mon jsp je reçois juste les données du modèle en scriplits, et je le montre à l'utilisateur en utilisant simple Java code en html, je pense qu'il me donne plus de liberté que JSTL.

1
Alaa Abuzaghleh

Voici un tableau comparant JSP et Facelets qui peut éventuellement être utile à quelqu'un, quelque part:

Source

0
Yster