В чем разница между <jsp: include page =...> и <% @include file =...>?

Оба тега включают содержимое с одной страницы в другую.

Итак, какова точная разница между этими двумя тегами?

Ответ 1

В одном многократном фрагменте кода я использую директиву <%@include file="reuse.html"%>, а во втором я использую тег <jsp:include page="reuse.html" />.

Пусть код в файле многократного использования:

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

После запуска обоих файлов JSP вы увидите один и тот же вывод и подумайте, есть ли разница между директивой и тегом. Но если вы посмотрите на сгенерированный servlet двух файлов JSP, вы увидите разницу. Вот что вы увидите, когда используете 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");

и это то, что вы увидите для используемого тега во втором файле JSP:

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

Итак, теперь вы знаете, что директива include вставляет источник reuse.html во время перевода, но тег действия вставляет ответ reuse.html во время выполнения.

Если вы думаете об этом, то с каждым тегом действия (jsp:include file) появляется дополнительное повышение производительности. Это означает, что вы можете гарантировать, что у вас всегда будет самый последний контент, но он увеличивает стоимость исполнения.

Ответ 2

Там огромная разница. Как уже упоминалось, <%@ include является статическим включением, <jsp:include является динамическим включением. Подумайте об этом как о различии между макросом и вызовом функции (если вы знакомы с этими терминами). Другой способ поставить его, статический include - это точно то же самое, что и копирование точного содержимого включенного файла ( "код" ) в расположение оператора <%@ include (что именно то, что сделает JSP-компилятор.

Динамический include сделает запрос (используя диспетчер запросов), который выполнит указанную страницу, а затем включит вывод с страницы на выходе вызывающей страницы вместо оператора <jsp:include.

Большая разница здесь в том, что при включенной динамике включенная страница будет исполнять в ней собственный pageContext. И поскольку это запрос, вы можете отправлять параметры на страницу так же, как вы можете отправлять параметры вместе с любым другим запросом. С другой стороны, статичность - это всего лишь фрагмент кода, который будет выполняться внутри контекста вызывающей страницы. Если вы статически включаете один и тот же файл более одного раза, код в этом файле будет существовать в нескольких местах на вызывающей странице, чтобы что-то вроде

<%
int i = 0;
%>

генерирует ошибку компилятора (поскольку одна и та же переменная не может быть объявлена ​​более одного раза).

Ответ 3

jGuru:

Директива <%@include file="abc.jsp"%> действует как C "#include", вытягивая текст включенного файла и компилируя его, как если бы он были частью файла include. Входящий файл может быть любого типа (включая HTML или текст).

< jsp: include page = "abc.jsp" > тег компилирует файл как отдельный JSP и вставляет вызов к нему в скомпилированном JSP.

Некоторые JSP-двигатели поддерживают нестандартные теги <!--#include file="data.inc"--> (NCSA- или .shtml-стиль) и <%@ vinclude="data.inc" %> (стиль JRun), но они не определены в JSP и, следовательно, нельзя полагаться.

См. также этот вопрос в FAQ JSP.

Ответ 4

1) Когда использовать включить директиву?

Чтобы предотвратить дублирование одной и той же логики вывода в нескольких jsp веб-приложения, включите механизм, т.е., чтобы способствовать повторному использованию логики представления, включая директиву

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

когда вышеуказанная инструкция получена jsp-движком, она извлекает исходный код abc.jsp и копирует тот же inline в текущем jsp. После копирования перевода выполняется для текущей страницы

Просто говоря, что это статическая инструкция для jsp-движка, т.е. весь исходный код "abc.jsp" копируется на текущую страницу

2) Когда использовать включить действие?

include тег не включает исходный код включенной страницы в текущую страницу, а вывод, сгенерированный во время выполнения с включенной страницы, включается в текущий ответ страницы

включить функцию тега, аналогичную функции включения механизма диспетчера запросов программирования сервлетов

include tag - это команда времени выполнения для jsp-механизма, то есть, скопировав весь код на текущую страницу, вызов метода выполняется "abc.jsp" с текущей страницы

Ответ 5

Один из них - статический импорт (<% = @include... > "), другой - динамический (jsp: include). Это повлияет, например, на путь, который вам нужно будет указать для вашего включенного файла Небольшое исследование в Google расскажет вам больше.

Ответ 6

Java Revisited

  • Ресурс, включенный директивой include, загружается во время jsp-перевода, в то время как ресурс, включенный включением действия, загружается во время запроса.
  • Любое изменение включенного ресурса не будет отображаться в случае включения директивы include, пока компиляция jsp файла не будет снова получена. Хотя в случае включения действия любое изменение включенного ресурса будет отображаться в следующем запросе.
  • Включить директиву - статический импорт, а включение - динамический импорт
  • Включить директиву использует атрибут файла, чтобы указать ресурс, который должен быть включен, включая атрибут страницы использования действия с той же целью.