wake-up-neo.net

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

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?

150
sonicboom

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.


Bezüglich deiner Bearbeitung

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 .


Nützliche Lektüre.


Fazit

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

Mögliche doppelte Frage

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

  • 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 um einfachen Text handeln. Die enthaltene Seite wird niemals als eigenständige Seite kompiliert. Die enthaltene Seite kann auch eine beliebige Erweiterung haben, obwohl .jspf eine herkömmlich verwendete 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. Aktuelle Versionen von Tomcat überprüfen die Include-Seiten auf Aktualisierungen und erzwingen eine Neukompilierung des übergeordneten Elements, wenn diese aktualisiert werden.
  • Ein weiterer Nachteil ist, dass die Methode sehr umfangreich werden kann, da der Code direkt in die Dienstmethode 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 unter bestimmten Bedingungen zur Laufzeit eingeschlossen 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 einbezogen 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 <jsp:include>

21
Darth

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

8
Saurabh Ande

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.

5
Hari

Java Revisited

  1. Die von der include-Direktive eingeschlossene Ressource wird während der JSP-Übersetzungszeit geladen, während die von der include-Aktion eingeschlossene Ressource während der Anforderungszeit geladen wird.
  2. Änderungen an der enthaltenen Ressource werden im Falle einer include-Direktive erst sichtbar, wenn die JSP-Datei erneut kompiliert wird. Während im Falle einer Einschlussaktion alle Änderungen an der einbezogenen Ressource in der nächsten Anforderung sichtbar sind.
  3. Die Include-Anweisung ist ein statischer Import, während die Include-Aktion ein dynamischer Import ist
  4. Die Include-Direktive verwendet das Dateiattribut, um die einzubeziehende Ressource anzugeben, während das Seitenattribut der Include-Aktion für denselben Zweck verwendet wird.