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

Кажется, есть два метода для шаблонов с 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>

Итак, какой метод я должен использовать? Рассматривается ли это устаревшим или они оба действительны и охватывают разные варианты использования?

Edit

Не используется этот файл тега так же, как с помощью 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>

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

Ответ 1

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

Следующие 4 механизма для включения контента в JSP могут быть классифицированы как прямое повторное использование:
(за первые 3 механизма цитирования из "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>, но он более мощный и гибкий: в отличие от двух других, URL-адрес <c:import> может быть извне веб-контейнера !

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

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


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

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

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

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


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

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

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

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

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

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

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

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


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


Заключение

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


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

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

  • Используйте директиву include, если файл изменяется редко. Это самый быстрый механизм. Если ваш контейнер не обнаруживает автоматически изменения, вы можете заставить изменения вступить в силу, удалив файл класса главной страницы.
  • Используйте действие включения только для содержимого, которое часто меняется, и если не удается решить, какую страницу включить, пока не будет запрошена главная страница.

Ответ 2

Возможный повторяющийся вопрос

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

Java Revisited

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