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í.