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.
Ich habe ganz einfach eine JSP-Vorlagen-Vererbungs-Tag-Bibliothek im Django-Stil erstellt. https://github.com/kwon37xi/jsp-template-inheritance
Ich denke, es ist einfach, Layouts ohne Lernaufwand zu verwalten.
Beispielcode:
base.jsp: layout
view.jsp: Inhalt
quelle
Basierend auf der gleichen Grundidee wie in @Will Hartung Antwort von , hier ist meine magische erweiterbare Template-Engine mit einem Tag. Es enthält sogar Dokumentation und ein Beispiel :-)
WEB-INF / tags / block.tag:
quelle
Verwenden Sie Fliesen . Es hat mein Leben gerettet.
Wenn Sie dies nicht können, gibt es das Include-Tag , das es ähnlich wie PHP macht.
Das Body-Tag macht möglicherweise nicht das, was Sie brauchen, es sei denn, Sie haben einen supereinfachen Inhalt. Das Body-Tag wird verwendet, um den Body eines angegebenen Elements zu definieren. Schauen Sie sich dieses Beispiel an :
Sie geben den Elementnamen, alle Attribute an, die das Element möglicherweise hat (in diesem Fall "lang"), und dann den darin enthaltenen Text - den Body. Also wenn
content.headerName = h1
,content.lang = fr
, undcontent.body = Heading in French
Dann wäre die Ausgabe
quelle
Dies kann auch mit jsp: include erreicht werden. Chad Darby erklärt dies hier in diesem Video https://www.youtube.com/watch?v=EWbYj0qoNHo
quelle
Fügen Sie Abhängigkeiten zur Verwendung hinzu. <% @ tag description = "Benutzerseitenvorlage" pageEncoding = "UTF-8"%>
quelle
Ich weiß, dass diese Antwort Jahre später kommt und es bereits eine großartige JSP-Antwort von Will Hartung gibt, aber es gibt Facelets, die sogar in den Antworten der verknüpften Frage in der ursprünglichen Frage erwähnt werden.
Facelets SO-Tag-Beschreibung
Leider war die beste einfache Tutorial-Beschreibung, die ich gefunden habe, auf Wikipedia und keine Tutorial-Site. Tatsächlich entspricht der Abschnitt, in dem Vorlagen beschrieben werden, sogar dem, was in der ursprünglichen Frage gefordert wurde.
Aufgrund der Tatsache, dass Java-EE 6 JSP veraltet hat, würde ich Facelets empfehlen, obwohl es den Anschein hat, dass mehr für wenig bis gar keinen Gewinn gegenüber JSP erforderlich ist.
quelle