Подтвердить что ты не робот

JSTL против JSP Scriptlets

Я хочу, чтобы кто-то объяснил некоторые моменты в замечательном ответе BlausC в этом вопросе.

Он сказал, что сценарии имеют некоторые недостатки, которые:

  • Повторяемость: вы не можете повторно использовать скрипты. Мой вопрос: как я мог повторно использовать JSTL-код?

  • Заменяемость: вы не можете создавать абстрактные скриптлеты. Что абстрактное означает и как JST может стать абстрактным?

  • OO: вы не можете использовать наследование/состав. Как я могу использовать парадигмы OO в JSTL?

  • Отладка: если скриптлет порождает исключение наполовину, все, что вы получаете, это пустая страница.

  • Тестируемость: сценарии не могут быть протестированы. Что это значит, и как JSTL может быть проверен подразделением?

  • Поддержание работоспособности: на каждый сальдо требуется больше времени для поддержания смешанной/загроможденной/дублированной логики кода. Что это значит?

Последнее, что он цитировал в рекомендации Oracle:

Сценарии сценариев JSP не должны использоваться для написания бизнес-логики.

В шаблоне MVC я использую скрипты только в уровне представления. Что он здесь имеет в виду?

4b9b3361

Ответ 1

Похоже, вы концентрируетесь только на части представления и управления потоком скриптлетов, как при использовании операторов if, for и switch и out.print(). Кажется, вы сравниваете скрипты 1:1 с JSTL. Это не верно. Я не говорил только о части управления потоком (которая действительно должна быть заменена JSTL), а о написании исходного кода Java в файлах JSP в целом. То есть сбор параметров запроса, проверка и преобразование значений, взаимодействие с базой данных и другими классами/методами Java и т.д. Все, что вы обычно (косвенно) делаете в сервлете или фильтре.

Ответ 2

У вас не должно быть кода сценария в JSP. Я бы порекомендовал 100% JSTL и нулевой код сценария.

JSP должны быть чисто презентацией. Это скрытое преимущество написания JSP, использующего только JSTL, потому что они получают все свои динамические данные в другом месте. Пусть сервисный уровень имеет бизнес-логику и определяет, какие данные необходимо JSP.

Это также ответит на ваш тестовый вопрос. Вы не должны использовать unit test JSP; это будут тесты, похожие на Selenium. Если логика находится в уровне обслуживания, это очевидно, как вы ее протестируете.

JSP не должны наследоваться. Вы можете составить их вместе, используя что-то вроде SiteMesh, но наследование не имеет отношения к вашим JSP. После того, как они наследуются от Servlet, цепочка должна быть закончена.

Кроме того, это ложная альтернатива. Ни один из них не требует повторного использования, наследования или модульного тестирования. Но это не значит, что нет явного победителя: это JSTL. Никто не должен использовать скриптлеты в JSP, за исключением очень редких однострочных. Сценарии просят о неприятностях.

В эти дни я предпочитаю Velocity как мое решение для веб-интерфейса для Java, гораздо больше, чем JSP. Просто мое мнение.

Ответ 3

Я не могу говорить за BalusC, но в целом я считаю, что он понимает, что такие вещи должны выполняться вашим обычным Java-кодом (в слоях Controller и Model, если вы находитесь во всей статье MVC).

  • Вы не можете буквально повторно использовать теги JSP на отдельном уровне, но вы можете повторно использовать классы, на которые они звонят.

  • JSTL не может быть абстрактным, но обычный Java-код (который вы можете вызвать из JSTL) может быть.

  • Опять же, вы не можете сделать объекты полезными в jstl, но вы можете во всех классах, которые вызывают.

  • JSTL сам по себе не тестируется на единицу. Но классы и методы, которые вы вызываете через него, - это.

Ответ 4

Это зависит от используемого шаблона. Используя MVC (spring, struts,...), вы должны избегать использования сценариев в своем JSP, поскольку оно представляет собой представление, которое должно содержать чистый XHTML теги. JSTL - это декларативный язык, какой-то XML, а scriplet - нет.

В частности, я использовал JSTL в сочетании с AJAX через prototype для создания RIA без необходимости реализации другого шаблон. Недавно я видел такой вид программирования с ExtJS и DWR. В моем случае я обнаружил, что необходимо объединить оба JSTL и скрипты, которые всегда предпочитают JSTL, когда это возможно.

<!-- 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>

Ответ 5

Я не вижу, чтобы скрипты были слишком плохими, особенно если вы следовали шаблону дизайна в нем, я много работаю над spring mvc, в моем jsp я просто получаю данные модели в сценариях, и я показываю ее пользователю, используя простой java-код в html, я чувствую, что он дает мне больше свободы, чем JSTL.

Ответ 6

Вот таблица, сравнивающая JSP и Facelets, которые могут быть полезны кому-то, где-то:

Источник