В чем разница между включением файлов с помощью директивы включения JSP, действия включения JSP и использованием файлов тегов JSP?

155

Кажется, что есть два метода для шаблонизации с JSP. Включая файлы с одним из этих утверждений

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

или используя файлы тегов JSP

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

И на другой странице JSP позвоните с

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

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

Так какой метод я должен использовать? Один из них считается устаревшим или они оба действительны и охватывают различные варианты использования?

редактировать

Разве использование этого файла тегов не совпадает с использованием 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/>

И позвоните на другой JSP с

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

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

Мне кажется, это то же самое, что использовать include и передавать ему параметры. Итак, файлы тегов - это то же самое, что включает

ударная волна
источник

Ответы:

293

Обзор элементов синтаксиса JSP

Во-первых, чтобы прояснить ситуацию, вот краткий обзор элементов синтаксиса JSP :

  • Директивы : Они передают информацию о странице JSP в целом.
  • Элементы сценариев : это элементы кодирования Java, такие как объявления, выражения, скриптлеты и комментарии.
  • Объекты и области : объекты JSP могут создаваться явно или неявно и доступны в пределах определенной области, например, из любой точки на странице JSP или в сеансе.
  • Действия : они создают объекты или влияют на выходной поток в ответе JSP (или оба).

Как контент включен в JSP

Существует несколько механизмов для повторного использования содержимого в файле JSP.

Следующие 4 механизма для включения контента в JSP могут быть классифицированы как прямое повторное использование :
(для первых трех механизмов цитирование из "Head First Servlets and JSP" )

1) Директива включения :

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

Статический : добавляет содержимое из значения атрибута файла на текущую страницу во время перевода . Директива изначально предназначалась для шаблонов статического макета, таких как заголовки HTML.

2) <jsp:include> Стандартное действие :

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

Динамический : добавляет содержимое из значения атрибута страницы на текущую страницу во время запроса . Предназначен скорее для динамического контента из JSP.

3) <c:import>тег JSTL:

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

Динамический : добавляет содержимое из значения атрибута URL на текущую страницу во время запроса . Он работает примерно так же <jsp:include>, но он более мощный и гибкий: в отличие от двух других, <c:import> URL может быть за пределами веб-контейнера !

4) Прелюдии и коды:

Статические : прелюдии и коды могут быть применены только к началу и концу страниц .
Вы можете неявно включать прелюдии (также называемые заголовками) и коды (также называемые нижними колонтитулами) для группы страниц JSP, добавляя <include-prelude>и <include-coda>элементы соответственно в <jsp-property-group>элемент в дескрипторе развертывания веб-приложения web.xml . Подробнее читайте здесь:
Настройка неявных включений в начале и конце JSP
Определение неявных включений


Файл тегов - это косвенный метод повторного использования контента, способ инкапсуляции контента многократного использования . Файл тегов является исходный файл, содержащий фрагмент JSP - кода , который можно повторно использовать в качестве пользовательского тега .

ЦЕЛЬ включает в себя и файлы тегов отличается.

Файл тегов (концепция, представленная в JSP 2.0) является одним из вариантов создания пользовательских тегов . Это более быстрый и простой способ создания пользовательских тегов . Пользовательские теги , также известные как расширения тегов, являются элементами JSP, которые позволяют вставлять пользовательскую логику и выходные данные, предоставляемые другими компонентами Java, в страницы JSP. Логика, предоставляемая через пользовательский тег, реализуется объектом Java, известным как обработчик тега .

Некоторые примеры задач, которые могут быть выполнены с помощью пользовательских тегов, включают работу с неявными объектами, обработку форм, доступ к базам данных и другим корпоративным службам, таким как электронная почта и каталоги, а также реализация управления потоком.


Относительно вашего редактирования

Возможно, в вашем примере (в вашем Edit ) нет разницы между использованием прямого включения и файла тегов. Но пользовательские теги имеют богатый набор функций . Они могут

  • Быть настроенным с помощью атрибутов, передаваемых с вызывающей страницы.

  • Передайте переменные обратно на страницу вызова.

  • Доступ ко всем объектам, доступным для страниц JSP.

  • Общайтесь друг с другом. Вы можете создать и инициализировать компонент JavaBeans, создать общедоступную переменную EL, которая ссылается на этот компонент в одном теге, а затем использовать компонент в другом теге.

  • Будьте вложены друг в друга и общайтесь посредством частных переменных.

Также прочитайте это из "Pro JSP 2": Понимание пользовательских тегов JSP .


Полезное чтение.


Вывод

Используйте правильные инструменты для каждой задачи.


Используйте файлы тегов как быстрый и простой способ создания пользовательских тегов, которые помогут вам инкапсулировать повторно используемый контент .

Что касается включения контента в JSP (цитата отсюда ):

  • Используйте директиву include, если файл изменяется редко . Это самый быстрый механизм. Если ваш контейнер не обнаруживает автоматически изменения, вы можете заставить изменения вступить в силу, удалив файл класса главной страницы.
  • Используйте действие включения только для содержимого, которое часто меняется , и если не удается решить, какую страницу включить, пока не будет запрошена главная страница.
informatik01
источник
Но не является ли <jsp: include> тем же, что и при использовании файлов тегов? Я не вижу никакой разницы ... Вы можете передавать переменные в файлы, включенные в <jsp: include>, так же, как вы можете передавать переменные в теговые файлы. Оба метода позволяют вам повторно использовать контент, похоже, они делают одно и то же. Есть ли разница между ними, кроме их имен?
sonicboom
@sonicboom Обновил мой ответ
informatik01
1
@ informatik01 очень хороший ответ, я ценю глубину, хорошее форматирование и очень удобный список из 4 механизмов.
Рассел Сильва
1
В чем именно преимущество <jsp: include> перед <* @ include url ..>?
Кришна Чайтанья
@KrsnaChaitanya Примечание: *в директиве include есть опечатка (звездочка ). <jsp:include>является стандартным действием включения , <%@ include file="" %>является директивой включения . Прочитайте самый последний раздел (в сером поле), в котором изложены преимущества (т.е. рекомендации, когда выбирать тот или иной). Также проверьте эту статью для подробного описания. Надеюсь это поможет.
informatik01
21

Возможный дубликат вопроса

<@include>- Тег директивы указывает компилятору JSP объединить содержимое включенного файла в JSP перед созданием сгенерированного кода сервлета. Это эквивалентно вырезанию и вставке текста со страницы включения прямо в JSP.

  • Только один сервлет выполняется во время выполнения.
  • Переменные сценария, объявленные на родительской странице, могут быть доступны на включенной странице (помните, это одна и та же страница).
  • Включенную страницу не нужно компилировать как отдельную JSP. Это может быть фрагмент кода или простой текст. Включенная страница никогда не будет скомпилирована как отдельная. Включенная страница также может иметь любое расширение, хотя .jspf стало традиционно используемым расширением.
  • Один недостаток старых контейнеров заключается в том, что изменения на включаемых страницах могут не вступить в силу, пока родительская страница не будет обновлена. Последние версии Tomcat будут проверять наличие включаемых страниц на наличие обновлений и принудительно перекомпилировать родительский объект, если они обновлены.
  • Еще одним недостатком является то, что, поскольку код встроен непосредственно в метод службы сгенерированного сервлета, этот метод может стать очень большим. Если оно превышает 64 КБ, ваша компиляция JSP, скорее всего, не удастся.

<jsp:include> - С другой стороны, тег действия JSP указывает контейнеру приостановить выполнение этой страницы, запустить включенную страницу и объединить выходные данные этой страницы с выходными данными этой страницы.

  • Каждая включенная страница выполняется как отдельный сервлет во время выполнения.
  • Страницы могут быть условно включены во время выполнения. Это часто полезно для создания шаблонов каркасов, которые создают страницы из включений. Родительская страница может определить, какую страницу, если таковая имеется, включить в соответствии с некоторыми условиями выполнения.
  • Значения переменных скриптлета должны быть явно переданы на страницу включения.
  • Включенная страница должна быть в состоянии запускаться самостоятельно.
  • Вы с меньшей вероятностью столкнетесь с ошибками компиляции из-за превышения максимального размера метода в сгенерированном классе сервлета.

В зависимости от ваших потребностей, вы можете использовать <@include>или <jsp:include>

Darth
источник
1
Вы имеете в виду , как вы показали в вашем вопросе: <t:mytag><h1>Hello World</h1></t:mytag>? Это не включение, это обычное использование тега (например, <jsp:useBean>или <c:if>).
Уууу
Так в чем же разница между использованием файлов тегов и включений, поскольку кажется, что файлы тегов можно использовать для включения содержимого на страницу?
sonicboom
9

Основным преимуществом <jsp:include />перед <%@ include >является:

<jsp:include /> позволяет передавать параметры

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

что невозможно в <%@include file="somefile.jsp" %>

Саурабх Анд
источник
Что касается tagfiles, я знаю, как работает inlcudes. Мне интересно, как файлы тегов связаны с включениями, так как кажется, что они предоставляют одинаковую функциональность. В чем разница между использованием tagfiles и использованием include?
sonicboom
как насчет <%@include file="somefile.jsp?menu=value" %>? Это тоже ограничено?
Рошана Питигала
5

Все три варианта шаблона - <%@include>, <jsp:include>и <%@tag>справедливы, и все три охватывают различные варианты использования.

С <@include>помощью JSP-анализатора вставляет содержимое включенного файла в JSP перед компиляцией (аналогично C #include). Вы бы использовали эту опцию с простым статическим контентом: например, если вы хотите включить элементы заголовка, нижнего колонтитула или навигации на каждую страницу в вашем веб-приложении. Включенный контент становится частью скомпилированной JSP, и во время выполнения нет никаких дополнительных затрат.

<jsp:include>(и JSTL <c:import>, похожие и даже более мощные) лучше всего подходят для динамического контента. Используйте их, когда вам нужно включить контент с другого URL, локального или удаленного; когда включаемый вами ресурс сам по себе является динамическим; или когда включенный контент использует переменные или определения bean-компонентов, которые конфликтуют с включаемой страницей. <c:import>также позволяет хранить включенный текст в переменной, которой вы можете в дальнейшем манипулировать или использовать повторно. Оба этих варианта требуют дополнительных затрат времени выполнения для отправки: это минимально, но вы должны знать, что динамическое включение не является «бесплатным».

Используйте файлы тегов, когда вы хотите создать повторно используемые компоненты пользовательского интерфейса. Скажем, если у вас есть список виджетов, и вы хотите перебирать виджеты и отображать свойства каждого (в таблице или в форме), вы должны создать тег. Теги могут принимать аргументы, используя, <%@tag attribute>и эти аргументы могут быть обязательными или необязательными - что-то вроде параметров метода.

Файлы тегов - это более простой, основанный на JSP механизм написания библиотек тегов, который (до JSP 2.0) вам приходилось писать с использованием кода Java. Писать файлы тегов JSP намного проще, когда в теге много рендеринга: вам не нужно смешивать код Java и HTML, как если бы вы писали свои теги в Java.

Хари
источник
1

По словам: Java Revisited

  1. Ресурсы, включенные в директиву include, загружаются во время трансляции jsp, а ресурсы, включаемые в действие include, загружаются во время запроса.

  2. Любые изменения во включенных ресурсах не будут видны в случае директивы include, пока файл jsp не скомпилируется снова. Хотя в случае действия включения любое изменение во включенном ресурсе будет видно в следующем запросе.

  3. Директива include - это статический импорт, а действие include - динамический импорт.

  4. Директива include использует атрибут файла для указания ресурсов, которые должны быть включены, в то время как действие include использует атрибут страницы для той же цели.

Абхиджит Ашок Мунешвар
источник