Яка різниця між включенням файлів з 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>

Отже, який метод я повинен використовувати? Зараз це вважається застарілим або вони є дійсними та охоплюють різні випадки використання?

Редагувати

Чи не використовується цей файл тегів такий самий, як використання включати?

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

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

Відповіді:


293

Огляд елементів синтаксису JSP

По-перше, щоб зробити речі більш зрозумілими, ось короткий огляд елементів синтаксису JSP :

  • Директиви : Вони передають інформацію про сторінку JSP в цілому.
  • Елементи скриптування : Це елементи кодування Java, такі як декларації, вирази, сценарії та коментарі.
  • Об'єкти та сфери застосування : Об'єкти JSP можуть бути створені явно або неявно і доступні в заданому обсязі, наприклад, з будь-якої сторінки сторінки JSP або сеансу.
  • Дії : Вони створюють об'єкти або впливають на вихідний потік у відповіді JSP (або обох).

Як вміст включено в JSP

Існує кілька механізмів повторного використання вмісту у файлі 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>, але воно є більш потужним та гнучким: на відміну від двох інших, <c:import> URL-адреса може бути поза веб-контейнером !

4) Прелюдії та коди:

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


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

МЕТА файлів включає і теги відрізняється.

Файл тегів (концепція, представлена ​​JSP 2.0) є одним із варіантів створення спеціальних тегів . Це швидший і простіший спосіб створити спеціальні теги . Спеціальні теги , також відомі як розширення тегів, - це елементи JSP, які дозволяють вставляти на сторінки JSP користувальницьку логіку та вихід, що надаються іншими компонентами Java. Логіка, що надається через спеціальний тег, реалізується об'єктом Java, відомим як обробник тегів .

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


Щодо вашої редагування

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

  • Будьте налаштовані за допомогою атрибутів, переданих зі сторінки виклику.

  • Поверніть змінні назад на сторінку виклику.

  • Доступ до всіх об'єктів, доступних на сторінках JSP.

  • Спілкуйтеся між собою. Ви можете створити та ініціалізувати компонент JavaBeans, створити загальнодоступну змінну EL, яка посилається на цей бін в одному тезі, а потім використовувати bean в іншому тезі.

  • Будьте вкладені між собою та спілкуйтеся за допомогою приватних змінних.

Читайте також це з "Pro JSP 2": Розуміння спеціальних тегів JSP .


Корисне читання.


Висновок

Використовуйте правильні інструменти для кожного завдання.


Використовуйте файли тегів як швидкий і простий спосіб створення користувацьких тегів, які допоможуть вам інкапсулювати вміст для багаторазового використання .

Що стосується включення вмісту в JSP (цитата тут ):

  • Використовуйте директиву include, якщо файл змінюється рідко . Це найшвидший механізм. Якщо ваш контейнер не автоматично виявляє зміни, ви можете змусити зміни вступити в силу, видаливши файл класу основної сторінки.
  • Використовуйте дію включення лише для вмісту, який часто змінюється , і якщо яку сторінку включити, неможливо вирішити, поки не буде запропоновано головну сторінку.

Але чи не <jsp: include> те саме, що використовувати файли тегів? Я не бачу різниці ... Ви можете передавати змінні файлам, що входять до <jsp: include> так само, як ви можете передавати змінні тегам файлів. Обидва способи дозволяють повторно використовувати контент, вони, здається, роблять абсолютно те саме. Чи є різниця між ними, крім їхніх імен?
sonicboom

@sonicboom Оновлено мою відповідь
informatik01

1
@ informatik01 дуже приємна відповідь, я ціную глибину, приємне форматування та дуже зручний список 4 механізмів.
Рассел Сілва

1
у чому саме перевага <jsp: include> over <* @ include url ..>
Krsna Chaitanya

@KrsnaChaitanya Примітка. Ви маєте помилку друку (зірочку *) в директиві include. <jsp:include>є стандартом включення дії , <%@ include file="" %>є директивою включення . Прочитайте останній розділ (у сірому полі), де окреслюються переваги (тобто рекомендації, коли вибрати той чи інший). Також ознайомтеся з цією статтею для детального опису. Сподіваюся, це допомагає.
informatik01

21

Можливе повторне запитання

<@include>- Тег директиви доручає компілятору JSP об'єднати вміст включеного файлу в JSP перед створенням згенерованого коду сервлетів. Це еквівалент різання та вставлення тексту зі сторінки включення прямо у ваш JSP.

  • Під час виконання виконується лише один сервлет.
  • До змінних скриптів, задекларованих на батьківській сторінці, можна отримати доступ до включеної сторінки (пам’ятайте, що вони однакові).
  • Включена сторінка не потребує можливості складати як окремий JSP. Це може бути фрагмент коду або звичайний текст. Включена сторінка ніколи не буде складена як окрема. Включена сторінка також може мати будь-яке розширення, хоча .jspf став розширенням, яке використовується умовно.
  • Недоліком старіших контейнерів є те, що зміни на сторінках, що включають, можуть не набути чинності до моменту оновлення батьківської сторінки. Останні версії Tomcat перевірять включені сторінки на оновлення та змушують перекомпілювати батьківську програму, якщо вони оновлюються.
  • Наступним недоліком є ​​те, що оскільки код вбудований безпосередньо в метод обслуговування згенерованого сервлета, метод може зрости дуже великим. Якщо вона перевищує 64 Кб, ваша компіляція JSP, ймовірно, не вдасться.

<jsp:include> - Тег JSP Action з іншого боку, вказує контейнеру призупинити виконання цієї сторінки, перейти до запущеної сторінки та об'єднати вихід з цієї сторінки у вихід із цієї сторінки.

  • Кожна включена сторінка виконується як окремий сервлет під час виконання.
  • Сторінки можна умовно включати під час виконання. Це часто корисно для шаблонування рамок, які створюють сторінки з включених. Батьківська сторінка може визначити, яку сторінку, якщо вона є, включити відповідно до певних умов виконання.
  • Значення змінних скриптів потрібно чітко передати на сторінку включення.
  • Включена сторінка повинна бути в змозі запускатися самостійно.
  • Ви рідше стикаєтеся з помилками компіляції через перевищення максимального розміру методу в створеному класі сервлетів.

Залежно від ваших потреб ви можете використовувати <@include>або <jsp:include>


1
Ви маєте на увазі, як ви показали у своєму запитанні <t:mytag><h1>Hello World</h1></t:mytag>:? Це не включати, це звичайне використання тегу (як <jsp:useBean>або <c:if>).
Uooo

Тож у чому різниця між використанням тегів та вмістом файлів, оскільки, здається, файли тегів можуть використовуватися для включення вмісту на сторінку?
sonicboom

9

Основна перевага <jsp:include />над <%@ include >:

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

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

що неможливо в Росії <%@include file="somefile.jsp" %>


Що стосується тегфайлів, я знаю, як працюють inlcudes. Мені цікаво, як відносяться файли тегів до включених, оскільки, здається, вони забезпечують однаковий функціонал. Яка різниця між використанням тегфайлів та використанням у тому числі?
sonicboom

як щодо <%@include file="somefile.jsp?menu=value" %>? Це теж обмежено?
Рошана Пітігала

5

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

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

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

Використовуйте файли тегів, коли ви хочете створити компоненти багаторазового користувальницького інтерфейсу. Якщо у вас є список віджетів, скажімо, і ви хочете переглядати віджети та відображати властивості кожного (у таблиці чи формі), ви створили би тег. Теги можуть приймати аргументи, використовуючи, <%@tag attribute>і ці аргументи можуть бути обов'язковими або необов’язковими - дещо схожі на параметри методу.

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


1

За даними: Java Revisited

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

  2. Будь-які зміни на включених ресурсах не будуть помітні у разі включення директиви, поки файл jsp знову не скомпілюється. Хоча у разі включення дії будь-яка зміна включеного ресурсу буде видно у наступному запиті.

  3. Директива "Включити" - це статичний імпорт, а дія "включити" - це динамічний імпорт.

  4. Директива Включити використовує атрибут файлу для вказівки ресурсів, які потрібно включити, а атрибут сторінки використовує дію з тією ж метою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.