Comme l'a suggéré skaffman , les fichiers de balises JSP 2.0 sont les genoux de l'abeille.
Prenons votre exemple simple.
Mettez ce qui suit dans WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Maintenant dans votre example.jsp
page:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Cela fait exactement ce que vous pensez qu'il fait.
Donc, élargissons cela à quelque chose d'un peu plus général.
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>
Pour l'utiliser:
<%@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'est-ce que cela vous rapporte? Beaucoup, mais ça va encore mieux ...
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>
Pour l'utiliser: (supposons que nous avons une variable utilisateur dans la demande)
<%@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>
Mais il s'avère que vous aimez utiliser ce bloc de détails utilisateur à d'autres endroits. Donc, nous allons le refactoriser.
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/>
Maintenant, l'exemple précédent devient:
<%@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 beauté des fichiers JSP Tag est qu'ils vous permettent essentiellement de baliser un balisage générique, puis de le refactoriser selon le contenu de votre cœur.
JSP Tag Files
ont à peu près usurpé des choses comme Tiles
etc., du moins pour moi. Je les trouve beaucoup plus faciles à utiliser car la seule structure est ce que vous lui donnez, rien de préconçu. De plus, vous pouvez utiliser des fichiers de balises JSP pour d'autres choses (comme le fragment de détails utilisateur ci-dessus).
Voici un exemple similaire à DisplayTag que j'ai fait, mais tout cela est fait avec des fichiers de balises (et le Stripes
cadre, c'est le s: tags ..). Il en résulte un tableau de lignes, des couleurs alternées, la navigation dans les pages, 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>
Bien sûr, les balises fonctionnent avec le JSTL tags
(comme c:if
, etc.). La seule chose que vous ne pouvez pas faire dans le corps d'une balise de fichier de balises est d'ajouter du code de scriptlet Java, mais ce n'est pas autant une limitation que vous pourriez le penser. Si j'ai besoin de trucs de scriptlet, je viens de mettre la logique dans une balise et de la déposer. Facile.
Ainsi, les fichiers de balises peuvent être à peu près tout ce que vous voulez qu'ils soient. Au niveau le plus élémentaire, c'est un simple refactoring par copier-coller. Prenez un morceau de mise en page, découpez-le, effectuez un paramétrage simple et remplacez-le par un appel de balise.
À un niveau supérieur, vous pouvez faire des choses sophistiquées comme cette balise de table que j'ai ici.