web-dev-qa-db-fra.com

Quelle est la différence entre <jsp: include page = ...> et <% @ include file = ...>?

Les deux balises incluent le contenu d'une page dans une autre.

Alors, quelle est la différence exacte entre ces deux balises?

103
Prasoon

Dans un morceau de code réutilisable, j'utilise la directive <%@include file="reuse.html"%> et dans la seconde, j'utilise le tag<jsp:include page="reuse.html" />.

Laissez le code dans le fichier réutilisable être:

<html>
<head>
    <title>reusable</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <img src="candle.gif" height="100" width="50"/> <br />
    <p><b>As the candle burns,so do I</b></p>
</body>

Après avoir exécuté les deux fichiers JSP, vous voyez la même sortie et vous vous demandez s'il y avait une différence entre la directive et la balise. Mais si vous regardez le servlet généré des deux fichiers JSP, vous verrez la différence. Voici ce que vous verrez lorsque vous utilisez le directive:

out.write("<html>\r\n");
out.write("    <head>\r\n");
out.write("        <title>reusable</title>\r\n");
out.write("        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("    </head>\r\n");
out.write("    <body>\r\n");
out.write("        <img src=\"candle.gif\" height=\"100\" width=\"50\"/> <br />\r\n");
out.write("        <p><b>As the candle burns,so do I</b></p>\r\n");
out.write("    </body>\r\n");
out.write("</html>\r\n");

et voici ce que vous verrez pour la balise utilisée dans le deuxième fichier JSP:

org.Apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);

Alors maintenant, vous savez que la directive include insère la source de reuse.html au moment de la traduction, mais que la balise d'action insère la réponse de reuse.html au moment de l'exécution.

Si vous y réfléchissez, il y a un impact supplémentaire sur les performances avec chaque balise d'action (jsp:include file). Cela signifie que vous pouvez garantir que vous aurez toujours le dernier contenu, mais cela augmente les coûts de performance.

104
Suhail Gupta

Il y a une énorme différence. Comme il a été mentionné, <%@ include est une inclusion statique, <jsp:include est une inclusion dynamique. Considérez cela comme une différence entre une macro et un appel de fonction (si vous connaissez ces termes). Une autre façon de le dire, une inclusion statique est exactement la même chose que copier-coller le contenu exact du fichier inclus (le "code") à l'emplacement de l'instruction <%@ include (qui correspond exactement à ce que le compilateur JSP ça ira.

Un include dynamique créera une requête (à l'aide du répartiteur de requêtes) qui exécutera la page indiquée, puis inclura le résultat de la page dans le résultat de la page appelante, dans lieu de l'instruction <jsp:include.

La grande différence ici est qu'avec une inclusion dynamique, la page incluse s'exécutera dans son propre pageContext. Et puisqu'il s'agit d'une demande, vous pouvez envoyer des paramètres à la page de la même manière que vous pouvez envoyer des paramètres avec toute autre demande. Une inclusion statique, par contre, n’est qu’un morceau de code qui s’exécutera dans le contexte de la page d’appel. Si vous incluez statiquement le même fichier plusieurs fois, le code de ce fichier existera à plusieurs emplacements sur la page appelante.

<%
int i = 0;
%>

générerait une erreur de compilation (étant donné qu'une même variable ne peut être déclarée plus d'une fois).

54
pap

jGur :

La directive <%@include file="abc.jsp"%> agit comme C "#include", en extrayant le texte du fichier inclus et en le compilant comme s'il faisait partie du fichier inclus. Le fichier inclus peut être de tout type (y compris HTML ou texte).

La balise <jsp: include page = "abc.jsp"> compile le fichier en tant que fichier JSP distinct et y intègre un appel dans le fichier JSP compilé.

Certains moteurs JSP prennent en charge les balises non standard <!--#include file="data.inc"--> (style NCSA ou .shtml) et <%@ vinclude="data.inc" %> (style JRun), mais elles ne sont pas définies dans la spécification JSP et ne peuvent donc pas être utilisées. sur.

Voir aussi cette question dans la FAQ JSP.

37
Wojtek Owczarczyk

1) Quand utiliser directive include?

Pour éviter la duplication de la même logique de sortie sur plusieurs jsp de l'application Web, le mécanisme d'inclusion est utilisé, c.-à-d., Afin de promouvoir la réutilisation de la logique de présentation, la directive d'inclusion est utilisée

  <%@ include file="abc.jsp" %>

lorsque l'instruction ci-dessus est reçue par le moteur jsp, il récupère le code source de l'abc.jsp et copie la même ligne dans le jsp actuel. Après la copie de la traduction est effectuée pour la page en cours

Dire simplement que c’est une instruction statique pour le moteur JSP, c’est-à-dire que tout le code source de "abc.jsp" est copié dans la page en cours.

2) Quand utiliser action d'inclusion?

la balise include n'inclut pas le code source de la page incluse dans la page actuelle, mais la sortie générée au moment de l'exécution par la page incluse est incluse dans la réponse de la page actuelle.

la fonctionnalité include est similaire à celle du mécanisme include du répartiteur de demandes de programmation de servlets.

la balise include est une instruction d’exécution du moteur jsp, c’est-à-dire qu’elle copie le code entier dans la page en cours, un appel de méthode est effectué sur "abc.jsp" à partir de la page en cours.

28
Ajay Takur

L’une est une importation statique (<% = @ include ...> "), l’autre est une importation dynamique (jsp: include). Elle affectera par exemple le chemin que vous devrez spécifier pour votre fichier inclus. Quelques recherches sur Google vous en dira plus.

1
talnicolas

Java Revisited

  1. La directive ressource incluse par include est chargée pendant le temps de traduction de jsp, tandis que l'action ressource incluse par include est chargée pendant le temps de requête.
  2. Toute modification de la ressource incluse ne sera pas visible dans le cas d'une directive include jusqu'à ce que le fichier jsp soit à nouveau compilé. Alors que dans le cas d'une action include, toute modification de la ressource incluse sera visible dans la prochaine requête.
  3. La directive include est une importation statique, tandis que l'action include est une importation dynamique
  4. La directive Include utilise un attribut de fichier pour spécifier la ressource à inclure tout en incluant un attribut de page d'utilisation d'action dans le même but.