В чем разница между включением файлов с помощью директивы JSP include, действия JSP include и использования файлов тегов 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>

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

Изменить

Разве использование этого файла тегов не то же самое, что использование включения?

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

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


person sonicboom    schedule 29.01.2013    source источник


Ответы (5)


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

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


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

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

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

1) Директива include :

<%@ 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) Прелюдии и коды:

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


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

НАЗНАЧЕНИЕ включает и файлы тегов разное.

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

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


Что касается вашего редактирования

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

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

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

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

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

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

Также прочтите это из Pro JSP 2: Общие сведения о пользовательских тегах JSP.


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


Вывод

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

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

Что касается включения содержимого в JSP (цитата из здесь):

  • Используйте директиву include, если файл редко изменяется. Это самый быстрый механизм. Если ваш контейнер не обнаруживает изменения автоматически, вы можете принудительно применить изменения, удалив файл класса главной страницы.
  • Используйте действие включения только для содержания, которое часто изменяется, и если невозможно решить, какую страницу включить, пока не будет запрошена главная страница.
person informatik01    schedule 08.02.2013
comment
Но разве ‹jsp: include› не то же самое, что использование файлов тегов? Я не вижу никакой разницы ... Вы можете передавать переменные в файлы, включенные с ‹jsp: include›, точно так же, как вы можете передавать переменные в файлы тегов. Оба метода позволяют повторно использовать контент, они, кажется, делают одно и то же. Есть ли между ними какая-нибудь разница, кроме их имен? - person sonicboom; 08.02.2013
comment
@sonicboom Обновил мой ответ - person informatik01; 08.02.2013
comment
@ informatik01 очень хороший ответ, я ценю глубину, хорошее форматирование и очень удобный список из 4 механизмов. - person Russell Silva; 14.11.2013
comment
в чем именно преимущество ‹jsp: include› over ‹* @ include url ..›? - person Krsna Chaitanya; 15.01.2014
comment
@KrsnaChaitanya Примечание: у вас есть опечатка (звездочка *) в директиве include. <jsp:include> - стандартное действие включения, <%@ include file="" %> - директива включения. Прочтите самый последний раздел (в сером поле), в котором описаны преимущества (т.е. рекомендации, когда выбирать тот или иной). Также ознакомьтесь с этим статья для подробного описания. Надеюсь это поможет. - person informatik01; 15.01.2014
comment
@ informatik01 Означает ли это, что при использовании include standard action включенная страница будет переводиться каждый раз, когда мы об этом просим? Потому что, если бы он был переведен только один раз, он не был бы динамическим, верно? Я имею в виду, что он не увидит никакого измененного содержимого. - person Stefan; 10.01.2021
comment
@Stefan Не каждый раз, а только ЕСЛИ он был изменен, то есть так же, как с содержащим (родительским) JSP. См. этот ответ, чтобы увидеть пример результирующего кода при использовании <jsp:include>. Также это очень полезное описание Выполнение JSP процесс. - person informatik01; 10.01.2021

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

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

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

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

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

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

person Darth    schedule 29.01.2013
comment
Вы имеете в виду, как вы показали в своем вопросе: <t:mytag><h1>Hello World</h1></t:mytag>? Это не включение, это обычное использование тега (например, <jsp:useBean> или <c:if>). - person Uooo; 07.02.2013
comment
Итак, в чем разница между использованием файлов тегов и включением, поскольку кажется, что файлы тегов могут использоваться для включения содержимого на страницу? - person sonicboom; 08.02.2013

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

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

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

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

person Saurabh Ande    schedule 07.02.2013
comment
Что касается файлов тегов, я знаю, как работают inlcudes. Мне интересно, как файлы тегов связаны с включениями, поскольку кажется, что они обеспечивают ту же функциональность. В чем разница между использованием файлов тегов и включениями? - person sonicboom; 08.02.2013
comment
как насчет <%@include file="somefile.jsp?menu=value" %>? Это тоже ограничено? - person Roshana Pitigala; 29.11.2019

Все три варианта шаблона - <%@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.

person Hari    schedule 08.02.2013
comment
Итак, если один JSP вызывает <jsp:include> 10 раз какой-то другой файл, этот другой файл будет переведен 10 раз (плюс отправит свой ответ). При использовании <@include> 10 раз этот другой файл будет переведен только один раз (во время перевода). Я правильно понял? - person Stefan; 10.01.2021

Согласно: Возвращение к Java

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

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

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

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

person Abhijeet Ashok Muneshwar    schedule 18.10.2013