Jaka jest różnica między dołączaniem plików za pomocą dyrektywy JSP include, JSP include action a użyciem plików znaczników JSP?

155

Wygląda na to, że istnieją dwie metody tworzenia szablonów w JSP. W tym pliki z jednym z tych wyciągów

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

lub używając plików znaczników JSP

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

A na innej stronie JSP nazwij to za pomocą

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

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

Więc jakiej metody powinienem użyć? Czy jeden z nich jest teraz uważany za przestarzały, czy też oba są prawidłowe i obejmują różne przypadki użycia?

Edytować

Czy użycie tego pliku tagów nie jest tym samym, co użycie dołączenia?

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

I wywołaj to na innym JSP z

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

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

Wydaje mi się, że jest to to samo, co użycie dołączenia i przekazanie do niego parametrów. Czy pliki tagów to to samo, co obejmuje?

GROM dźwiękowy
źródło

Odpowiedzi:

293

Przegląd elementów składni JSP

Po pierwsze, aby wyjaśnić sprawę, oto krótki przegląd elementów składni JSP :

  • Dyrektywy : przekazują informacje dotyczące całej strony JSP.
  • Elementy skryptów : są to elementy kodowania Java, takie jak deklaracje, wyrażenia, skrypty i komentarze.
  • Obiekty i zakresy : obiekty JSP mogą być tworzone jawnie lub niejawnie i są dostępne w ramach danego zakresu, na przykład z dowolnego miejsca na stronie JSP lub w sesji.
  • Działania : tworzą obiekty lub wpływają na strumień wyjściowy w odpowiedzi JSP (lub oba).

Jak zawartość jest dołączana do strony JSP

Istnieje kilka mechanizmów ponownego wykorzystania treści w pliku JSP.

Następujące 4 mechanizmy włączania treści do strony JSP można sklasyfikować jako bezpośrednie ponowne wykorzystanie :
(w przypadku pierwszych 3 mechanizmów cytowanie z „Serwletów Head First i JSP” )

1) Dyrektywa include :

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

Statyczny : dodaje zawartość z wartości atrybutu pliku do bieżącej strony w czasie tłumaczenia . Dyrektywa była pierwotnie przeznaczona dla szablonów układów statycznych, takich jak nagłówki HTML.

2) Akcja <jsp:include> standardowa :

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

Dynamiczny : dodaje zawartość z wartości atrybutu strony do bieżącej strony w momencie żądania . Był przeznaczony bardziej dla dynamicznej zawartości pochodzącej z JSP.

3) Znacznik <c:import>JSTL:

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

Dynamiczny : dodaje treść z wartości atrybutu adresu URL do bieżącej strony w momencie żądania . Działa podobnie <jsp:include>, ale jest bardziej wydajny i elastyczny: w przeciwieństwie do pozostałych dwóch obejmuje<c:import> adres URL może pochodzić spoza kontenera internetowego !

4) Preludia i kody:

Statyczne : preludia i kody można stosować tylko na początku i na końcu strony .
Można niejawnie dołączyć preludia (zwane także nagłówkami) i kodami (zwane także stopkami) dla grupy stron JSP, dodając elementy <include-prelude>i <include-coda>odpowiednio w <jsp-property-group>elemencie w deskryptorze wdrażania aplikacji sieci Web web.xml . Przeczytaj więcej tutaj:
Konfigurowanie niejawnych dołączeń na początku i na końcu stron JSP
Definiowanie niejawnych dołączeń


Plik znaczników to pośrednia metoda ponownego wykorzystania treści, czyli sposób hermetyzacji treści do ponownego wykorzystania . Tag pliku jest plik źródłowy, który zawiera fragment kodu JSP, że jest wielokrotnego użytku jako A znacznika niestandardowego .

CEL dołączeń i plików znaczników jest inny.

Plik tagów (koncepcja wprowadzona w JSP 2.0) jest jedną z opcji tworzenia niestandardowych tagów . To szybszy i łatwiejszy sposób tworzenia niestandardowych tagów . Niestandardowe znaczniki , nazywane również rozszerzeniami znaczników, to elementy JSP, które umożliwiają wstawianie niestandardowej logiki i danych wyjściowych dostarczanych przez inne komponenty Java do stron JSP. Logika dostarczana przez tag niestandardowy jest implementowana przez obiekt Java znany jako obsługi znaczników .

Niektóre przykłady zadań, które mogą być wykonywane przez niestandardowe znaczniki, obejmują operacje na obiektach niejawnych, przetwarzanie formularzy, uzyskiwanie dostępu do baz danych i innych usług przedsiębiorstwa, takich jak poczta e-mail i katalogi, oraz wdrażanie kontroli przepływu.


Odnośnie twojej edycji

Być może w twoim przykładzie (w twojej edycji ) nie ma różnicy między używaniem bezpośredniego dołączania a plikiem znaczników. Ale tagi niestandardowe mają bogaty zestaw funkcji . Mogą

  • Dostosuj się za pomocą atrybutów przekazanych ze strony wywołującej.

  • Przekaż zmienne z powrotem do wywołującej strony.

  • Uzyskaj dostęp do wszystkich obiektów dostępnych na stronach JSP.

  • Porozumcie się ze sobą. Można utworzyć i zainicjować komponent JavaBeans, utworzyć publiczną zmienną EL, która odwołuje się do tego komponentu bean w jednym znaczniku, a następnie użyć tego komponentu w innym znaczniku.

  • Być zagnieżdżone w sobie i komunikować się za pomocą prywatnych zmiennych.

Przeczytaj również z „Pro JSP 2”: Zrozumienie niestandardowych znaczników JSP .


Przydatna lektura.


Wniosek

Używaj odpowiednich narzędzi do każdego zadania.


Użyj plików znaczników jako szybkiego i łatwego sposobu tworzenia niestandardowych znaczników, które mogą pomóc w hermetyzowaniu treści wielokrotnego użytku .

Jeśli chodzi o zawartość dołączaną do strony JSP (cytat z tego miejsca ):

  • Użyj dyrektywy include, jeśli plik zmienia się rzadko . To najszybszy mechanizm. Jeśli Twój kontener nie wykrywa automatycznie zmian, możesz wymusić ich zastosowanie, usuwając plik klas strony głównej.
  • Użyj akcji dołączania tylko dla treści, które często się zmieniają , i nie można zdecydować, która strona ma zostać uwzględniona, dopóki strona główna nie zostanie zażądana.
informatik01
źródło
Ale czy <jsp: include> to to samo, co używanie plików znaczników? Nie widzę żadnej różnicy ... Możesz przekazywać zmienne do plików zawartych w <jsp: include> tak samo jak możesz przekazywać zmienne do plików znaczników. Obie metody pozwalają na ponowne wykorzystanie treści, wydają się robić dokładnie to samo. Czy jest między nimi jakaś różnica inna niż ich imiona?
sonicboom,
@sonicboom Zaktualizowałem moją odpowiedź
informatik01
1
@ informatik01 bardzo fajna odpowiedź, doceniam głębię, ładne formatowanie i bardzo przydatną listę 4 mechanizmów.
Russell Silva
1
jaka dokładnie jest przewaga <jsp: include> nad <* @ include url ..>?
Krsna Caitanya,
@KrsnaChaitanya Uwaga: masz literówkę (gwiazdkę *) w dyrektywie include. <jsp:include>jest standardem zawierającym akcję , <%@ include file="" %>jest dyrektywą include . Przeczytaj ostatnią sekcję (w szarym polu), która przedstawia zalety (tj. Zalecenia, kiedy wybrać jedną lub drugą). Sprawdź również ten artykuł, aby uzyskać szczegółowy opis. Mam nadzieję że to pomoże.
informatik01
21

Możliwe zduplikowane pytanie

<@include>- Znacznik dyrektywy instruuje kompilator JSP, aby scalił zawartość dołączonego pliku z JSP przed utworzeniem wygenerowanego kodu serwletu. Jest to odpowiednik wycinania i wklejania tekstu ze strony dołączanej bezpośrednio do strony JSP.

  • W czasie wykonywania wykonywany jest tylko jeden serwlet.
  • Zmienne Scriptlet zadeklarowane na stronie nadrzędnej są dostępne na dołączonej stronie (pamiętaj, że są to ta sama strona).
  • Dołączona strona nie musi być kompilowana jako samodzielna strona JSP. Może to być fragment kodu lub zwykły tekst. Dołączona strona nigdy nie zostanie skompilowana jako samodzielna. Dołączona strona może również mieć dowolne rozszerzenie, chociaż .jspf stał się tradycyjnie używanym rozszerzeniem.
  • Wadą starszych kontenerów jest to, że zmiany w dołączanych stronach mogą nie zacząć obowiązywać, dopóki strona nadrzędna nie zostanie zaktualizowana. Najnowsze wersje Tomcat sprawdzają strony dołączania pod kątem aktualizacji i wymuszają ponowną kompilację elementu nadrzędnego, jeśli są aktualizowane.
  • Kolejną wadą jest to, że ponieważ kod jest wbudowany bezpośrednio w metodę obsługi wygenerowanego serwletu, metoda może się bardzo rozrosnąć. Jeśli przekroczy 64 KB, kompilacja JSP prawdopodobnie zakończy się niepowodzeniem.

<jsp:include> - Z drugiej strony znacznik JSP Action nakazuje kontenerowi wstrzymanie wykonywania tej strony, uruchomienie dołączonej strony i scalenie danych wyjściowych z tej strony z danymi wyjściowymi z tej strony.

  • Każda dołączona strona jest wykonywana jako oddzielny serwlet w czasie wykonywania.
  • Strony mogą być warunkowo dołączane w czasie wykonywania. Jest to często przydatne do tworzenia szablonów struktur, które tworzą strony z dołączeń. Strona nadrzędna może określić, która strona, jeśli w ogóle, ma zostać uwzględniona zgodnie z niektórymi warunkami w czasie wykonywania.
  • Wartości zmiennych skryptletu muszą być jawnie przekazywane do dołączanej strony.
  • Dołączona strona musi być uruchamiana samodzielnie.
  • Jest mniej prawdopodobne, że napotkasz błędy kompilacji z powodu przekroczenia maksymalnego rozmiaru metody w wygenerowanej klasie serwletu.

W zależności od potrzeb możesz użyć <@include>lub <jsp:include>

Darth
źródło
1
Czy masz na myśli to, co pokazałeś w swoim pytaniu <t:mytag><h1>Hello World</h1></t:mytag>:? To nie jest dołączenie, to normalne użycie tagu (takiego jak <jsp:useBean>lub <c:if>).
Uooo,
Jaka jest więc różnica między używaniem plików tagów i dołączeń, ponieważ wydaje się, że pliki tagów mogą być używane do dołączania treści na stronie?
sonicboom,
9

Główną zaletą <jsp:include />overu <%@ include >jest:

<jsp:include /> umożliwia przekazywanie parametrów

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

co nie jest możliwe w <%@include file="somefile.jsp" %>

Saurabh Ande
źródło
A co z tagfiles, wiem, jak działają inlcudes. Zastanawiam się, w jaki sposób pliki tagów odnoszą się do dołączeń, ponieważ wydaje się, że zapewniają tę samą funkcjonalność. Jaka jest różnica między używaniem plików tagów a używaniem dołączeń?
sonicboom,
co powiesz na to <%@include file="somefile.jsp?menu=value" %>? Czy to też jest ograniczone?
Roshana Pitigala
5

Wszystkie trzy opcje szablonu - <%@include>, <jsp:include>i <%@tag>są ważne, a wszystkie trzy obejmować różne przypadki użycia.

W <@include>przypadku parser JSP wstawia zawartość dołączonego pliku do strony JSP przed kompilacją (podobnie jak w C#include ). Używałbyś tej opcji z prostą, statyczną treścią: na przykład, gdybyś chciał dołączyć nagłówek, stopkę lub elementy nawigacyjne do każdej strony w aplikacji internetowej. Dołączona zawartość staje się częścią skompilowanej strony JSP i nie ma dodatkowych kosztów w czasie wykonywania.

<jsp:include>(i JSTL <c:import>, który jest podobny i jeszcze mocniejszy) najlepiej nadaje się do zawartości dynamicznej. Użyj ich, gdy musisz dołączyć zawartość z innego adresu URL, lokalnego lub zdalnego; kiedy zasób, który dołączasz, sam jest dynamiczny; lub gdy dołączona treść używa zmiennych lub definicji komponentów bean, które są sprzeczne ze stroną zawierającą. <c:import>umożliwia również przechowywanie zawartego tekstu w zmiennej, którą można dalej manipulować lub ponownie wykorzystać. Obydwa powodują dodatkowe koszty związane z wysyłką: jest to minimalne, ale należy mieć świadomość, że dołączanie dynamiczne nie jest „bezpłatne”.

Użyj plików znaczników, jeśli chcesz utworzyć komponenty interfejsu użytkownika wielokrotnego użytku. Jeśli masz, powiedzmy, listę widżetów i chcesz iterować po widżetach i wyświetlać ich właściwości (w tabeli lub w formularzu), utworzyłbyś znacznik. Tagi mogą przyjmować argumenty, używanie <%@tag attribute>i te argumenty mogą być obowiązkowe lub opcjonalne - podobnie jak parametry metod.

Pliki znaczników są prostszym, opartym na JSP mechanizmem pisania bibliotek znaczników, które (przed JSP 2.0) trzeba było pisać przy użyciu kodu Java. Pisanie plików tagów JSP jest dużo bardziej przejrzyste, gdy w tagu jest dużo do zrobienia: nie musisz mieszać kodu Java i HTML, tak jak w przypadku pisania tagów w języku Java.

Hari
źródło
1

Według: Java Revisited

  1. Zasoby zawarte w dyrektywie include są ładowane w czasie tłumaczenia jsp, podczas gdy zasoby zawarte przez akcję include są ładowane w czasie żądania.

  2. Żadna zmiana w dołączonych zasobach nie będzie widoczna w przypadku dyrektywy include, dopóki plik jsp nie zostanie ponownie skompilowany. Podczas gdy w przypadku dołączania akcji, każda zmiana w dołączonym zasobie będzie widoczna w następnym żądaniu.

  3. Dyrektywa Include to import statyczny, a akcja include to import dynamiczny.

  4. Dyrektywa Include używa atrybutu pliku do określenia zasobów, które mają być uwzględnione, podczas gdy akcja include używa atrybutu strony w tym samym celu.

Abhijeet Ashok Muneshwar
źródło