Es gibt anscheinend zwei Methoden für das Templating mit JSP. Einschließen von Dateien mit einer dieser Anweisungen
<%@ include file="foo.html" %>
<jsp:include page="foo.html" />
oder mit JSP-Tag-Dateien
// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<jsp:doBody/>
</body>
</html>
Und in einer anderen JSP-Seite rufen Sie es mit
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:mytag>
<h1>Hello World</h1>
</t:mytag>
Also, welche Methode soll ich verwenden? Wird einer jetzt als veraltet betrachtet oder sind beide gültig und decken unterschiedliche Anwendungsfälle ab?
Bearbeiten
Entspricht die Verwendung dieser Tag-Datei nicht der Verwendung eines Include?
// Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>
Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>
Und rufen Sie es auf einer anderen JSP mit
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:product>
<c:forEach items="${cart.products}" var="product">
<t:product product="${product}"/>
</c:forEach>
</t:product>
Das scheint mir das gleiche zu sein, als würde man ein Include verwenden und Parameter an dieses übergeben. Sind Tag-Dateien also mit Includes identisch?
Es gibt verschiedene Mechanismen zur Wiederverwendung von Inhalten in einer JSP-Datei.
Die folgenden 4 Mechanismen zum Einschließen von Inhalten in JSP können als direkte Wiederverwendung kategorisiert werden:
(für die ersten 3 Mechanismen aus "Head First Servlets und JSP" )
1) Die include-Direktive:
<%@ include file="header.html" %>
Statisch : Fügt den Inhalt aus dem Wert des Dateiattributs zur aktuellen Seite zur Übersetzungszeit hinzu. Die Direktive war ursprünglich für statische Layoutvorlagen wie HTML-Header gedacht.
2) Die
<jsp:include>
Standardaktion:<jsp:include page="header.jsp" />
Dynamisch : Fügt den Inhalt aus dem Wert des Seitenattributs zur aktuellen Seite zur Anforderungszeit hinzu. War eher für dynamische Inhalte gedacht, die von JSPs stammen.
3) Die
<c:import>
JSTL-Tag:<c:import url=”http://www.example.com/foo/bar.html” />
Dynamisch : Fügt den Inhalt aus dem Wert des URL-Attributs zur aktuellen Seite hinzu , zur Anforderungszeit . Es funktioniert sehr ähnlich wie
<jsp:include>
, aber es ist leistungsfähiger und flexibler: Im Gegensatz zu den beiden anderen enthält das<c:import>
URL kann von außerhalb des Webcontainers sein !4) Präludien und Coden:
Statisch : Vorspiele und Kodas können nur auf den Anfang und das Ende von Seiten angewendet werden.
Sie können implizit Präludien (auch Kopfzeilen genannt) und Kodas (auch Fußzeilen genannt) für eine Gruppe von JSP-Seiten einfügen, indem Sie<include-prelude>
und<include-coda>
Elemente innerhalb eines<jsp-property-group>
-Element in der Webanwendung web.xml Implementierungsdeskriptor. Lesen Sie hier mehr:
• Implizite Includes am Anfang und Ende von JSPs konfigurieren
• Definieren impliziter Includes
Tag-Datei ist eine indirekte Methode zur Wiederverwendung von Inhalten, mit der wiederverwendbare Inhalte gekapselt werden . Eine Tag-Datei ist eine Quelldatei, die ein Fragment von JSP-Code enthält, das als benutzerdefiniertes Tag wiederverwendet werden kann.
Der Zweck von Includes und Tag-Dateien ist unterschiedlich.
Tag-Datei (ein mit JSP 2.0 eingeführtes Konzept) ist eine der Optionen zum Erstellen benutzerdefinierter Tags . Es ist eine schnellere und einfachere Möglichkeit, benutzerdefinierte Tags zu erstellen. Benutzerdefinierte Tags , auch als Tag-Erweiterungen bezeichnet, sind JSP-Elemente, die benutzerdefinierte Logik und Ausgabe von anderen Java ermöglichen In JSP-Seiten einzufügende Komponenten Die über ein benutzerdefiniertes Tag bereitgestellte Logik wird von einem Java -Objekt, das als Tag-Handler bezeichnet wird implementiert.
Einige Beispiele für Aufgaben, die von benutzerdefinierten Tags ausgeführt werden können, umfassen das Bearbeiten impliziter Objekte, das Verarbeiten von Formularen, den Zugriff auf Datenbanken und andere Unternehmensdienste wie E-Mail und Verzeichnisse sowie das Implementieren der Ablaufsteuerung.
Vielleicht gibt es in Ihrem Beispiel (in Ihrem Edit) keinen Unterschied zwischen der Verwendung von Direct Include und einer Tag-Datei. Aber benutzerdefinierte Tags haben eine Vielzahl von Funktionen . Sie können
Angepasst werden durch Attribute, die von der aufrufenden Seite übergeben werden.
Übergeben Sie Variablen zurück an die aufrufende Seite.
Greifen Sie auf alle Objekte zu, die für JSP-Seiten verfügbar sind.
Miteinander kommunizieren. Sie können eine JavaBeans-Komponente erstellen und initialisieren, eine öffentliche EL-Variable erstellen, die auf diese Bean in einem Tag verweist, und die Bean dann in einem anderen Tag verwenden.
Ineinander verschachtelt sein und über private Variablen kommunizieren.
Lesen Sie hierzu auch "Pro JSP 2": Grundlegendes zu benutzerdefinierten JSP-Tags .
Unterschied zwischen Include-Direktive und Include-Aktion in JSP
Sehr informatives und leicht verständliches Tutorial von coreservlet.com mit schönen Erklärungen, die <jsp:include> VS. <%@ include %>
Vergleichstabelle:
Einschließen von Dateien und Applets in JSP-Seiten
Ein weiteres Nizza-Tutorial von coreservlets.com zu Tag-Bibliotheken und Tag-Dateien:
Erstellen von benutzerdefinierten JSP-Tag-Bibliotheken: Die Grundlagen
Das offizielle Java EE 5 Tutorial mit Beispielen:
Kapselung von wiederverwendbaren Inhalten mithilfe von Tag-Dateien .
Diese Seite aus dem offiziellen Java EE 5 Tutorial soll Ihnen noch mehr Verständnis geben:
Wiederverwenden von Inhalten in JSP-Seiten .
In diesem Auszug aus dem Buch "Pro JSP 2" wird auch erläutert , warum Sie eine Tag-Datei benötigen, anstatt statisches Include zu verwenden:
Wiederverwenden von Inhalten mit Tag-Dateien
Verwenden Sie für jede Aufgabe die richtigen Werkzeuge.
Verwenden Sie Tag Files, um schnell und einfach benutzerdefinierte Tags zu erstellen helfen Ihnen wiederverwendbare Inhalte einkapseln.
Bezüglich des Einschlusses von Inhalten in JSP (Zitat aus hier ):
- Verwenden Sie die include-Direktive , wenn sich die Datei selten ändert. Es ist der schnellste Mechanismus. Wenn Ihr Container Änderungen nicht automatisch erkennt, können Sie erzwingen, dass die Änderungen wirksam werden, indem Sie die Klassendatei der Hauptseite löschen.
- Verwenden Sie die Einschlussaktion nur für Inhalte, die häufig geändert werden und wenn nicht entschieden werden kann, welche Seite eingeschlossen werden soll, bis die Hauptseite angefordert wird.
<@include>
- Das Direktiventag weist den JSP-Compiler an, den Inhalt der enthaltenen Datei mit der JSP zusammenzuführen, bevor der generierte Servlet-Code erstellt wird. Dies entspricht dem Ausschneiden und Einfügen des Texts von Ihrer Include-Seite direkt in Ihre JSP.
<jsp:include>
- Das JSP-Aktionstag weist den Container andererseits an, die Ausführung dieser Seite anzuhalten, die enthaltene Seite auszuführen und die Ausgabe dieser Seite mit der Ausgabe dieser Seite zusammenzuführen.
Abhängig von Ihren Anforderungen können Sie entweder
<@include>
oder<jsp:include>
Der Hauptvorteil von <jsp:include />
Gegenüber <%@ include >
Ist:
Mit <jsp:include />
Können Parameter übergeben werden
<jsp:include page="inclusion.jsp">
<jsp:param name="menu" value="objectValue"/>
</jsp:include>
was in <%@include file="somefile.jsp" %>
nicht möglich ist
Alle drei Vorlagenoptionen - <%@include>
, <jsp:include>
Und <%@tag>
Sind gültig und decken unterschiedliche Anwendungsfälle ab.
Mit <@include>
Fügt der JSP-Parser den Inhalt der enthaltenen Datei vor dem Kompilieren in die JSP ein (ähnlich wie mit C #include
). Sie würden diese Option mit einfachen, statischen Inhalten verwenden: Wenn Sie beispielsweise Kopf-, Fuß- oder Navigationselemente in jede Seite Ihrer Web-App einfügen möchten. Der enthaltene Inhalt wird Teil der kompilierten JSP, und zur Laufzeit fallen keine zusätzlichen Kosten an.
<jsp:include>
(Und JSTLs <c:import>
, Die ähnlich und noch leistungsfähiger sind) eignen sich am besten für dynamische Inhalte. Verwenden Sie diese, wenn Sie Inhalte von einer anderen lokalen oder entfernten URL einschließen müssen. wenn die von Ihnen eingeschlossene Ressource selbst dynamisch ist; oder wenn der eingeschlossene Inhalt Variablen oder Bean-Definitionen verwendet, die mit der eingeschlossenen Seite in Konflikt stehen. Mit <c:import>
Können Sie den enthaltenen Text auch in einer Variablen speichern, die Sie weiter bearbeiten oder wiederverwenden können. Beides verursacht zusätzliche Laufzeitkosten für den Versand: Dies ist minimal, aber Sie müssen sich bewusst sein, dass das dynamische Include nicht "frei" ist.
Verwenden Sie Tag-Dateien, wenn Sie wiederverwendbare Benutzeroberflächenkomponenten erstellen möchten. Wenn Sie beispielsweise über eine Liste von Widgets verfügen und die Widgets durchlaufen und die jeweiligen Eigenschaften anzeigen möchten (in einer Tabelle oder in einem Formular), erstellen Sie ein Tag. Tags können mit <%@tag attribute>
Argumente annehmen, und diese Argumente können entweder obligatorisch oder optional sein - ähnlich wie Methodenparameter.
Tag-Dateien sind ein einfacherer, JSP-basierter Mechanismus zum Schreiben von Tag-Bibliotheken, den Sie (vor JSP 2.0) mit Java= Code) schreiben mussten Viel Rendern im Tag: Sie müssen nicht Java und HTML-Code mischen, wie Sie es tun müssten, wenn Sie Ihre Tags in Java geschrieben hätten.