Was ist der Unterschied zwischen dem Einschließen von Dateien in die JSP-Include-Direktive, der JSP-Include-Aktion und der Verwendung von JSP-Tag-Dateien?

155

Es scheint, dass es zwei Methoden für das Templating mit JSP gibt. 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 auf einer anderen JSP-Seite rufen Sie es mit auf

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:mytag>
    <h1>Hello World</h1>
</t:mytag>

Also, welche Methode soll ich verwenden? Wird man jetzt als veraltet angesehen oder sind beide gültig und decken unterschiedliche Anwendungsfälle ab?

Bearbeiten

Ist die Verwendung dieser Tag-Datei nicht mit der Verwendung eines Includes identisch?

// 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 nenne 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 dieselben wie Includes?

Überschallknall
quelle

Antworten:

293

Übersicht über JSP-Syntaxelemente

Um die Dinge klarer zu machen, finden Sie hier einen kurzen Überblick über JSP-Syntaxelemente :

  • Anweisungen : Diese enthalten Informationen zur gesamten JSP-Seite.
  • Skriptelemente : Dies sind Java-Codierungselemente wie Deklarationen, Ausdrücke, Scriptlets und Kommentare.
  • Objekte und Bereiche : JSP-Objekte können entweder explizit oder implizit erstellt werden und sind innerhalb eines bestimmten Bereichs zugänglich, z. B. von einer beliebigen Stelle auf der JSP-Seite oder der Sitzung.
  • Aktionen : Diese erstellen Objekte oder wirken sich auf den Ausgabestream in der JSP-Antwort (oder auf beide) aus.

Wie Inhalte in JSP enthalten sind

Es gibt verschiedene Mechanismen zum Wiederverwenden von Inhalten in einer JSP-Datei.

Die folgenden 4 Mechanismen zum Einfügen von Inhalten in JSP können als direkte Wiederverwendung eingestuft werden :
(für die ersten 3 Mechanismen, die aus "Head First Servlets und JSP" zitiert werden )

1) Die Include- Richtlinie :

<%@ 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 Anforderungszeit zur aktuellen Seite hinzu . War eher für dynamische Inhalte gedacht, die von JSPs stammen.

3) Das <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 zur Anforderungszeit hinzu . Es funktioniert sehr ähnlich <jsp:include>, ist aber leistungsfähiger und flexibler: Im Gegensatz zu den beiden anderen Includes kann die <c:import> URL von außerhalb des Webcontainers stammen !

4) Präludien und Codas:

Statisch : Präludien und Codas können nur auf den Anfang und das Ende von Seiten angewendet werden .
Sie können implizit enthalten Präludien (auch als Header) und Coda (auch Fußzeilen genannt) für eine Gruppe von JSP - Seiten durch das Hinzufügen <include-prelude>und <include-coda>Elemente jeweils in einem <jsp-property-group>Element in der Web - Anwendung web.xml Deployment Descriptor. Lesen Sie hier mehr:
Konfigurieren impliziter Includes am Anfang und Ende von JSPs
Definieren impliziter Includes


Die Tag-Datei ist eine indirekte Methode zur Wiederverwendung von Inhalten, bei 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.

Die 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, mit denen benutzerdefinierte Logik und Ausgaben anderer Java-Komponenten in JSP-Seiten eingefügt werden können. Die durch ein benutzerdefiniertes Tag bereitgestellte Logik wird von einem Java-Objekt implementiert, das als Tag-Handler bezeichnet wird .

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 die Implementierung der Flusssteuerung.


In Bezug auf Ihre Bearbeitung

Möglicherweise gibt es in Ihrem Beispiel (in Ihrer Bearbeitung ) keinen Unterschied zwischen der Verwendung von Direct Include und einer Tag-Datei. Aber benutzerdefinierte Tags haben eine breite Palette an Funktionen . Sie können

  • Sie können mithilfe von Attributen angepasst werden, die von der aufrufenden Seite übergeben werden.

  • Übergeben Sie Variablen an die aufrufende Seite zurück.

  • 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 dies auch aus "Pro JSP 2": Grundlegendes zu benutzerdefinierten JSP-Tags .


Nützliches Lesen.


Fazit

Verwenden Sie für jede Aufgabe die richtigen Werkzeuge.


Verwenden Sie Tag-Dateien, um schnell und einfach benutzerdefinierte Tags zu erstellen , mit denen Sie wiederverwendbaren Inhalt kapseln können .

Was den Einschluss von Inhalten in JSP betrifft (Zitat von 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 das Wirksamwerden der Änderungen erzwingen, indem Sie die Hauptseitenklassendatei löschen.
  • Verwenden Sie die Include-Aktion nur für Inhalte, die sich häufig ändern , und ob die einzuschließende Seite erst entschieden werden kann, wenn die Hauptseite angefordert wird.
informatik01
quelle
Aber ist <jsp: include> nicht dasselbe wie die Verwendung von Tag-Dateien? Ich sehe keinen Unterschied ... Sie können Variablen an Dateien übergeben, die in <jsp: include> enthalten sind, genauso wie Sie Variablen an Tag-Dateien übergeben können. Mit beiden Methoden können Sie Inhalte wiederverwenden. Sie scheinen genau dasselbe zu tun. Gibt es einen Unterschied zwischen ihnen außer ihren Namen?
Sonicboom
@sonicboom Aktualisiert meine Antwort
informatik01
1
@ informatik01 sehr schöne Antwort, ich schätze die Tiefe, die schöne Formatierung und die sehr praktische 4-Mechanismen-Liste.
Russell Silva
1
Was genau ist der Vorteil von <jsp: include> gegenüber <* @ include url ..>?
Krsna Chaitanya
@KrsnaChaitanya Hinweis: *Die include-Direktive enthält einen Tippfehler (das Sternchen ). <jsp:include>ist eine Standard-Include- Aktion , <%@ include file="" %>ist die Include- Direktive . Lesen Sie den letzten Abschnitt (im grauen Feld), in dem die Vorteile beschrieben werden (dh Empfehlungen, wann Sie den einen oder anderen auswählen sollten). Lesen Sie auch diesen Artikel für die detaillierte Beschreibung. Hoffe das hilft.
informatik01
21

Mögliche doppelte Frage

<@include>- Das Direktiven-Tag weist den JSP-Compiler an, den Inhalt der enthaltenen Datei in 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.

  • Zur Laufzeit wird nur ein Servlet ausgeführt.
  • Auf die auf der übergeordneten Seite deklarierten Scriptlet-Variablen kann auf der enthaltenen Seite zugegriffen werden (denken Sie daran, dass es sich um dieselbe Seite handelt).
  • Die enthaltene Seite muss nicht als eigenständige JSP kompiliert werden können. Es kann sich um ein Codefragment oder einen einfachen Text handeln. Die enthaltene Seite wird niemals als eigenständige Seite kompiliert. Die enthaltene Seite kann auch eine beliebige Erweiterung haben, obwohl .jspf zu einer herkömmlich verwendeten Erweiterung geworden ist.
  • Ein Nachteil älterer Container besteht darin, dass Änderungen an den Include-Seiten möglicherweise erst wirksam werden, wenn die übergeordnete Seite aktualisiert wird. Neuere Versionen von Tomcat überprüfen die Include-Seiten auf Aktualisierungen und erzwingen eine Neukompilierung des übergeordneten Elements, wenn diese aktualisiert werden.
  • Ein weiterer Nachteil besteht darin, dass die Methode sehr groß werden kann, da der Code direkt in die Servicemethode des generierten Servlets eingefügt wird. Wenn es 64 KB überschreitet, schlägt Ihre JSP-Kompilierung wahrscheinlich fehl.

<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.

  • Jede enthaltene Seite wird zur Laufzeit als separates Servlet ausgeführt.
  • Seiten können zur Laufzeit bedingt aufgenommen werden. Dies ist häufig nützlich, um Frameworks zu erstellen, die Seiten aus Includes erstellen. Die übergeordnete Seite kann bestimmen, welche Seite, falls vorhanden, gemäß einer Laufzeitbedingung aufgenommen werden soll.
  • Die Werte von Scriptlet-Variablen müssen explizit an die Include-Seite übergeben werden.
  • Die enthaltene Seite muss eigenständig ausgeführt werden können.
  • Es ist weniger wahrscheinlich, dass Kompilierungsfehler auftreten, da die maximale Methodengröße in der generierten Servlet-Klasse überschritten wird.

Abhängig von Ihren Anforderungen können Sie entweder <@include>oder verwenden <jsp:include>

Darth
quelle
1
Meinen Sie, wie Sie in Ihrer Frage gezeigt haben : <t:mytag><h1>Hello World</h1></t:mytag>? Dies ist kein Include, sondern die normale Verwendung eines Tags (wie <jsp:useBean>oder <c:if>).
Uooo
Was ist also der Unterschied zwischen der Verwendung von Tag-Dateien und Includes, da anscheinend Tag-Dateien verwendet werden können, um Inhalte in eine Seite aufzunehmen?
Sonicboom
9

Hauptvorteil von <jsp:include />über <%@ include >ist:

<jsp:include /> ermöglicht die Übergabe von Parametern

<jsp:include page="inclusion.jsp">
    <jsp:param name="menu" value="objectValue"/>
</jsp:include>

was in nicht möglich ist <%@include file="somefile.jsp" %>

Saurabh Ande
quelle
Was ist mit Tagfiles? Ich weiß, wie Inlcudes funktionieren. Ich frage mich, wie sich Tag-Dateien auf Includes beziehen, da sie anscheinend dieselbe Funktionalität bieten. Was ist der Unterschied zwischen der Verwendung von Tagfiles und der Verwendung von Includes?
Sonicboom
wie wäre es <%@include file="somefile.jsp?menu=value" %>? Ist das auch eingeschränkt?
Roshana Pitigala
5

Alle drei Vorlagenoptionen - <%@include>, <jsp:include>und <%@tag>sind gültig, und alle drei Abdeckung verschiedene Anwendungsfälle.

Mit <@include>speichert der JSP-Parser den Inhalt der enthaltenen Datei vor dem Kompilieren in der JSP (ähnlich einem C #include). Sie würden diese Option mit einfachem, statischem Inhalt verwenden: Zum Beispiel, wenn Sie Kopf-, Fuß- oder Navigationselemente in jede Seite Ihrer Web-App aufnehmen 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 Remote-URL einfügen müssen. wenn die Ressource, die Sie einschließen, selbst dynamisch ist; oder wenn der enthaltene Inhalt Variablen oder Bean-Definitionen verwendet, die mit der eingeschlossenen Seite in Konflikt stehen. <c:import>Außerdem können Sie den enthaltenen Text 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 "kostenlos" ist.

Verwenden Sie Tag-Dateien, wenn Sie wiederverwendbare Komponenten der Benutzeroberfläche erstellen möchten. Wenn Sie beispielsweise über eine Liste von Widgets verfügen und die Widgets durchlaufen und die Eigenschaften der einzelnen Widgets (in einer Tabelle oder in einem Formular) anzeigen möchten, erstellen Sie ein Tag. Tags können Argumente annehmen, verwenden <%@tag attribute>und diese Argumente können entweder obligatorisch oder optional sein - ähnlich wie Methodenparameter.

Tag-Dateien sind ein einfacher, JSP-basierter Mechanismus zum Schreiben von Tag-Bibliotheken, die Sie (vor JSP 2.0) mit Java-Code schreiben mussten. Das Schreiben von JSP-Tag-Dateien ist viel sauberer, wenn das Tag viel zu rendern ist: Sie müssen Java- und HTML-Code nicht mischen, wie Sie es tun müssten, wenn Sie Ihre Tags in Java geschrieben hätten.

Hari
quelle
1

Laut: Java Revisited

  1. Ressourcen, die in der Include-Direktive enthalten sind, werden während der JSP-Übersetzungszeit geladen, während Ressourcen, die in der Include-Aktion enthalten sind, während der Anforderungszeit geladen werden.

  2. Änderungen an eingeschlossenen Ressourcen werden im Fall der Include-Direktive erst sichtbar, wenn die JSP-Datei erneut kompiliert wird. Im Falle einer Include-Aktion wird jede Änderung der eingeschlossenen Ressource in der nächsten Anforderung sichtbar.

  3. Die Include-Direktive ist ein statischer Import, während die Include-Aktion ein dynamischer Import ist.

  4. Die Include-Direktive verwendet das Dateiattribut, um die einzuschließenden Ressourcen anzugeben, während die Include-Aktion das Seitenattribut für denselben Zweck verwendet.

Abhijeet Ashok Muneshwar
quelle