Come ha suggerito skaffman , i file di tag JSP 2.0 sono le ginocchia dell'ape.
Facciamo il tuo semplice esempio.
Inserisci quanto segue WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Ora nella tua example.jsp
pagina:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Questo fa esattamente quello che pensi che faccia.
Quindi, espandiamoci su qualcosa di più generale.
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>
Per usare questo:
<%@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>
Cosa ti compra? Molto davvero, ma migliora ancora ...
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>
Per usare questo: (supponiamo di avere una variabile utente nella richiesta)
<%@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>
Ma ti piace usare quel blocco dettagli utente in altri luoghi. Quindi, lo refatteremo.
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/>
Ora l'esempio precedente diventa:
<%@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 bellezza dei file tag JSP è che ti consente sostanzialmente di taggare il markup generico e quindi di rifattorizzarlo in base al contenuto del tuo cuore.
JSP Tag Files
ho praticamente usurpato cose come Tiles
ecc., almeno per me. Li trovo molto più facili da usare in quanto l'unica struttura è ciò che gli dai, niente di preconcetto. Inoltre puoi usare i file tag JSP per altre cose (come il frammento di dettaglio dell'utente sopra).
Ecco un esempio simile a DisplayTag che ho fatto, ma questo è tutto fatto con Tag Files (e il Stripes
framework, questo è il s: tags ..). Ciò si traduce in una tabella di righe, alternando colori, navigazione della pagina, ecc:
<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>
Ovviamente i tag funzionano con JSTL tags
(like c:if
, ecc.). L'unica cosa che non puoi fare all'interno del corpo di un tag file tag è aggiungere codice scriptlet Java, ma questo non è un limite tanto quanto potresti pensare. Se ho bisogno di materiale scriptlet, inserisco semplicemente la logica in un tag e inserisco il tag. Facile.
Quindi, i file tag possono essere praticamente qualsiasi cosa tu voglia che siano. Al livello più elementare, si tratta di un semplice refactoring. Prendi un pezzo di layout, ritaglialo, esegui una semplice parametrizzazione e sostituiscilo con un richiamo di tag.
A un livello superiore, puoi fare cose sofisticate come questo tag da tavolo che ho qui.