Wie von Skaffman vorgeschlagen , JSP 2.0-Tag-Dateien die Knie der Biene.
Nehmen wir Ihr einfaches Beispiel.
Geben Sie Folgendes ein WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Jetzt auf Ihrer example.jsp
Seite:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Das macht genau das, was Sie denken.
Lassen Sie uns das auf etwas allgemeineres erweitern.
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>
So verwenden Sie:
<%@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>
Was kauft dir das? Wirklich viel, aber es wird noch besser ...
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>
Um dies zu verwenden: (Angenommen, wir haben eine Benutzervariable in der Anfrage)
<%@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>
Es stellt sich jedoch heraus, dass Sie diesen Benutzerdetailblock gerne an anderen Stellen verwenden. Also werden wir es umgestalten.
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/>
Das vorherige Beispiel lautet nun:
<%@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>
Das Schöne an JSP-Tag-Dateien ist, dass Sie damit generisches Markup markieren und es dann nach Herzenslust umgestalten können.
JSP Tag Files
habe so ziemlich Dinge wie Tiles
etc. usurpiert , zumindest für mich. Ich finde sie viel einfacher zu benutzen, da die einzige Struktur das ist, was du gibst, nichts vorgefasstes. Außerdem können Sie JSP-Tag-Dateien für andere Zwecke verwenden (z. B. das obige Benutzerdetailfragment).
Hier ist ein Beispiel, das dem von mir erstellten DisplayTag ähnelt, aber dies alles geschieht mit Tag-Dateien (und dem Stripes
Framework, das sind die s: tags ..). Dies führt zu einer Tabelle mit Zeilen, wechselnden Farben, Seitennavigation usw.:
<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>
Natürlich funktionieren die Tags mit dem JSTL tags
(likec:if
usw.). Das einzige, was Sie im Hauptteil eines Tag-Datei-Tags nicht tun können, ist das Hinzufügen von Java-Scriptlet-Code. Dies ist jedoch keine so große Einschränkung, wie Sie vielleicht denken. Wenn ich Scriptlet-Inhalte benötige, füge ich die Logik einfach in ein Tag ein und füge das Tag ein. Einfach.
Tag-Dateien können also so ziemlich alles sein, was Sie möchten. Auf der einfachsten Ebene ist es einfaches Refactoring zum Ausschneiden und Einfügen. Nehmen Sie einen Teil des Layouts, schneiden Sie ihn aus, führen Sie eine einfache Parametrisierung durch und ersetzen Sie ihn durch einen Tag-Aufruf.
Auf einer höheren Ebene können Sie anspruchsvolle Dinge wie dieses Tabellen-Tag tun, das ich hier habe.