2010-12-26 39 views
35

Quiero que alguien explique algunos puntos en la sorprendente respuesta de BlausC en this question.JSTL vs JSP Scriptlets

Dijo que scriptles tenían algunas desventajas, que son:

  1. Reutilización: no se puede reutilizar scriptles. Mi pregunta: ¿cómo podría reutilizar el código JSTL?

  2. Reemplazabilidad: no se pueden hacer scriptlets abstractos. ¿Qué significa abstracto y cómo podría JST convertirse en abstracto?

  3. OO: no puede hacer uso de la herencia/composición. ¿Cómo podría usar los paradigmas OO en JSTL?

  4. Depuración: si un scriptlet arroja una excepción hasta la mitad, todo lo que obtiene es una página en blanco.

  5. Testabilidad: los scriptlets no se pueden probar en unidades. ¿Qué significa eso y cómo JSTL puede ser probado en unidades?

  6. Capacidad de mantenimiento: por saldo, se necesita más tiempo para mantener la lógica del código mezclado/desordenado/duplicado. ¿Qué significa esto?

Lo último es lo citó la recomendación forma de Oracle:

scriptlets JSP no se deben utilizar para escribir la lógica de negocio.

En el patrón MVC, uso scriptlets solo en la capa de presentación. ¿Qué quiere decir él aquí?

+0

estaba pensando exactamente lo mismo, cuando vi respuesta BalusC. Gracias, encontré esta publicación. –

Respuesta

16

Usted parece concentrarse sólo en la parte de presentación y de control de flujo de los scriptles como en el uso de if, y forswitch declaraciones y out.print() cosas. Pareces comparar scriptlets 1: 1 con JSTL. Esto está mal. No estaba hablando solamente de la parte de control de flujo (que de hecho debe ser reemplazada por JSTL), sino de escribir código Java en bruto en archivos JSP en general. Es decir. reunir parámetros de solicitud, validar y convertir valores, interactuar con la base de datos y otras clases/métodos de Java, etc. Todo lo que normalmente (indirectamente) se hace en un Servlet o Filtro.

+5

a partir de ahora, código java puro en servlets, filtros y solo en el contexto y JSTL en JSP. – palAlaa

13

Debe no tener código scriptlet en JSPs. Recomiendo 100% JSTL y cero código de scriplet.

Las JSP deben ser puramente de presentación. Ese es el beneficio oculto de escribir JSP utilizando solo JSTL, porque obtienen todos sus datos dinámicos en otro lugar. Deje que la capa de servicio tenga la lógica comercial y determine qué datos necesita el JSP.

Responde también a la pregunta de prueba de su unidad. No debería tener que probar JSP por unidad; esas serían pruebas de UI similares al Selenio. Si la lógica está en el nivel de servicio, es obvio cómo la prueba.

JSPs no deben ser heredados. Ciertamente puede componerlos juntos utilizando algo como SiteMesh, pero la herencia no tiene parte en sus JSP. Una vez que heredan de Servlet, la cadena debe finalizar.

Además, es una alternativa falsa. Ninguno de los dos debe requerir reutilización, herencia o pruebas unitarias. Pero eso no significa que no haya un ganador claro: es JSTL. Nadie debería estar usando scriptlets en JSPs, excepto por frases muy raras. Los scriptlets están pidiendo problemas.

En estos días prefiero Velocity como mi solución de plantillas de IU web para Java, mucho más que las JSP. Solo es mi opinión.

+0

Estoy totalmente de acuerdo en que debemos usar JSTL en JSP, ¿quiere decir con capa de servicio una capa de controlador? – palAlaa

+0

capa de controlador es parte de la vista; necesita una capa de servicio también. – duffymo

+0

Eso significa que el controlador centraliza la lógica para enviar solicitudes a la vista siguiente, por lo que el controlador es el servlet en desarrollo servlet-JSP, y la capa de servicio es las partes que proporcionan servicio específico en servlet. ¿Estoy en lo correcto? – palAlaa

4

No puedo hablar por BalusC, pero en general creo que él estaba teniendo la idea de que este tipo de cosas deberían ser logradas por su código Java normal (en las capas de Controlador y Modelo si está en el MVC completo cosa).

  1. No se pueden reutilizar literalmente las etiquetas JSP a nivel individual, pero puede reutilizar las clases a las que llaman.

  2. JSTL no puede ser abstracto, pero el código normal de Java (que quizás pueda invocar de JSTL) puede ser.

  3. Nuevamente, no puede hacer objetos útiles en jstl, pero puede hacerlo en todas las clases que se llaman.

  4. JSTL por sí solo no se puede probar por unidad. Pero las clases y los métodos que llamas son.

+0

Lo siento pero no encuentro una clara distinción entre ambos: S – palAlaa

+1

El punto es que si escribe un montón de código Java en su JSP, no puede extender las clases que crea allí, reutilizarlas, escribir pruebas de unidad para ellos, etc. Por supuesto, si usa scriptlets por nada más que <%=%> y ocasionalmente <% if() { %>, entonces tal vez no sea tan relevante. – Dan

+0

JSP hace que Code se vea elegante, similar a XML, declarativo como no Procedural Aunque no hace que el código sea comprobable, reutilizable per se, pero es mejor porque el código Java no está ENLEDADO y elimina las construcciones java y la sintaxis. Se trata de mejorar legibilidad. –

1

Depende del patrón que esté utilizando. Al utilizar MVC spring, struts, ...), debe evitar el uso de scriptlets en su JSP, ya que representa la vista que debe contener etiquetas XHTML puras. JSTL es un lenguaje declarativo de algún tipo de XML, mientras que scriplet no lo es.

Particularmente he utilizado JSTL en combinación con AJAX a través de prototype para generar RIA sin necesidad de implementar otro patrón. Recientemente he visto este tipo de programación con ExtJS y DWR. En mi caso encontré que era necesario combinar JSTL y scriplets siempre prefiriendo JSTL cuando sea posible.

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

Sin ofender, pero ese código se ve como un horrible mish mash de jstl, scriptlets y html. – Ger

+1

@Gearoid: Este código le permite implementar fácilmente aplicaciones web JSTL puras. Tienes razón en el sentido de que esta es una mezcla de JSTL, scriptlet y HTML. Este es un tipo de controlador que sirve HTML para el cliente, este código debe llamarse a través de AJAX y representarse en el DOM a través de javascript. Como ya le dije, si su principal preocupación es la calidad del código, debería usar algún MVC-framework como SPRING ... – ArBR

1

no veo que scriplets es demasiado mala, especialmente si te sigue el patrón de diseño en ella, yo trabajo mucho en MVC primavera, en mi jsp acabo de recibir los datos del modelo en scriplits, y lo muestro a la usuario que usa código java simple en html, creo que me da más libertad que JSTL.

0

Aquí es una tabla que compara JSP y Facelets que posiblemente pueden ser útiles para alguien, en algún lugar:

Source

Cuestiones relacionadas