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.
J'ai créé une bibliothèque de balises d'héritage de modèle JSP assez simple. https://github.com/kwon37xi/jsp-template-inheritance
Je pense que cela facilite la gestion des mises en page sans courbe d'apprentissage.
exemple de code:
base.jsp: mise en page
view.jsp: contenu
la source
Basé sur la même idée de base que dans la réponse de @Will Hartung , voici mon moteur de modèle extensible à une balise magique. Il comprend même de la documentation et un exemple :-)
WEB-INF / tags / block.tag:
la source
Utilisez des tuiles . Cela m'a sauvé la vie.
Mais si vous ne le pouvez pas, il y a la balise include , ce qui la rend similaire à php.
La balise body pourrait ne pas faire ce dont vous avez besoin, sauf si vous avez un contenu super simple. La balise body est utilisée pour définir le corps d'un élément spécifié. Jetez un œil à cet exemple :
Vous spécifiez le nom de l'élément, tous les attributs que l'élément pourrait avoir ("lang" dans ce cas), puis le texte qui y est contenu - le corps. Donc si
content.headerName = h1
,content.lang = fr
, etcontent.body = Heading in French
Ensuite, la sortie serait
la source
Cela peut également être réalisé avec jsp: include. Chad Darby explique bien ici dans cette vidéo https://www.youtube.com/watch?v=EWbYj0qoNHo
la source
ajouter des dépendances à utiliser <% @ tag description = "Modèle de page utilisateur" pageEncoding = "UTF-8"%>
la source
Je sais que cette réponse vient des années après le fait et il y a déjà une excellente réponse JSP par Will Hartung, mais il y a des Facelets, ils sont même mentionnés dans les réponses de la question liée dans la question d'origine.
Description de la balise SO des facettes
Malheureusement, la meilleure description de tutoriel simple que j'ai trouvée était sur Wikipédia et non sur un site de tutoriel. En fait, la section décrivant les modèles va même dans le sens de ce que la question initiale demandait.
En raison du fait que Java-EE 6 a rendu JSP obsolète, je recommanderais d'utiliser Facelets malgré le fait qu'il semble qu'il pourrait y en avoir plus pour peu ou pas de gain sur JSP.
la source