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

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

5 ответов


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

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

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

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

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

2) стандартное действие:

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

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

3) Тег JSTL:

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

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

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

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


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

цель включает в себя и файлы тегов отличается.

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

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


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

может быть, в вашем примере (в вашем редактировать), нет никакой разницы между использованием direct include и файла тегов. Но!--14-->пользовательские теги имеют богатый набор функций. Они может

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

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

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

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

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

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


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


вывод

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

использовать Файлы Тега как быстрый и простой способ создания пользовательские теги.

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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

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


Java Revisited

  1. ресурс, включенный директивой include, загружается во время перевода jsp, а ресурс, включенный действием include, загружается во время запроса.
  2. любое изменение включенного ресурса не будет видно в случае директивы include, пока JSP-файл не будет компилирован снова. В то время как в случае действия include любое изменение включенного ресурса будет видно в следующем запросе.
  3. директива Include является статическим импортом, в то время как действие include-это динамический импорт
  4. директива Include использует атрибут file для указания ресурса, который должен быть включен, в то время как include action использует атрибут page для той же цели.