Como sugirió skaffman , los archivos de etiquetas JSP 2.0 son las rodillas de la abeja.
Tomemos su sencillo ejemplo.
Ponga lo siguiente en WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Ahora en tu example.jsp
página:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Eso hace exactamente lo que crees que hace.
Entonces, ampliemos eso a algo un poco más general.
WEB-INF/tags/genericpage.tag
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true" %>
<%@attribute name="footer" fragment="true" %>
<html>
<body>
<div id="pageheader">
<jsp:invoke fragment="header"/>
</div>
<div id="body">
<jsp:doBody/>
</div>
<div id="pagefooter">
<jsp:invoke fragment="footer"/>
</div>
</body>
</html>
Para usar esto:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<p>Hi I'm the heart of the message</p>
</jsp:body>
</t:genericpage>
¿Qué te compra eso? Mucho realmente, pero se pone aún mejor ...
WEB-INF/tags/userpage.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@attribute name="userName" required="true"%>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome ${userName}</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<jsp:doBody/>
</jsp:body>
</t:genericpage>
Para usar esto: (suponga que tenemos una variable de usuario en la solicitud)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
</p>
</t:userpage>
Pero resulta que le gusta usar ese bloque de detalles de usuario en otros lugares. Entonces, lo refactorizaremos.
WEB-INF/tags/userdetail.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@tag import="com.example.User" %>
<%@attribute name="user" required="true" type="com.example.User"%>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
Ahora el ejemplo anterior se convierte en:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
<t:userdetail user="${user}"/>
</p>
</t:userpage>
La belleza de los archivos JSP Tag es que básicamente le permite etiquetar el marcado genérico y luego refactorizarlo al contenido de su corazón.
JSP Tag Files
han usurpado cosas como Tiles
etc., al menos para mí. Los encuentro mucho más fáciles de usar ya que la única estructura es lo que le das, nada preconcebido. Además, puede usar archivos de etiquetas JSP para otras cosas (como el fragmento de detalles del usuario anterior).
Aquí hay un ejemplo que es similar a DisplayTag que he hecho, pero todo esto se hace con Tag Files (y el Stripes
marco, ese es el s: tags ...). Esto da como resultado una tabla de filas, colores alternos, navegación de página, etc.
<t:table items="${actionBean.customerList}" var="obj" css_class="display">
<t:col css_class="checkboxcol">
<s:checkbox name="customerIds" value="${obj.customerId}"
onclick="handleCheckboxRangeSelection(this, event);"/>
</t:col>
<t:col name="customerId" title="ID"/>
<t:col name="firstName" title="First Name"/>
<t:col name="lastName" title="Last Name"/>
<t:col>
<s:link href="/Customer.action" event="preEdit">
Edit
<s:param name="customer.customerId" value="${obj.customerId}"/>
<s:param name="page" value="${actionBean.page}"/>
</s:link>
</t:col>
</t:table>
Por supuesto, las etiquetas funcionan con JSTL tags
(como c:if
, etc.). Lo único que no puede hacer dentro del cuerpo de una etiqueta de archivo de etiqueta es agregar código Java Scriptlet, pero esto no es una limitación tan grande como podría pensar. Si necesito cosas de scriptlet, simplemente pongo la lógica en una etiqueta y la dejo caer. Fácil.
Por lo tanto, los archivos de etiquetas pueden ser prácticamente lo que quieras que sean. En el nivel más básico, es una simple refactorización de cortar y pegar. Tome un trozo de diseño, recórtelo, realice una parametrización simple y reemplácelo con una invocación de etiqueta.
En un nivel superior, puede hacer cosas sofisticadas como esta etiqueta de tabla que tengo aquí.
Hice una biblioteca de etiquetas de herencia de plantilla JSP de estilo Django bastante fácil. https://github.com/kwon37xi/jsp-template-inheritance
Creo que es fácil administrar diseños sin curva de aprendizaje.
código de ejemplo:
base.jsp: diseño
view.jsp: contenido
fuente
Basado en la misma idea básica que en @Will Hartung , aquí está mi motor mágico de plantilla extensible de una etiqueta. Incluso incluye documentación y un ejemplo :-)
WEB-INF / tags / block.tag:
fuente
Usa azulejos . Me salvó la vida.
Pero si no puede, existe la etiqueta include , que lo hace similar a php.
Es posible que la etiqueta del cuerpo no haga lo que necesita, a menos que tenga contenido súper simple. La etiqueta body se usa para definir el cuerpo de un elemento especificado. Echa un vistazo a este ejemplo :
Usted especifica el nombre del elemento, cualquier atributo que ese elemento pueda tener ("lang" en este caso) y luego el texto que lo contiene: el cuerpo. Así que si
content.headerName = h1
,content.lang = fr
ycontent.body = Heading in French
Entonces la salida sería
fuente
Esto también se puede lograr con jsp: include. Chad Darby explica bien aquí en este video https://www.youtube.com/watch?v=EWbYj0qoNHo
fuente
agregar dependencias para usar <% @ tag description = "Plantilla de página de usuario" pageEncoding = "UTF-8"%>
fuente
Sé que esta respuesta llegará años después del hecho y ya hay una gran respuesta JSP de Will Hartung, pero hay Facelets, incluso se mencionan en las respuestas de la pregunta vinculada en la pregunta original.
Descripción de la etiqueta Facelets SO
Lamentablemente, la mejor descripción de tutorial simple que encontré estaba en Wikipedia y no en un sitio de tutorial. De hecho, la sección que describe las plantillas incluso hace lo mismo que la pregunta original.
Debido al hecho de que Java-EE 6 ha desaprobado JSP, recomendaría usar Facelets a pesar del hecho de que parece que podría ser más necesario para obtener poca o ninguna ganancia sobre JSP.
fuente