Quelle est la différence entre l'inclusion de fichiers avec la directive d'inclusion JSP, l'action d'inclusion JSP et l'utilisation de fichiers de balises JSP?

155

Il semble qu'il existe deux méthodes pour créer des modèles avec JSP. Inclure des fichiers avec l'une de ces instructions

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

ou en utilisant des fichiers de balises JSP

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

Et dans une autre page JSP, appelez-le avec

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

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

Alors, quelle méthode dois-je utiliser? Est-ce que l'un d'entre eux est maintenant considéré comme obsolète ou sont-ils tous les deux valides et couvrent différents cas d'utilisation?

Éditer

L'utilisation de ce fichier de balise n'est-elle pas la même que celle d'une inclusion?

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

Et appelez-le sur une autre JSP avec

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

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

Cela me semble être la même chose que d'utiliser un include et de lui passer des paramètres. Les fichiers de balises sont-ils donc les mêmes que les inclusions?

détonation supersonique
la source

Réponses:

293

Présentation des éléments de syntaxe JSP

Tout d'abord, pour clarifier les choses, voici un bref aperçu des éléments de syntaxe JSP :

  • Directives : elles transmettent des informations concernant la page JSP dans son ensemble.
  • Éléments de script : il s'agit d'éléments de codage Java tels que les déclarations, les expressions, les scriptlets et les commentaires.
  • Objets et étendues : les objets JSP peuvent être créés explicitement ou implicitement et sont accessibles dans une étendue donnée, par exemple à partir de n'importe où dans la page JSP ou la session.
  • Actions : elles créent des objets ou affectent le flux de sortie dans la réponse JSP (ou les deux).

Comment le contenu est inclus dans JSP

Il existe plusieurs mécanismes pour réutiliser le contenu d'un fichier JSP.

Les 4 mécanismes suivants pour inclure du contenu dans JSP peuvent être classés comme réutilisation directe :
(pour les 3 premiers mécanismes citant "Head First Servlets and JSP" )

1) La directive include :

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

Statique : ajoute le contenu de la valeur de l'attribut de fichier à la page en cours au moment de la traduction . La directive était à l'origine destinée aux modèles de mise en page statiques, comme les en-têtes HTML.

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

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

Dynamique : ajoute le contenu de la valeur de l'attribut de page à la page actuelle au moment de la demande . Était davantage destiné au contenu dynamique provenant de JSP.

3) La <c:import>balise JSTL:

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

Dynamique : ajoute le contenu de la valeur de l'attribut URL à la page actuelle, au moment de la demande . Cela fonctionne beaucoup <jsp:include>, mais c'est plus puissant et flexible: contrairement aux deux autres inclus, l' <c:import> URL peut provenir de l'extérieur du conteneur Web !

4) Préludes et codas:

Statique : les préludes et les codas ne peuvent être appliqués qu'au début et à la fin des pages .
Vous pouvez implicitement inclure des préludes (également appelés en-têtes) et des codas (également appelés pieds de page) pour un groupe de pages JSP en ajoutant respectivement des éléments <include-prelude>et <include-coda>dans un <jsp-property-group>élément du descripteur de déploiement de l' application Web web.xml . Pour en savoir plus:
Configuration des inclusions implicites au début et à la fin des JSP
Définition des inclusions implicites


Tag File est une méthode indirecte de réutilisation de contenu, la manière d' encapsuler le contenu réutilisable . Un fichier de balise est un fichier source contenant un fragment de code JSP réutilisable en tant que balise personnalisée .

Le BUT des fichiers d'inclusion et de balise est différent.

Le fichier de balise (un concept introduit avec JSP 2.0) est l'une des options de création de balises personnalisées . C'est un moyen plus rapide et plus simple de créer des balises personnalisées . Les balises personnalisées , également appelées extensions de balises, sont des éléments JSP qui permettent à la logique personnalisée et à la sortie fournie par d'autres composants Java d'être insérées dans les pages JSP. La logique fournie via une balise personnalisée est implémentée par un objet Java appelé gestionnaire de balises .

Certains exemples de tâches pouvant être exécutées par des balises personnalisées incluent l'utilisation d'objets implicites, le traitement de formulaires, l'accès aux bases de données et à d'autres services d'entreprise tels que la messagerie électronique et les annuaires, et la mise en œuvre du contrôle de flux.


Concernant votre modification

Peut-être que dans votre exemple (dans votre édition ), il n'y a aucune différence entre l'utilisation de l'inclusion directe et un fichier de balise. Mais les balises personnalisées ont un riche ensemble de fonctionnalités . Ils peuvent

  • Soyez personnalisé au moyen d'attributs transmis depuis la page d'appel.

  • Renvoyez les variables à la page d'appel.

  • Accédez à tous les objets disponibles sur les pages JSP.

  • Communiquer entre eux. Vous pouvez créer et initialiser un composant JavaBeans, créer une variable EL publique qui fait référence à ce bean dans une balise, puis utiliser le bean dans une autre balise.

  • Soyez imbriqués les uns dans les autres et communiquez au moyen de variables privées.

Lisez également ceci dans «Pro JSP 2»: Comprendre les balises personnalisées JSP .


Lecture utile.


Conclusion

Utilisez les bons outils pour chaque tâche.


Utilisez les fichiers de balises comme moyen rapide et simple de créer des balises personnalisées qui peuvent vous aider à encapsuler du contenu réutilisable .

Quant au contenu inclus dans JSP (citation d' ici ):

  • Utilisez la directive include si le fichier change rarement . C'est le mécanisme le plus rapide. Si votre conteneur ne détecte pas automatiquement les modifications, vous pouvez forcer les modifications à prendre effet en supprimant le fichier de classe de la page principale.
  • Utilisez l'action d'inclusion uniquement pour le contenu qui change souvent , et si la page à inclure ne peut être décidée tant que la page principale n'est pas demandée.
informatik01
la source
Mais <jsp: include> n'est-il pas la même chose que l'utilisation de fichiers de balises? Je ne vois aucune différence ... Vous pouvez passer des variables aux fichiers inclus avec <jsp: include> tout comme vous pouvez passer des variables aux fichiers de balises. Les deux méthodes vous permettent de réutiliser le contenu, elles semblent faire exactement la même chose. Y a-t-il une différence entre eux autre que leurs noms?
sonicboom
@sonicboom a mis à jour ma réponse
informatik01
1
@ informatik01 très belle réponse, j'apprécie la profondeur, le bon formatage et la liste très pratique de 4 mécanismes.
Russell Silva
1
quel est exactement l'avantage de <jsp: include> sur <* @ include url ..>?
Krsna Chaitanya
@KrsnaChaitanya Remarque: vous avez une faute de frappe (l'astérisque *) dans la directive d'inclusion. <jsp:include>est une action d' inclusion standard , <%@ include file="" %>est la directive d' inclusion . Lisez la toute dernière section (dans la boîte grise) qui décrit les avantages (c'est-à-dire des recommandations pour choisir l'un ou l'autre). Consultez également cet article pour une description détaillée. J'espère que cela t'aides.
informatik01
21

Question en double possible

<@include>- La balise directive indique au compilateur JSP de fusionner le contenu du fichier inclus dans la JSP avant de créer le code de servlet généré. C'est l'équivalent de couper et coller le texte de votre page d'inclusion directement dans votre JSP.

  • Un seul servlet est exécuté au moment de l'exécution.
  • Les variables de scriptlet déclarées dans la page parente sont accessibles dans la page incluse (rappelez-vous, ce sont la même page).
  • La page incluse n'a pas besoin de pouvoir être compilée en tant que JSP autonome. Cela peut être un fragment de code ou du texte brut. La page incluse ne sera jamais compilée de manière autonome. La page incluse peut également avoir n'importe quelle extension, bien que .jspf soit devenu une extension conventionnellement utilisée.
  • Un inconvénient des conteneurs plus anciens est que les modifications apportées aux pages d'inclusion peuvent ne pas prendre effet tant que la page parent n'est pas mise à jour. Les versions récentes de Tomcat vérifieront les pages d'inclusion pour les mises à jour et forceront une recompilation du parent si elles sont mises à jour.
  • Un autre inconvénient est que puisque le code est intégré directement dans la méthode de service du servlet généré, la méthode peut devenir très volumineuse. S'il dépasse 64 Ko, votre compilation JSP échouera probablement.

<jsp:include> - La balise JSP Action, quant à elle, demande au conteneur de suspendre l'exécution de cette page, d'exécuter la page incluse et de fusionner la sortie de cette page dans la sortie de cette page.

  • Chaque page incluse est exécutée en tant que servlet distinct au moment de l'exécution.
  • Les pages peuvent être incluses de manière conditionnelle au moment de l'exécution. Ceci est souvent utile pour créer des modèles de frameworks qui créent des pages à partir d'inclusions. La page parent peut déterminer la page, le cas échéant, à inclure en fonction d'une condition d'exécution.
  • Les valeurs des variables de scriptlet doivent être transmises explicitement à la page d'inclusion.
  • La page incluse doit pouvoir être exécutée seule.
  • Vous êtes moins susceptible de rencontrer des erreurs de compilation en raison du dépassement de la taille maximale de la méthode dans la classe de servlet générée.

Selon vos besoins, vous pouvez utiliser <@include>ou <jsp:include>

Darth
la source
1
Voulez-vous dire comme vous l'avez montré dans votre question <t:mytag><h1>Hello World</h1></t:mytag>:? Ce n'est pas une inclusion, c'est l'utilisation normale d'une balise (comme <jsp:useBean>ou <c:if>).
Uooo
Alors, quelle est la différence entre l'utilisation de fichiers de balises et inclut, car il semble que les fichiers de balises peuvent être utilisés pour inclure du contenu dans une page?
sonicboom
9

Le principal avantage de <jsp:include />over <%@ include >est:

<jsp:include /> permet de passer des paramètres

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

ce qui n'est pas possible dans <%@include file="somefile.jsp" %>

Saurabh Ande
la source
Et les tagfiles, je sais comment fonctionnent les inlcudes. Je me demande comment les fichiers de balises se rapportent aux inclusions car il semble qu'ils fournissent la même fonctionnalité. Quelle est la différence entre l'utilisation de tagfiles et l'utilisation d'includes?
sonicboom
et pourquoi <%@include file="somefile.jsp?menu=value" %>? Est-ce aussi limité?
Roshana Pitigala
5

Les trois options de modèle - <%@include>, <jsp:include>et <%@tag>sont valides, et les trois couvrent différents cas d'utilisation.

Avec <@include>, l'analyseur JSP intègre le contenu du fichier inclus dans la JSP avant la compilation (similaire à un C #include). Vous utiliseriez cette option avec un contenu simple et statique: par exemple, si vous souhaitez inclure des éléments d'en-tête, de pied de page ou de navigation dans chaque page de votre application Web. Le contenu inclus devient une partie de la JSP compilée et il n'y a aucun coût supplémentaire au moment de l'exécution.

<jsp:include>(et JSTL <c:import>, qui est similaire et encore plus puissant) sont les mieux adaptés au contenu dynamique. Utilisez-les lorsque vous devez inclure du contenu d'une autre URL, locale ou distante; lorsque la ressource que vous incluez est elle-même dynamique; ou lorsque le contenu inclus utilise des variables ou des définitions de bean qui sont en conflit avec la page d'inclusion. <c:import>vous permet également de stocker le texte inclus dans une variable, que vous pouvez manipuler ou réutiliser ultérieurement. Les deux entraînent un coût d'exécution supplémentaire pour l'envoi: c'est minime, mais vous devez être conscient que l'inclusion dynamique n'est pas "gratuite".

Utilisez des fichiers de balises lorsque vous souhaitez créer des composants d'interface utilisateur réutilisables. Si vous avez une liste de widgets, par exemple, et que vous souhaitez parcourir les widgets et afficher les propriétés de chacun (dans un tableau ou dans un formulaire), vous créez une balise. Les balises peuvent prendre des arguments, en utilisant <%@tag attribute>et ces arguments peuvent être obligatoires ou facultatifs - un peu comme des paramètres de méthode.

Les fichiers de balises sont un mécanisme plus simple, basé sur JSP, pour écrire des bibliothèques de balises, que vous deviez (avant JSP 2.0) écrire en utilisant du code Java. C'est beaucoup plus simple d'écrire des fichiers de balises JSP quand il y a beaucoup de rendu à faire dans la balise: vous n'avez pas besoin de mélanger du code Java et HTML comme vous le feriez si vous écriviez vos balises en Java.

Hari
la source
1

D'après: Java revisité

  1. Les ressources incluses par la directive include sont chargées pendant le temps de traduction jsp, tandis que les ressources incluses par l'action include sont chargées pendant le temps de la demande.

  2. Tout changement sur les ressources incluses ne sera pas visible en cas de directive include jusqu'à ce que le fichier jsp soit à nouveau compilé. En cas d'action d'inclusion, toute modification de la ressource incluse sera visible dans la prochaine demande.

  3. La directive d'inclusion est une importation statique, tandis que l'action d'inclusion est une importation dynamique.

  4. La directive Inclure utilise l'attribut de fichier pour spécifier les ressources à inclure tandis que l'action d'inclusion utilise l'attribut de page dans le même but.

Abhijeet Ashok Muneshwar
la source