Skrypty JSTL vs JSP

Chcę, aby ktoś wyjaśnił kilka punktów w niesamowitej odpowiedzi Blausca w to pytanie.

Powiedział, że skrypty mają pewne wady, którymi są:

  1. Możliwość ponownego użycia: nie można ponownie używać skryptów. Moje pytanie: Jak mogę ponownie użyć kodu JSTL?

  2. Wymienność: nie można tworzyć skryptów abstrakcyjnych. Co oznacza abstrakcja i jak JST może stać się abstrakcją?

  3. OO: nie możesz korzystać z dziedziczenia/kompozycji. Jak mógłbym użyć Oo paradygmaty w JSTL?

  4. Debugowanie: jeśli skryptlet wyrzuci wyjątek w połowie, otrzymasz tylko pustą stronę.

  5. Testowalność: skrypty nie mogą być testowane jednostkowo. Co to znaczy i w jaki sposób JSTL może być testowany jednostkowo?

  6. Konserwacja: w przypadku saldo potrzeba więcej czasu, aby utrzymać mieszaną/zaśmieconą/zduplikowaną logikę kodu. Co to znaczy?

Ostatnią rzeczą jest to, co zacytował z rekomendacji Oracle:

Skrypty JSP nie powinny być używane do pisania logiki biznesowej.

We wzorze MVC używam skryptów tylko w warstwie prezentacji. Co on ma na myśli?

Author: Community, 2010-12-27

6 answers

Wydaje się, że koncentrujesz się tylko na prezentacji i kontroli przepływu części skryptów, jak w przypadku korzystania if, for i switch wypowiedzi i out.print() rzeczy. Wydaje się, że porównujesz Skrypty 1: 1 z JSTL. To jest złe. Nie mówiłem tylko o części flow control (która rzeczywiście ma być zastąpiona przez JSTL), ale o pisaniu surowego kodu Javy w plikach JSP w ogóle. Czyli zbieranie parametrów żądań, Walidacja i Konwersja wartości, interakcja z bazą danych i innymi klasami/metodami Java, itd. Wszystkie rzeczy, które normalnie (pośrednio) robisz w Servlecie lub filtrze.

 16
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-26 23:10:15

Powinieneś a nie mieć kod skryptowy w JSP. Polecam w 100% JSTL i zero kodu scriplet.

JSPs powinien być wyłącznie prezentacją. To jest ukryta zaleta pisania JSP przy użyciu tylko JSTL, ponieważ wszystkie swoje dynamiczne dane otrzymują gdzie indziej. Niech warstwa usług ma logikę biznesową i określa, jakich danych potrzebuje JSP.

To odpowiedź na twoje pytanie do testów jednostkowych. Nie powinieneś testować jednostkowo JSP-ów; byłyby to testy interfejsu użytkownika podobne do selenu. Jeśli logika jest w warstwie usług, to oczywiste, jak ją testować.

JSP nie powinny być dziedziczone. Z pewnością możesz komponować je razem za pomocą czegoś takiego jak SiteMesh, ale dziedziczenie nie ma udziału w Twoich JSP. Po dziedziczeniu z Servletu łańcuch powinien zostać zakończony.

Poza tym, to fałszywa alternatywa. Żaden z nich nie powinien wymagać ponownego użycia, dziedziczenia lub testowania jednostkowego. Ale to nie znaczy, że nie ma wyraźnego zwycięzcy: to JSTL. Nikt nie powinien używać skryptów w JSPs, z wyjątkiem dla bardzo rzadkich jednowarstwowych. Skrypty błagają o kłopoty.

W dzisiejszych czasach wolę Velocity jako moje web UI template rozwiązanie dla Javy, znacznie więcej niż JSP. To tylko moje zdanie.

 14
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 20:11:49

Nie mogę mówić za Balusca, ale ogólnie uważam, że wpadł na pomysł, że tego typu rzeczy powinny być realizowane przez zwykły kod Javy(w warstwach kontrolera i modelu, jeśli jesteś w tym całym MVC).

  1. Nie można dosłownie ponownie użyć znaczników JSP na poziomie indywidualnym, ale można ponownie użyć klas, do których wywołują.

  2. JSTL nie może być abstrakcyjny, ale zwykły kod Javy (który możesz wywołać z JSTL) może be.

  3. Ponownie, nie można tworzyć obiektów użytecznie w jstl, ale można we wszystkich klasach, które są wywoływane.

  4. JSTL sam w sobie nie jest testowany jednostkowo. Ale klasy i metody, które przez to wywołujesz, są.

 4
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-26 21:21:35

To zależy od wzoru, którego używasz. Za pomocą MVC (sprężyny, rozpórki,..) Należy unikać używania skryptów w JSP, ponieważ reprezentują one widok, który powinien zawierać czyste znaczniki XHTML. JSTL jest językiem deklaratywnym jakimś rodzajem XML, podczas gdy scriplet nie jest.

Szczególnie użyłem JSTL w połączeniu z AJAXPoprzez prototype do generowania RIA bez konieczności implementacji innego wzorca. Ostatnio widziałem to rodzaj programowania z ExtJS i DWR . W moim przypadku okazało się, że konieczne było połączenie zarówno JSTL i skryptów zawsze preferujących JSTL, gdy to możliwe.

<!-- 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
Author: ArBR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-27 19:27:30

Nie widzę, że skrypty są zbyt złe, szczególnie jeśli podążasz za wzorcem projektowym w nim, dużo pracuję na Spring mvc, w moim jsp po prostu dostaję dane modelu w scriplitach i pokazuję je użytkownikowi za pomocą prostego kodu Javy w html, czuję, że daje mi to więcej swobody niż JSTL.

 1
Author: Alaa Abuzaghleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 19:29:49

Oto tabela porównująca JSP i Facelets, które mogą być dla kogoś pomocne, gdzieś:

Źródło

 0
Author: Yster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 11:29:44