java <% - ¿Cuál es la diferencia entre incluir archivos con la directiva de inclusión JSP, incluir acciones de JSP y usar archivos de etiquetas JSP?




include ejemplo (5)

Parece que hay dos métodos para crear plantillas con JSP. Incluyendo archivos con una de estas declaraciones

<%@ include file="foo.html" %>
<jsp:include page="foo.html" />

o usando archivos de etiquetas JSP

// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
    <jsp:doBody/>
</body>
</html>

Y en otra página JSP llámala con

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

<t:mytag>
    <h1>Hello World</h1>
</t:mytag>

Entonces, ¿qué método debo usar? ¿Se considera ahora que uno está obsoleto o ambos son válidos y cubren diferentes casos de uso?

Editar

¿No usar este archivo de etiqueta es lo mismo que usar un incluir?

// Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>

Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>

Y llámalo a otro JSP con

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

<t:product>
    <c:forEach items="${cart.products}" var="product">
        <t:product product="${product}"/>
    </c:forEach>
</t:product>

Eso me parece que es lo mismo que usar un parámetro de inclusión y pasarlo. Entonces, ¿los archivos de etiquetas son lo mismo que incluye?


Answers

Las tres opciones de plantilla - <%@include> , <jsp:include> y <%@tag> son válidas, y las tres cubren diferentes casos de uso.

Con <@include> , el analizador JSP inserta el contenido del archivo incluido en el JSP antes de la compilación (similar a C #include ). Utilizaría esta opción con contenido simple y estático: por ejemplo, si desea incluir encabezado, pie de página o elementos de navegación en cada página de su aplicación web. El contenido incluido se convierte en parte del JSP compilado y no hay costo adicional en tiempo de ejecución.

<jsp:include> (y <c:import> JSTL, que es similar e incluso más potente) se adaptan mejor al contenido dinámico. Úselos cuando necesite incluir contenido de otra URL, local o remota; cuando el recurso que estás incluyendo es dinámico; o cuando el contenido incluido usa variables o definiciones de beans que entran en conflicto con la página que incluye. <c:import> también le permite almacenar el texto incluido en una variable, que puede manipular o reutilizar. Ambos incurren en un costo de tiempo de ejecución adicional para el envío: esto es mínimo, pero debe tener en cuenta que la inclusión dinámica no es "gratuita".

Use los archivos de etiquetas cuando desee crear componentes de interfaz de usuario reutilizables. Si tiene una Lista de widgets, por ejemplo, y quiere iterar sobre los widgets y mostrar las propiedades de cada uno (en una tabla, o en un formulario), crearía una etiqueta. Las etiquetas pueden tomar argumentos, usando <%@tag attribute> y estos argumentos pueden ser obligatorios u opcionales, algo así como los parámetros del método.

Los archivos de etiquetas son un mecanismo más simple basado en JSP para escribir bibliotecas de etiquetas, que (antes de JSP 2.0) tenías que escribir usando código Java. Es mucho más limpio escribir archivos de etiquetas JSP cuando hay mucho renderizado que hacer en la etiqueta: no es necesario mezclar código Java y HTML como lo haría si escribiera sus etiquetas en Java.


La principal ventaja de <jsp:include /> sobre <%@ include > es:

<jsp:include /> permite pasar parámetros

<jsp:include page="inclusion.jsp">
    <jsp:param name="menu" value="objectValue"/>
</jsp:include>

lo cual no es posible en <%@include file="somefile.jsp" %>


Java revisitado

  1. El recurso incluido por la directiva include se carga durante el tiempo de traducción jsp, mientras que el recurso incluido por la acción include se carga durante el tiempo de solicitud.
  2. Cualquier cambio en el recurso incluido no será visible en caso de directiva de inclusión hasta que el archivo jsp vuelva a compilarse. Mientras que en caso de incluir acción, cualquier cambio en el recurso incluido será visible en la siguiente solicitud.
  3. Incluir directiva es importación estática, mientras que incluir acción es importación dinámica
  4. La directiva include usa el atributo de archivo para especificar el recurso que se incluirá, mientras que incluye el atributo de página de uso de acción para el mismo propósito.

Posible pregunta duplicada

<@include> - La etiqueta directiva ordena al compilador JSP fusionar los contenidos del archivo incluido en el JSP antes de crear el código del servlet generado. Es el equivalente a cortar y pegar el texto de su página de inclusión directamente en su JSP.

  • Solo se ejecuta un servlet en tiempo de ejecución.
  • Se puede acceder a las variables de Scriptlet declaradas en la página primaria en la página incluida (recuerde, son la misma página).
  • La página incluida no necesita ser compilada como una JSP independiente. Puede ser un fragmento de código o texto sin formato. La página incluida nunca se compilará como independiente. La página incluida también puede tener cualquier extensión, aunque .jspf se ha convertido en una extensión usada convencionalmente.
  • Una desventaja de los contenedores más antiguos es que los cambios en las páginas de inclusión pueden no tener efecto hasta que se actualice la página principal. Las versiones recientes de Tomcat verificarán las páginas de inclusión para las actualizaciones y forzarán una recompilación del padre si se actualizan.
  • Un inconveniente adicional es que, dado que el código está incrustado directamente en el método de servicio del servlet generado, el método puede crecer muy grande. Si supera 64 KB, es probable que su compilación JSP falle.

<jsp:include> - Por otro lado, la etiqueta de acción JSP ordena al contenedor detener la ejecución de esta página, ejecutar la página incluida y fusionar el resultado de esa página en el resultado de esta página.

  • Cada página incluida se ejecuta como un servlet separado en tiempo de ejecución.
  • Las páginas se pueden incluir condicionalmente en tiempo de ejecución. Esto a menudo es útil para plantillas de marcos que incluyen páginas compiladas. La página primaria puede determinar qué página, si corresponde, se debe incluir de acuerdo con alguna condición de tiempo de ejecución.
  • Los valores de las variables scriptlet deben pasarse explícitamente a la página de inclusión.
  • La página incluida debe poder ejecutarse por sí misma.
  • Es menos probable que se produzcan errores de compilación debido a que se excede el tamaño máximo del método en la clase de servlet generada.

Según sus necesidades, puede usar <@include> o <jsp:include>


                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    




java jsp include jsp-tags tagfile