Scriptlets JSTL vs JSP

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

il a dit que les scriptlets avaient certains inconvénients, qui sont:

  1. réutilisable: vous ne pouvez pas réutiliser les scripts. Ma question: Comment puis-je réutiliser le code JSTL?

  2. Remplacement: vous ne pouvez pas faire les scriptlets abstrait. Que signifie abstract et comment pourrait JST devenir abstrait?

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

  4. débogage: si un scriptlet lance une exception à mi-chemin, tout ce que vous obtenez est une page blanche.

  5. testabilité: les scriptlets ne peuvent pas être testés à l'unité. Qu'est-ce que cela signifie, Et comment JSTL peut-il être testé à l'unité?

  6. maintenabilité: selon saldo, plus de temps est nécessaire pour maintenir la logique de code mêlée/encombrée/dupliquée. Qu'est-ce que cela signifie?

la dernière chose est ce qu'il a cité de la recommandation D'Oracle:

les scriptlets JSP ne doivent pas être utilisés pour écrire la logique commerciale.

dans le modèle MVC, j'utilise les scriptlets uniquement dans la couche de présentation. Que veut-il dire par là?

35
demandé sur Community 2010-12-27 00:07:59

6 réponses

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

16
répondu BalusC 2010-12-26 23:10:15

Vous devriez pas ont scriptlet code dans les pages Jsp. Je recommande un code 100% JSTL et zéro scriplet.

JSPs devrait être purement présentation. C'est l'avantage caché d'écrire des JSPs en utilisant uniquement JSTL, parce qu'ils obtiennent toutes leurs données dynamiques ailleurs. Laisser à la couche de service la logique opérationnelle et déterminer les données dont le PSJ a besoin.

cela répond aussi à la question de test de votre unité. Vous ne devriez pas avoir à l'unité test JSPs; ceux-ci seraient des tests D'interface utilisateur de type sélénium. Si la logique est dans le niveau de service, il est évident comment le tester.

Les pce

ne devraient pas être héritées. Vous pouvez certainement les composer ensemble en utilisant quelque chose comme SiteMesh, mais l'héritage n'a aucune part dans votre JSPs. Une fois qu'ils héritent de Servlet, la chaîne devrait être terminée.

D'ailleurs, c'est une fausse alternative. Ni l'un ni l'autre ne devrait nécessiter de réemploi, d'héritage ou de test unitaire. Mais cela ne signifie pas il n'y a pas de gagnant clair: C'est JSTL. Personne ne devrait utiliser de scriptlets dans les JSPs, à l'exception de très rares monolithes. Les Scriptlets mendient des ennuis.

ces jours-ci, je préfère Velocity comme ma solution de modèle D'interface Web pour Java, bien plus que JSPs. Juste mon avis.

14
répondu duffymo 2012-08-28 20:11:49

Je ne peux pas parler pour BalusC mais en général je crois qu'il était à l'idée que ce genre de choses devrait être accompli par votre code Java ordinaire (dans le contrôleur et les calques de modèle si vous êtes dans l'ensemble MVC chose).

  1. vous ne pouvez pas littéralement réutiliser les étiquettes JSP à un niveau individuel, mais vous pouvez réutiliser les classes qu'ils appellent.

  2. JSTL ne peut pas être abstraite, mais ordinaire de code Java (que vous pouvez peut-être invoquer de JSTL) peut être.

  3. encore une fois, vous ne pouvez pas faire des objets utilement dans jstl, mais vous pouvez dans toutes les classes qui sont appelées.

  4. JSTL en soi n'est pas susceptible de faire l'objet d'un test unitaire. Mais les classes et les méthodes que vous appelez à travers elle.

4
répondu Dan 2010-12-26 21:21:35

Cela dépend du modèle que vous utilisez. En utilisant le MVC ( ressort, entretoises,... ) vous devez éviter l'utilisation de scriptlets dans votre JSP, car il représente la vue qu'il devrait contenir des balises XHTML pures. JSTL est un langage déclaratif, une sorte de XML, alors que scriplet ne l'est pas.

en particulier j'ai utilisé JSTL en combinaison avec AJAX via prototype pour la génération de RIA sans avoir besoin de mettre en œuvre un autre modèle. Récemment j'ai vu ce genre de programmation avec ExtJS et DWR . Dans mon cas, j'ai trouvé nécessaire de combiner à la fois JSTL et scriplets toujours préférant JSTL lorsque 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
répondu ArBR 2010-12-27 19:27:30

Je ne vois pas que les scriplets est trop mauvais spécialement si vous suivez le modèle de conception en elle, je travaille beaucoup sur MVC printemps, dans mon jsp je viens d'obtenir les données du modèle dans scriplits, et je le montre à l'utilisateur en utilisant le code java simple en html, je sens qu'il me donne plus de liberté que JSTL.

1
répondu Alaa Abuzaghleh 2015-04-16 19:29:49

voici un tableau comparant JSP et Facelets qui peuvent être utiles à quelqu'un, quelque part:

Source

0
répondu Yster 2015-12-24 11:29:44