Comme skaffman a suggéré , Fichiers de balises JSP 2.0 sont les abeilles à genoux.
Prenons un 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 que cela fait.
Alors, élargissons le propos à 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 ça vous rapporte ? Beaucoup de choses, mais il y a 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 ayons une variable utilisateur dans la requête)
<%@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 de l'utilisateur à d'autres endroits. Donc, nous allons le remanier. 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>
L'intérêt des fichiers de balises JSP est qu'ils vous permettent de baliser des balises génériques et de les remanier à votre guise.
JSP Tag Files
ont plutôt usurpé des choses comme Tiles
etc., du moins pour moi. Je les trouve beaucoup plus faciles à utiliser car la seule structure est celle que vous lui donnez, rien de préconçu. De plus, vous pouvez utiliser les fichiers de balises JSP pour d'autres choses (comme le fragment de détails sur l'utilisateur ci-dessus).
Voici un exemple similaire à celui de DisplayTag que j'ai réalisé, mais tout est fait avec les fichiers de balises (et la fonction Stripes
c'est le cadre s : tags..). Il en résulte un tableau de lignes, des couleurs alternées, une navigation dans la page, 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="http://stackoverflow.com/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 est d'ajouter du code de scriptlet Java, mais ce n'est pas une limitation aussi importante que vous pourriez le penser. Si j'ai besoin d'un script, je mets simplement la logique dans une balise et j'insère la balise. C'est facile.
Ainsi, les fichiers de balises peuvent être à peu près ce que vous voulez qu'ils soient. Au niveau le plus élémentaire, il s'agit d'un simple copier-coller de refactoring. Prenez une partie de la mise en page, découpez-la, effectuez un paramétrage simple et remplacez-la par une invocation de balise.
À un niveau plus élevé, vous pouvez faire des choses sophistiquées comme cette balise de table que j'ai ici.