¿Cómo puedo evitar el código Java en archivos JSP, usando JSP 2?

Jul 05 2010

Soy nuevo en Java EE y sé que algo como las siguientes tres líneas

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

es una forma de codificación de la vieja escuela y en la versión 2 de JSP existe un método para evitar el código Java en los archivos JSP. ¿Cuáles son las líneas JSP 2 alternativas y cómo se llama esta técnica?

Respuestas

1987 BalusC Jul 05 2010 at 21:19

El uso de scriptlets (esas <% %>cosas) en JSP está de hecho muy desaconsejado desde el nacimiento de taglibs (como JSTL ) y EL ( Expression Language , esas ${}cosas) allá por 2001.

Las principales desventajas de los scriptlets son:

  1. Reutilización: no puede reutilizar scriptlets.
  2. Reemplazabilidad: no puede hacer que los scriptlets sean abstractos.
  3. Habilidad OO: no se puede hacer uso de herencia / composición.
  4. Capacidad de depuración: si scriptlet arroja una excepción a la mitad, todo lo que obtiene es una página en blanco.
  5. Capacidad de prueba: los scriptlets no son comprobables por unidades.
  6. Mantenibilidad: por saldo se necesita más tiempo para mantener la lógica del código mezclado / desordenado / duplicado.

Sun Oracle también recomienda en las convenciones de codificación JSP evitar el uso de scriptlets siempre que la misma funcionalidad sea posible mediante clases (etiqueta). Aquí hay varias citas de relevancia:

De la especificación JSP 1.2, se recomienda encarecidamente que se utilice la biblioteca de etiquetas estándar JSP (JSTL) en su aplicación web para ayudar a reducir la necesidad de scriptlets JSP en sus páginas. Las páginas que utilizan JSTL son, en general, más fáciles de leer y mantener.

...

Siempre que sea posible, evite los scriptlets JSP siempre que las bibliotecas de etiquetas proporcionen una funcionalidad equivalente. Esto hace que las páginas sean más fáciles de leer y mantener, ayuda a separar la lógica de negocios de la lógica de presentación y hará que sus páginas evolucionen más fácilmente a páginas de estilo JSP 2.0 (la especificación JSP 2.0 admite, pero resta importancia al uso de scriptlets).

...

Con el espíritu de adoptar el patrón de diseño modelo-vista-controlador (MVC) para reducir el acoplamiento entre el nivel de presentación y la lógica empresarial, los scriptlets JSP no deben utilizarse para escribir lógica empresarial. Más bien, los scriptlets JSP se utilizan si es necesario para transformar los datos (también llamados "objetos de valor") devueltos al procesar las solicitudes del cliente en un formato adecuado listo para el cliente. Incluso entonces, esto se haría mejor con un servlet de controlador frontal o una etiqueta personalizada.


Cómo reemplazar scriptlets depende completamente del único propósito del código / lógica. La mayoría de las veces, este código debe colocarse en una clase Java completa:

  • Si desea invocar el mismo código Java en cada solicitud, menos o más independientemente de la página solicitada, por ejemplo, verificando si un usuario está conectado, implemente un filtro y escriba el código en consecuencia en el doFilter()método. P.ej:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
            ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
        } else {
            chain.doFilter(request, response); // Logged in, just continue request.
        }
    }
    

    Cuando se asigna una <url-pattern>cobertura adecuada a las páginas JSP de interés, no es necesario copiar y pegar la misma parte del código en las páginas JSP en general.


  • Si desea invocar algún código Java para preprocesar una solicitud, por ejemplo, precargar alguna lista de una base de datos para mostrarla en alguna tabla, si es necesario en función de algunos parámetros de consulta, implemente un servlet y escriba el código en consecuencia en el doGet()método. P.ej:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            List<Product> products = productService.list(); // Obtain all products.
            request.setAttribute("products", products); // Store products in request scope.
            request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
        } catch (SQLException e) {
            throw new ServletException("Retrieving products failed!", e);
        }
    }
    

    De esta manera, es más fácil lidiar con las excepciones. No se accede a la base de datos en medio de la representación JSP, pero mucho antes de que se muestre la JSP. Todavía tiene la posibilidad de cambiar la respuesta siempre que el acceso a la base de datos arroje una excepción. En el ejemplo anterior, se mostrará la página de error 500 predeterminada que de todos modos puede personalizar con un archivo <error-page>in web.xml.


  • Si desea invocar algún código Java para posprocesar una solicitud, por ejemplo, procesando el envío de un formulario, implemente un servlet y escriba el código en consecuencia en el doPost()método. P.ej:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);
    
        if (user != null) {
            request.getSession().setAttribute("user", user); // Login user.
            response.sendRedirect("home"); // Redirect to home page.
        } else {
            request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
        }
    }
    

    De esta manera, tratar con diferentes destinos de página de resultados es más fácil: volver a mostrar el formulario con errores de validación en caso de error (en este ejemplo en particular, puede volver a mostrarlo usando ${message}en EL ), o simplemente ir a la página de destino deseada en caso de éxito.


  • Si desea invocar algún código Java para controlar el plan de ejecución y / o el destino de la solicitud y la respuesta, implemente un servlet de acuerdo con el Patrón de controlador frontal de MVC . P.ej:

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Action action = ActionFactory.getAction(request);
            String view = action.execute(request, response);
    
            if (view.equals(request.getPathInfo().substring(1)) {
                request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
            } else {
                response.sendRedirect(view);
            }
        } catch (Exception e) {
            throw new ServletException("Executing action failed.", e);
        }
    }
    

    O simplemente adopte un marco MVC como JSF , Spring MVC , Wicket , etc. para que termine con solo una página JSP / Facelets y una clase JavaBean sin la necesidad de un servlet personalizado.


  • Si desea invocar algún código Java para controlar el flujo dentro de una página JSP, entonces necesita tomar un taglib de control de flujo (existente) como el núcleo JSTL . Por ejemplo, mostrar List<Product>en una tabla:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    ...
    <table>
        <c:forEach items="${products}" var="product"> <tr> <td>${product.name}</td>
                <td>${product.description}</td> <td>${product.price}</td>
            </tr>
        </c:forEach>
    </table>
    

    Con etiquetas de estilo XML que encajan perfectamente entre todo ese HTML, el código es mejor legible (y por lo tanto mejor mantenible) que un montón de scriptlets con varias llaves de apertura y cierre ( "¿A dónde diablos pertenece esta llave de cierre?" ). Una ayuda sencilla es configurar su aplicación web para que genere una excepción siempre que se sigan utilizando scriptlets agregando la siguiente pieza a web.xml:

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <scripting-invalid>true</scripting-invalid>
        </jsp-property-group>
    </jsp-config>
    

    En Facelets , el sucesor de JSP, que forma parte del marco JSF MVC proporcionado por Java EE , ya no es posible utilizar scriptlets . De esta manera, automáticamente se ve obligado a hacer las cosas "de la manera correcta".


  • Si desea invocar algún código Java para acceder y mostrar datos "backend" dentro de una página JSP, entonces necesita usar EL (Lenguaje de expresión), esas ${}cosas. Por ejemplo, volver a mostrar los valores de entrada enviados:

    <input type="text" name="foo" value="${param.foo}" />
    

    Las ${param.foo}pantallas del resultado de request.getParameter("foo").


  • Si desea invocar algún código Java de utilidad directamente en la página JSP (generalmente public staticmétodos), debe definirlos como funciones EL. Hay un taglib de funciones estándar en JSTL, pero también puede crear funciones usted mismo fácilmente . A continuación, se muestra un ejemplo de la fn:escapeXmlutilidad de JSTL para prevenir ataques XSS .

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    ...
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    

    Tenga en cuenta que la sensibilidad XSS no está relacionada específicamente con Java / JSP / JSTL / EL / lo que sea, este problema debe tenerse en cuenta en cada aplicación web que desarrolle. El problema de los scriptlets es que no proporciona ninguna forma de prevención incorporada, al menos no utilizando la API estándar de Java. El sucesor de JSP, Facelets, ya tiene un escape HTML implícito, por lo que no necesita preocuparse por los agujeros XSS en Facelets.

Ver también:

  • ¿Cuál es la diferencia entre JSP, Servlet y JSF?
  • ¿Cómo funcionan Servlet, ServletContext, HttpSession y HttpServletRequest / Response?
  • Ejemplo básico de MVC con JSP, Servlet y JDBC
  • Patrones de diseño en aplicaciones web Java
  • Funciones ocultas de JSP / Servlet
228 StefanSchubert-Peters Aug 15 2011 at 04:59

Como salvaguardia: deshabilite Scriptlets para siempre

Como se está discutiendo otra pregunta , puede y siempre debe deshabilitar los scriptlets en el web.xmldescriptor de su aplicación web.

Siempre haría eso para evitar que cualquier desarrollador agregue scriptlets, especialmente en empresas más grandes donde perderá la visión general tarde o temprano. La web.xmlconfiguración se ve así:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
109 Bozho Jul 05 2010 at 14:28

JSTL ofrece etiquetas para condicionales, bucles, conjuntos, get, etc. Por ejemplo:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTL funciona con atributos de solicitud; la mayoría de las veces, los establece en la solicitud un Servlet, que reenvía a JSP.

61 tzim Jul 05 2010 at 14:29

No estoy seguro de haber entendido esto correctamente.

Deberías leer algo sobre MVC. Spring MVC y Struts 2 son las dos soluciones más comunes.

54 βξhrαng Jul 05 2010 at 15:45

Puede utilizar etiquetas JSTL junto con expresiones EL para evitar mezclar código Java y HTML:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" /> <c:out value="${param.name}" />
        // and so on

    </body>
</html>
34 tsand Mar 23 2011 at 01:24

También hay marcos basados ​​en componentes, como Wicket , que generan gran parte del HTML para usted.

Las etiquetas que terminan en el HTML son extremadamente básicas y prácticamente no hay lógica que se mezcle. El resultado son páginas HTML casi vacías con elementos HTML típicos. La desventaja es que hay muchos componentes en la API de Wicket para aprender y algunas cosas pueden ser difíciles de lograr bajo esas restricciones.

33 SamiJmii Feb 04 2011 at 17:41

En el patrón arquitectónico MVC, las JSP representan la capa de vista. Incrustar código Java en JSP se considera una mala práctica.

Puede utilizar JSTL , freeMarker y velocity con JSP como "motor de plantilla".

El proveedor de datos de esas etiquetas depende de los marcos con los que esté tratando. Struts 2 y WebWork como implementación para el patrón MVC usa OGNL "técnica muy interesante para exponer las propiedades de Beans a JSP".

27 ThorbjørnRavnAndersen Jul 05 2010 at 15:30

La experiencia ha demostrado que las JSP tienen algunas deficiencias, una de las cuales es difícil de evitar mezclar el marcado con el código real.

Si puede, considere usar una tecnología especializada para lo que necesita hacer. En Java EE 6 existe JSF 2.0, que proporciona muchas características interesantes, incluido el pegado de los beans de Java junto con las páginas JSF a través del #{bean.method(argument)}enfoque.

26 dipu May 11 2012 at 23:45

Si simplemente desea evitar los inconvenientes de la codificación Java en JSP, puede hacerlo incluso con scriplets. Simplemente siga un poco de disciplina para tener un mínimo de Java en JSP y casi ningún cálculo y lógica en la página JSP.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% // Instantiate a JSP controller
MyController clr = new MyController(request, response);

// Process action, if any
clr.process(request);

// Process page forwarding, if necessary

// Do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // And so on   
        </form>
    </body>
</html>
26 tomasb Aug 18 2011 at 03:02

Aprenda a personalizar y escribir sus propias etiquetas usando JSTL

Tenga en cuenta que EL es EviL (excepciones en tiempo de ejecución y refactorización).

Wicket también puede ser malo (rendimiento y laborioso para aplicaciones pequeñas o nivel de vista simple).

Ejemplo de java2s

Debe agregarse al archivo web.xml de la aplicación web.

<taglib>
    <taglib-uri>/java2s</taglib-uri>
    <taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>

Cree el archivo java2s.tld en / WEB-INF /

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- A tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- This tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

Compile el siguiente código en WEB-INF \ classes \ com \ java2s

package com.java2s;

import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 )
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // End of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany )
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

Inicie el servidor y cargue el archivo bodyContent.jsp en el navegador:

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>
25 msj121 May 21 2011 at 03:42

Wicket también es una alternativa que separa completamente Java de HTML, por lo que un diseñador y un programador pueden trabajar juntos y en diferentes conjuntos de código con poca comprensión mutua.

Mira a Wicket.

23 DmitriyR Jul 13 2011 at 03:20

Hiciste una buena pregunta y, aunque obtuviste buenas respuestas, te sugiero que te deshagas de JSP. Es una tecnología obsoleta que eventualmente morirá. Utilice un enfoque moderno, como motores de plantillas. Tendrá una separación muy clara de las capas de presentación y negocios, y ciertamente no tendrá código Java en las plantillas, por lo que puede generar plantillas directamente desde el software de edición de presentaciones web, en la mayoría de los casos aprovechando WYSIWYG.

Y, por supuesto, manténgase alejado de los filtros y el procesamiento previo y posterior, de lo contrario, puede enfrentar dificultades de soporte / depuración, ya que siempre no sabe de dónde obtiene el valor la variable.

21 ThaiTran Jan 27 2013 at 01:07

No importa cuánto intente evitar, cuando trabaje con otros desarrolladores, algunos de ellos seguirán prefiriendo scriptlet y luego insertarán el código maligno en el proyecto. Por lo tanto, configurar el proyecto en el primer signo es muy importante si realmente desea reducir el código scriptlet. Hay varias técnicas para superar esto (incluidos varios marcos que otros mencionaron). Sin embargo, si prefiere el método JSP puro, utilice el archivo de etiquetas JSTL. Lo bueno de esto es que también puede configurar páginas maestras para su proyecto, por lo que las otras páginas pueden heredar las páginas maestras

Cree una página maestra llamada base.tag debajo de su WEB-INF / etiquetas con el siguiente contenido

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

En esta página principal, creé un fragmento llamado "título", de modo que en la página secundaria, pudiera insertar más códigos en este lugar de la página maestra. Además, la etiqueta <jsp:doBody/>será reemplazada por el contenido de la página secundaria.

Cree una página secundaria (child.jsp) en su carpeta WebContent:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base>se utiliza para especificar la página maestra que desea utilizar (que es base.tag en este momento). Todo el contenido dentro de la etiqueta <jsp:body>aquí reemplazará al <jsp:doBody/>de su página maestra. Su página secundaria también puede incluir cualquier biblioteca de etiquetas y puede usarla normalmente como la otra mencionada. Sin embargo, si usa cualquier código scriptlet aquí ( <%= request.getParameter("name") %>...) e intenta ejecutar esta página, obtendrá un archivo JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here. Por lo tanto, no hay forma de que otras personas puedan incluir el código maligno en el archivo jsp

Llamar a esta página desde su controlador:

Puede llamar fácilmente al archivo child.jsp desde su controlador. Esto también funciona bien con el marco de struts.

21 mahesh Feb 23 2011 at 13:14

Para evitar el código Java en archivos JSP, Java ahora proporciona bibliotecas de etiquetas, como JSTL.

Además, Java ha creado JSF en el que puede escribir todas las estructuras de programación en forma de etiquetas.

19 ChandraSekhar Jun 05 2011 at 11:23

Utilice bibliotecas de etiquetas JSTL en JSP. Eso funcionará perfectamente.

18 tanglei Jul 11 2011 at 13:59

Simplemente use la etiqueta JSTL y la expresión EL.

17 CsBalazsHungary Jan 21 2013 at 23:04

Si alguien está realmente en contra de la programación en más lenguajes que uno , sugiero GWT. Teóricamente, puede evitar todos los elementos de JavaScript y HTML, porque Google Toolkit transforma todo el cliente y el código compartido a JavaScript. No tendrás problema con ellos, por lo que tienes un servicio web sin codificar en ningún otro idioma. Incluso puede usar algún CSS predeterminado de algún lugar, tal como lo proporcionan las extensiones (smartGWT o Vaadin ). No es necesario que aprenda docenas de anotaciones.

Por supuesto, si lo desea, puede piratear las profundidades del código e inyectar JavaScript y enriquecer su página HTML, pero realmente puede evitarlo si lo desea, y el resultado será bueno, ya que fue escrito en cualquier otro marco. . Digo que vale la pena intentarlo, y el GWT básico está bien documentado.

Y, por supuesto, muchos compañeros programadores describieron o recomendaron varias otras soluciones. GWT es para personas que realmente no quieren lidiar con el elemento web o minimizarlo.

16 Tobias May 21 2012 at 14:51

Una buena idea del mundo de Python son los lenguajes de atributos de plantillas ; TAL fue introducido por Zope (por lo tanto, también conocido como "Plantillas de página de Zope", ZPT) y es un estándar, con implementaciones en PHP, XSLT y Java también (he usado las encarnaciones de Python / Zope y PHP). En esta clase de lenguajes de plantillas, uno de los ejemplos anteriores podría verse así:

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

El código parece HTML normal (o XHTML) más algunos atributos especiales en un espacio de nombres XML; se puede ver con un navegador y un diseñador puede modificarlo de forma segura.

Hay soporte para macros y también para internacionalización y localización :

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

Si hay traducciones del contenido disponibles, se utilizan.

Sin embargo, no sé mucho sobre la implementación de Java .

15 kapildas Jul 22 2013 at 12:59

El uso de scriptlets en JSP no es una buena práctica.

En su lugar, puede utilizar:

  1. Etiquetas JSTL
  2. Expresiones EL
  3. Etiquetas personalizadas: puede definir sus propias etiquetas para usar.

Por favor refiérase a:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
14 Razvan Mar 16 2014 at 00:17

Claro, reemplácelo <%! counter++; %>por una arquitectura de productor-consumidor de eventos, donde se notifica a la capa empresarial sobre la necesidad de incrementar el contador, reacciona en consecuencia y notifica a los presentadores para que actualicen las vistas. Se trata de una serie de transacciones de la base de datos, ya que en el futuro necesitaremos conocer el valor nuevo y antiguo del contador, quién lo ha incrementado y con qué finalidad. Obviamente, la serialización está involucrada, ya que las capas están completamente desacopladas. Podrá incrementar su contador sobre RMI, IIOP, SOAP. Pero solo se requiere HTML, que no implementa, ya que es un caso tan mundano. Su nuevo objetivo es alcanzar 250 incrementos por segundo en su nuevo y brillante servidor E7, 64GB RAM.

Tengo más de 20 años en programación, la mayoría de los proyectos fracasan antes del sexteto: Reusabilidad Reemplazabilidad OO-capacidad Depurabilidad Testabilidad Mantenibilidad incluso es necesaria. Otros proyectos, dirigidos por personas que solo se preocupaban por la funcionalidad, tuvieron un gran éxito. Además, la estructura rígida del objeto, implementada demasiado pronto en el proyecto, hace que el código no pueda adaptarse a los cambios drásticos en las especificaciones (también conocido como ágil).

Por tanto, considero una postergación la actividad de definir "capas" o estructuras de datos redundantes, ya sea al principio del proyecto o cuando no se requiera específicamente.  

11 mel3kings Jun 14 2013 at 16:31

Técnicamente, todos los JSP se convierten en Servlets durante el tiempo de ejecución .

JSP se creó inicialmente con el propósito de desacoplar la lógica de negocio y la lógica de diseño, siguiendo el patrón MVC. Entonces JSP es técnicamente todo el código Java durante el tiempo de ejecución.

Pero para responder a la pregunta, las bibliotecas de etiquetas se utilizan generalmente para aplicar lógica (eliminar el código Java) a las páginas JSP.

8 Yster Dec 24 2015 at 18:47

¿Cómo puedo evitar el código Java en archivos JSP?

Puede utilizar etiquetas de biblioteca de pestañas como JSTL además de Expression Language ( EL ). Pero EL no funciona bien con JSP. Por lo tanto, probablemente sea mejor eliminar JSP por completo y usar Facelets .

Facelets es el primer lenguaje de declaración de páginas no JSP diseñado para JSF (Java Server Faces) que proporcionó un modelo de programación más simple y poderoso para los desarrolladores de JSF en comparación con JSP. Resuelve diferentes problemas que ocurren en JSP para el desarrollo de aplicaciones web.

Fuente

8 AjayTakur Apr 02 2012 at 20:52

Si usamos las siguientes cosas en una aplicación web Java, el código Java se puede eliminar del primer plano del archivo JSP.

  1. Use la arquitectura MVC para una aplicación web

  2. Usar etiquetas JSP

una. Etiquetas estándar

B. Etiquetas personalizadas

  1. Lenguaje de expresión
4 adn.911 Nov 30 2017 at 22:59

El uso de Scriptlets es una forma muy antigua y no se recomienda. Si desea generar algo directamente en sus páginas JSP, simplemente use Expression Language (EL) junto con JSTL .

También hay otras opciones, como usar un motor de plantillas como Velocity, Freemarker, Thymeleaf, etc. Pero usar JSP simple con EL y JSTL sirve para mi propósito la mayor parte del tiempo y también parece el más simple para un principiante.

Además, tenga en cuenta que no es una buena práctica hacer lógica empresarial en la capa de vista. Debe realizar su lógica empresarial en la capa de servicio y pasar el resultado de salida a sus vistas a través de un controlador .

3 SumeshTG Jun 20 2018 at 20:49

Use un marco de JavaScript Backbone.js o similar a AngularJS para el diseño de la interfaz de usuario y obtenga los datos usando una API REST. Esto eliminará por completo la dependencia de Java de la interfaz de usuario.

3 Eduardo Dec 13 2017 at 02:45

Ya no se usa nada de eso, amigo. Mi consejo es desacoplar la vista (CSS, HTML, JavaScript, etc.) del servidor.

En mi caso, hago que mis sistemas manejen la vista con Angular y todos los datos necesarios se obtienen del servidor mediante los servicios REST.

Créame, esto cambiará su forma de diseñar.

3 AlirezaFattahi Apr 12 2016 at 21:55

JSP 2.0 tiene una función llamada "Archivos de etiquetas" , y puede escribir etiquetas sin código Java externo y tld. Necesita crear un .tagarchivo e insertarlo WEB-INF\tags. Incluso puede crear una estructura de directorio para empaquetar sus etiquetas.

Por ejemplo:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

Úselo como

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

Además, puede leer el cuerpo de la etiqueta fácilmente:

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

Úselo:

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

Los ejemplos son muy simples, pero aquí puede realizar muchas tareas complicadas. Por favor, considere que puede utilizar otras etiquetas (por ejemplo: JSTLque tiene como etiquetas que controlan if/forEcah/chosenla manipulación de texto como format/contains/uppercase, o incluso etiquetas de SQL select/update), pasar todos los parámetros tipo, por ejemplo Hashmap, el acceso session, request... en el archivo de etiqueta también.

Los archivos de etiquetas se desarrollan tan fácilmente, ya que no es necesario reiniciar el servidor al cambiarlos, como los archivos JSP. Esto los hace fáciles de desarrollar.

Incluso si usa un marco como Struts 2, que tiene muchas etiquetas buenas, puede encontrar que tener sus propias etiquetas puede reducir mucho su código. Puede pasar los parámetros de su etiqueta a struts y de esta manera personalizar su etiqueta de marco.

Puede usar etiquetas no solo para evitar Java, sino también para minimizar sus códigos HTML. Yo mismo trato de revisar el código HTML y crear muchas etiquetas tan pronto como veo que los códigos duplicados comienzan en mis páginas.

(Incluso si terminas usando Java en tu código JSP, lo cual espero que no, puedes encapsular ese código en una etiqueta).

1 Mehdi Dec 01 2018 at 23:04
  1. Haga sus valores y parámetros dentro de sus clases de servlet
  2. Obtenga esos valores y parámetros dentro de su JSP usando JSTL / Taglib

¡Lo bueno de este enfoque es que su código también es código HTML!

1 Code_Mode Jul 08 2017 at 03:24

Como dicen muchas respuestas, use JSTL o cree sus propias etiquetas personalizadas. Aquí hay una buena explicación sobre cómo crear etiquetas personalizadas.

bhanwarrathore Jul 15 2016 at 12:48

Al usar etiquetas JSTL junto con expresiones EL, puede evitar esto. Pon lo siguiente en tu página JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>