Qual è la differenza tra l'inclusione dei file con la direttiva include JSP, l'azione JSP include e l'uso dei file tag JSP?


155

Sembra che ci siano due metodi per creare modelli con JSP. Compresi i file con una di queste dichiarazioni

<%@ include file="foo.html" %>
<jsp:include page="foo.html" />

o usando i file tag JSP

// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
    <jsp:doBody/>
</body>
</html>

E in un'altra pagina JSP chiamalo con

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

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

Quindi quale metodo dovrei usare? Uno è ora considerato deprecato o sono entrambi validi e coprono diversi casi d'uso?

modificare

L'utilizzo di questo file tag non equivale a un 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/>

E chiamalo su un altro JSP con

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

<t:product>
    <c:forEach items="${cart.products}" var="product">
        <t:product product="${product}"/>
    </c:forEach>
</t:product>

Mi sembra lo stesso che usare un include e passare parametri ad esso. Quindi i Tag File sono gli stessi inclusi?

Risposte:


293

Panoramica degli elementi di sintassi JSP

Innanzitutto, per rendere le cose più chiare, ecco una breve panoramica degli elementi di sintassi JSP :

  • Direttive : forniscono informazioni relative alla pagina JSP nel suo insieme.
  • Elementi di scripting : elementi di codifica Java come dichiarazioni, espressioni, scriptlet e commenti.
  • Oggetti e ambiti : gli oggetti JSP possono essere creati in modo esplicito o implicito e sono accessibili in un determinato ambito, ad esempio da qualsiasi punto della pagina JSP o della sessione.
  • Azioni : creano oggetti o influenzano il flusso di output nella risposta JSP (o entrambi).

Come il contenuto è incluso in JSP

Esistono diversi meccanismi per riutilizzare il contenuto in un file JSP.

I seguenti 4 meccanismi per includere il contenuto in JSP possono essere classificati come riutilizzo diretto :
(per i primi 3 meccanismi citati da "Head First Servlets and JSP" )

1) La direttiva include :

<%@ include file="header.html" %>

Statico : aggiunge il contenuto dal valore dell'attributo del file alla pagina corrente al momento della traduzione . La direttiva era originariamente destinata a modelli di layout statici, come le intestazioni HTML.

2) L' <jsp:include> azione standard :

<jsp:include page="header.jsp" />

Dinamica : aggiunge il contenuto dal valore dell'attributo della pagina alla pagina corrente al momento della richiesta . Era destinato più ai contenuti dinamici provenienti dai JSP.

3) Il <c:import>tag JSTL:

<c:import url=”http://www.example.com/foo/bar.html” />

Dinamica : aggiunge il contenuto dal valore dell'attributo URL alla pagina corrente, al momento della richiesta . Funziona in modo molto simile <jsp:include>, ma è più potente e flessibile: a differenza degli altri due include, l' <c:import> URL può provenire dall'esterno del contenitore Web !

4) Preludi e codici:

Statico : preludi e codici possono essere applicati solo all'inizio e alla fine delle pagine .
È possibile includere implicitamente preludi (chiamati anche intestazioni) e codici (anche chiamati piè di pagina) per un gruppo di pagine JSP aggiungendo <include-prelude>ed <include-coda>elementi rispettivamente all'interno di un <jsp-property-group>elemento nel descrittore di distribuzione web.xml dell'applicazione Web . Maggiori informazioni qui:
Configurazione delle inclusioni implicite all'inizio e alla fine dei JSP
Definizione delle inclusioni implicite


Il file tag è un metodo indiretto di riutilizzo del contenuto, il modo di incapsulare il contenuto riutilizzabile . Un file tag è un file di origine che contiene un frammento di codice JSP che è riutilizzabile come tag personalizzato .

LO SCOPO di include e Tag Files è diverso.

Il file tag (un concetto introdotto con JSP 2.0) è una delle opzioni per la creazione di tag personalizzati . È un modo più rapido e semplice per creare tag personalizzati . I tag personalizzati , noti anche come estensioni di tag, sono elementi JSP che consentono di inserire nelle pagine JSP la logica e l'output personalizzati forniti da altri componenti Java. La logica fornita tramite un tag personalizzato è implementata da un oggetto Java noto come gestore di tag .

Alcuni esempi di attività che possono essere eseguite da tag personalizzati includono operazioni su oggetti impliciti, moduli di elaborazione, accesso a database e altri servizi aziendali come e-mail e directory e implementazione del controllo del flusso.


Per quanto riguarda la tua modifica

Forse nel tuo esempio (nella tua Modifica ), non vi è alcuna differenza tra l'uso della funzione di inclusione diretta e un file tag. Ma i tag personalizzati hanno un ricco set di funzionalità . Loro possono

  • Essere personalizzato mediante gli attributi passati dalla pagina chiamante.

  • Passa le variabili alla pagina chiamante.

  • Accedi a tutti gli oggetti disponibili per le pagine JSP.

  • Comunicare l'uno con l'altro. È possibile creare e inizializzare un componente JavaBeans, creare una variabile EL pubblica che fa riferimento a quel bean in un tag e quindi utilizzare il bean in un altro tag.

  • Essere annidati l'uno nell'altro e comunicare per mezzo di variabili private.

Leggilo anche da "Pro JSP 2": Comprensione dei tag personalizzati JSP .


Lettura utile.


Conclusione

Usa gli strumenti giusti per ogni attività.


Utilizzare i file tag come un modo semplice e veloce per creare tag personalizzati che possono aiutare a incapsulare contenuti riutilizzabili .

Per quanto riguarda il contenuto incluso in JSP (citazione da qui ):

  • Utilizzare la direttiva include se il file cambia raramente . È il meccanismo più veloce. Se il contenitore non rileva automaticamente le modifiche, è possibile forzare le modifiche eliminando il file di classe della pagina principale.
  • Utilizzare l'azione include solo per i contenuti che cambiano spesso e se la pagina da includere non può essere decisa fino a quando non viene richiesta la pagina principale.

<Jsp: include> non è lo stesso che usare i file tag? Non riesco a vedere alcuna differenza ... Puoi passare le variabili ai file inclusi con <jsp: include> così come puoi passare le variabili ai tag. Entrambi i metodi ti consentono di riutilizzare i contenuti, sembrano fare esattamente la stessa cosa. C'è qualche differenza tra loro oltre ai loro nomi?
sonicboom,

@sonicboom Aggiornato la mia risposta
informatik01

1
@informatik01 risposta molto bella, apprezzo la profondità, la piacevole formattazione e la lista dei 4 meccanismi molto utile.
Russell Silva,

1
qual è esattamente il vantaggio di <jsp: include> rispetto a <* @ include url ..>?
Krishna Chaitanya,

@KrsnaChaitanya Nota: hai un refuso (l'asterisco *) nella direttiva include. <jsp:include>è uno standard comprendono l'azione , <%@ include file="" %>è l'inclusione direttiva . Leggi l'ultima sezione (nella casella grigia) che illustra i vantaggi (ad esempio consigli su quando scegliere uno o l'altro). Consulta anche questo articolo per la descrizione dettagliata. Spero che questo ti aiuti.
informatik01,

21

Possibile domanda duplicata

<@include>- Il tag direttiva indica al compilatore JSP di unire i contenuti del file incluso nel JSP prima di creare il codice servlet generato. È l'equivalente di tagliare e incollare il testo dalla tua pagina di inclusione direttamente nel tuo JSP.

  • Viene eseguito un solo servlet in fase di esecuzione.
  • Le variabili degli scriptlet dichiarate nella pagina principale sono accessibili nella pagina inclusa (ricordate, sono la stessa pagina).
  • Non è necessario compilare la pagina inclusa come JSP autonomo. Può essere un frammento di codice o un testo semplice. La pagina inclusa non verrà mai compilata come standalone. La pagina inclusa può anche avere qualsiasi estensione, sebbene .jspf sia diventata un'estensione convenzionalmente usata.
  • Uno svantaggio dei vecchi contenitori è che le modifiche alle pagine di inclusione potrebbero non avere effetto fino a quando la pagina principale non viene aggiornata. Le versioni recenti di Tomcat controlleranno le pagine di inclusione per gli aggiornamenti e imporranno una ricompilazione del genitore se vengono aggiornati.
  • Un ulteriore svantaggio è che, poiché il codice è incorporato direttamente nel metodo di servizio del servlet generato, il metodo può aumentare molto. Se supera i 64 KB, la compilazione JSP probabilmente fallirà.

<jsp:include> - Il tag Azione JSP d'altra parte indica al contenitore di mettere in pausa l'esecuzione di questa pagina, andare a eseguire la pagina inclusa e unire l'output da quella pagina nell'output da questa pagina.

  • Ogni pagina inclusa viene eseguita come servlet separato in fase di esecuzione.
  • Le pagine possono essere condizionatamente incluse in fase di esecuzione. Ciò è spesso utile per creare modelli di template che creano pagine con inclusioni. La pagina padre può determinare quale pagina, se presente, includere in base ad alcune condizioni di runtime.
  • I valori delle variabili dello scriptlet devono essere passati esplicitamente alla pagina include.
  • La pagina inclusa deve poter essere eseguita da sola.
  • È meno probabile che si verifichino errori di compilazione a causa del superamento della dimensione massima del metodo nella classe servlet generata.

A seconda delle esigenze, è possibile utilizzare <@include>o <jsp:include>


1
Intendi come hai mostrato nella tua domanda <t:mytag><h1>Hello World</h1></t:mytag>:? Questa non è un'inclusione, è l'uso normale di un tag (come <jsp:useBean>o <c:if>).
Uooo,

Quindi qual è la differenza tra l'utilizzo di file tag e include come sembra che i file tag possano essere utilizzati per includere contenuti in una pagina?
sonicboom,

9

Il vantaggio principale di <jsp:include />over <%@ include >è:

<jsp:include /> permette di passare parametri

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

che non è possibile in <%@include file="somefile.jsp" %>


Che dire dei tagfile, so come funziona inclusivo. Mi chiedo in che modo i file tag si riferiscono a include in quanto sembrano fornire la stessa funzionalità. Qual è la differenza tra l'utilizzo di tagfile e l'utilizzo di include?
sonicboom,

che ne dici <%@include file="somefile.jsp?menu=value" %>? Anche quello è limitato?
Roshana Pitigala,

5

Tutte e tre le opzioni template - <%@include>, <jsp:include>e <%@tag>sono validi, e tutti i diversi casi di utilizzo di tre copertura.

Con <@include>, il parser JSP allinea il contenuto del file incluso nel JSP prima della compilazione (simile a una C #include). Utilizzeresti questa opzione con contenuti semplici e statici: ad esempio, se desideri includere elementi di intestazione, piè di pagina o di navigazione in ogni pagina della tua app web. Il contenuto incluso diventa parte del JSP compilato e non ci sono costi aggiuntivi in ​​fase di esecuzione.

<jsp:include>(e JSTL <c:import>, che è simile e persino più potente) sono più adatti al contenuto dinamico. Utilizzali quando devi includere contenuti da un altro URL, locale o remoto; quando la risorsa che stai includendo è essa stessa dinamica; o quando il contenuto incluso utilizza variabili o definizioni di bean in conflitto con la pagina inclusa. <c:import>consente inoltre di archiviare il testo incluso in una variabile, che è possibile modificare o riutilizzare ulteriormente. Entrambi comportano un costo di runtime aggiuntivo per la spedizione: questo è minimo, ma è necessario essere consapevoli del fatto che l'inclusione dinamica non è "gratuita".

Utilizzare i file tag quando si desidera creare componenti dell'interfaccia utente riutilizzabili. Se si dispone di un Elenco di widget, ad esempio, e si desidera scorrere i Widget e visualizzare le proprietà di ciascuno (in una tabella o in un modulo), è necessario creare un tag. I tag possono prendere argomenti, usando <%@tag attribute>e questi argomenti possono essere obbligatori o opzionali - in qualche modo simili ai parametri del metodo.

I file di tag sono un meccanismo più semplice, basato su JSP, di scrivere librerie di tag, che (prima di JSP 2.0) dovevi scrivere usando il codice Java. Scrivere file di tag JSP è molto più pulito quando c'è molto rendering da fare nel tag: non è necessario mescolare codice Java e HTML come si farebbe se si scrivessero i tag in Java.


1

Secondo: Java Revisited

  1. Le risorse incluse dalla direttiva include vengono caricate durante il tempo di traduzione jsp, mentre le risorse incluse dall'azione include vengono caricate durante il tempo della richiesta.

  2. Qualsiasi modifica alle risorse incluse non sarà visibile in caso di direttiva include fino a quando il file jsp non viene nuovamente compilato. Mentre in caso di azione di inclusione, qualsiasi cambiamento nella risorsa inclusa sarà visibile nella richiesta successiva.

  3. La direttiva include è importazione statica, mentre l'azione include è importazione dinamica.

  4. La direttiva Includi utilizza l'attributo del file per specificare le risorse da includere mentre l'azione include usa l'attributo della pagina per lo stesso scopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.