Jaka jest różnica między włączaniem plików z dyrektywą JSP include, akcją JSP include a używaniem plików znaczników JSP?

Wydaje się, że istnieją dwie metody tworzenia szablonów za pomocą JSP. W tym pliki z jednym z tych stwierdzeń

<%@ 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>

I na innej stronie JSP wywołaj go z

<%@ 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 obecnie uważany za przestarzały, czy też oba są ważne i obejmują różne przypadki użycia?

Edit

Czy używanie tego pliku znacznika nie jest tym samym co używanie 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/>

And call it on kolejny 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żywanie include i przekazywanie do niego parametrów. Czy pliki znaczników są takie same jak includes?

Author: informatik01, 2013-01-29

5 answers

Przegląd elementów składni JSP

Po pierwsze, aby wszystko było bardziej jasne, oto krótki przegląd elementów składni JSP :

  • dyrektywy: przekazują one informacje dotyczące strony JSP jako w całości.
  • Elementy skryptów: Są to elementy kodowania Javy takie jak deklaracje, wyrażenia, skrypty i komentarze.
  • Obiekty i lunety: obiekty JSP mogą być tworzone jawnie lub dorozumiane i są dostępne w danym zakresie, np. z w dowolnym miejscu na stronie JSP lub sesji.
  • działania: tworzą one obiekty lub wpływają na strumień wyjściowy w JSP odpowiedź (lub obie).

Jak zawartość jest zawarta w JSP

Istnieje kilka mechanizmów ponownego wykorzystywania zawartości w pliku JSP.

Następujące 4 mechanizmy uwzględniania treści w JSP można sklasyfikować jako direct reuse:
(dla pierwszych 3 mechanizmów cytując z "Head First Servlets i JSP")

1) dyrektywa include :

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

Static : dodaje zawartość z wartości atrybutu file do bieżącej strony w czasie tłumaczenia . Dyrektywa była pierwotnie przeznaczone dla szablonów układu statycznego, takich jak nagłówki HTML.

2)<jsp:include> standard akcja:

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

Dynamic : dodaje zawartość z wartości atrybutu page do bieżącej strony w czasie żądania . Był przeznaczony bardziej dla dynamicznych treści pochodzące z JSP.

3) <c:import> JSTL tag:

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

Dynamic : dodaje zawartość z wartości atrybutu URL do bieżącej strony, w czasie żądania. Działa jak <jsp:include>, ale jest bardziej wydajny i elastyczny: w przeciwieństwie do pozostałe dwa obejmują <c:import> url może być spoza web Container !

4) preludia i kodeksy:

Statyczne : preludia i kodeksy mogą być stosowane tylko do początków i końców stron .
Możesz domyślnie dołączyć preludia (zwane również nagłówkami) i codas (zwane także stopkami) dla grupy stron JSP poprzez dodanie <include-prelude> i <include-coda> elementy odpowiednio w element <jsp-property-group> W aplikacji webowej web.deskryptor wdrożenia XML . Czytaj więcej tutaj:
* Konfiguracja Implicit obejmuje na początku i końcu JSP
* Definiowanie implicit obejmuje


Plik znaczników jest pośrednią metodą ponownego wykorzystania zawartości, sposobem hermetyzacji zawartości wielokrotnego użytku. Plik znacznika jest plikiem źródłowym, który zawiera fragment kodu JSP, który jest wielokrotnego użytku jako niestandardowy znacznik.

Celem plików includes i Tag jest inaczej.

Plik z tagiem (koncepcja wprowadzona w JSP 2.0) jest jedną z opcji do tworzenia niestandardowych tagów. Jest to szybszy i łatwiejszy sposób budowania własnych tagów. niestandardowe tagi, znane również jako rozszerzenia znaczników, są elementami JSP, które umożliwiają wstawianie niestandardowej logiki i danych wyjściowych dostarczanych przez inne komponenty Javy do stron JSP. Logika dostarczana przez niestandardowy znacznik jest implementowana przez obiekt Java znany jako znacznik handler .

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


Odnośnie Twojej edycji

Być może w twoim przykładzie (w paragrafie "Edit"), nie ma różnicy między bezpośrednim dołączeniem a plikiem znacznika. Ale niestandardowe znaczniki mają bogaty zestaw funkcji. Mogą

  • Być dostosowane za pomocą atrybutów przekazywanych ze strony wywołującej.

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

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

  • Komunikować się ze sobą. Możesz utworzyć i zainicjować komponent JavaBeans, utworzyć publiczną zmienną EL, która odnosi się do tego elementu bean w jednym tagu, a następnie użyć tego elementu w innym tagu.

  • Być zagnieżdżone wewnątrz siebie i komunikować się za pomocą zmiennych prywatnych.

Przeczytaj również to z "Pro JSP 2": zrozumienie niestandardowych tagów JSP.


[[11]}przydatna lektura.

Podsumowanie

użyj odpowiednich narzędzi do każdego zadania.

Użyj plików znaczników jako szybki i łatwy sposób tworzenia niestandardowych tagów, które mogą pomóc w hermetyzacji zawartości wielokrotnego użytku .

Co do zawartości w JSP (cytat z tutaj):

  • użyj include directive jeśli plik zmienia się rzadko . To najszybszy mechanizm. Jeśli kontener nie wykryje automatycznie zmian, można wymusić ich wprowadzenie, usuwając plik klasy strony głównej.
  • użyj akcji include tylko dla treści, które często się zmieniają, a jeśli nie można zdecydować, którą stronę dołączyć, dopóki nie zostanie poproszona Strona główna.
 297
Author: informatik01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-10 16:55:00

Możliwe Duplikaty Pytań

<@include> - znacznik dyrektywy nakazuje kompilatorowi JSP scalenie zawartości dołączonego pliku z JSP przed utworzeniem wygenerowanego kodu servleta. Jest to odpowiednik cięcia i wklejania tekstu ze strony Dołącz bezpośrednio do JSP.

  • w czasie wykonywania wykonywany jest tylko jeden servlet.
  • zmienne Skryptowe zadeklarowane na stronie nadrzędnej mogą być dostępne na dołączonej stronie (pamiętaj, że są takie same strona).
  • dołączona strona nie musi być skompilowana jako samodzielny 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 mieć również dowolne rozszerzenie .jspf stał się standardowo używanym rozszerzeniem.
  • wadą starszych kontenerów jest to, że zmiany na stronach include mogą nie wejść w życie, dopóki Strona nadrzędna nie zostanie zaktualizowana. Najnowsze wersje programu Tomcat sprawdzą strony include pod kątem aktualizuje i wymusza przekompilowanie rodzica, jeśli jest on zaktualizowany.
  • kolejną wadą jest to, że ponieważ kod jest wbudowany bezpośrednio w metodę usługi generowanego servletu, metoda może rosnąć bardzo duża. Jeśli przekroczy 64 KB, kompilacja JSP prawdopodobnie się nie powiedzie.

<jsp:include> - z drugiej strony znacznik akcji JSP instruuje kontener, aby wstrzymał wykonywanie tej strony, uruchomił dołączoną stronę i scalił wyjście z tej strony z wyjściem z tej strony strona.

  • każda dołączona strona jest wykonywana jako oddzielny servlet w czasie wykonywania.
  • Strony mogą być dołączane warunkowo w czasie wykonywania. Jest to często przydatne w przypadku szablonów frameworków, które budują strony z elementów includes. Strona nadrzędna może określić, która strona, JEŚLI ISTNIEJE, ma zostać dołączona zgodnie z pewnym warunkiem wykonania.
  • wartości zmiennych scriptlet muszą być jawnie przekazywane do zakładki Dołącz.
  • dołączona strona musi być uruchomiona na swoim własne.
  • jest mniejsze prawdopodobieństwo wystąpienia błędów kompilacji ze względu na przekroczenie maksymalnego rozmiaru metody w generowanej klasie servlet.

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

 23
Author: Darth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:15

Główna przewaga <jsp:include /> nad <%@ include > to:

<jsp:include /> pozwala na podanie 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" %>

 9
Author: Saurabh Ande,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 20:45:10

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

Z <@include>, parser JSP wlicza zawartość dołączonego pliku do JSP przed kompilacją (podobnie jak C #include). Możesz użyć tej opcji z prostą, statyczną zawartością: na przykład, jeśli chcesz dołączyć nagłówek, stopkę lub elementy nawigacji do każdej strony w aplikacji internetowej. Dołączona treść staje się częścią skompilowanego JSP i nie ma dodatkowych kosztów w runtime.

<jsp:include> (i JSTL <c:import>, który jest podobny i jeszcze bardziej wydajny) najlepiej nadają się do dynamicznych treści. Używaj ich, gdy musisz dołączyć zawartość z innego adresu URL, lokalnego lub zdalnego; gdy zasób, do którego dołączasz, jest dynamiczny; lub gdy dołączona zawartość używa zmiennych lub definicji bean, które są sprzeczne ze stroną włączającą. <c:import> pozwala również na przechowywanie dołączonego tekstu w zmiennej, którą można dalej manipulować lub ponownie wykorzystać. Oba te wiążą się z dodatkowym koszt uruchomienia wysyłki: jest to minimalne, ale musisz mieć świadomość, że dołączenie dynamiczne nie jest "bezpłatne".

Użyj plików znaczników, gdy chcesz utworzyć komponenty interfejsu użytkownika wielokrotnego użytku. Jeśli masz listę widżetów, powiedzmy, i chcesz iterację widżetów i właściwości wyświetlania każdego z nich (w tabeli lub w formularzu), utworzysz tag. Znaczniki mogą pobierać argumenty, używając <%@tag attribute> i te argumenty mogą być obowiązkowe lub opcjonalne-podobnie jak parametry metody.

Pliki znaczników są prostszym, opartym na JSP mechanizmem pisania bibliotek znaczników, które (pre JSP 2.0) trzeba było pisać przy użyciu kodu Java. Pisanie plików znaczników JSP jest o wiele czystsze, gdy w znaczniku jest dużo renderowania: nie musisz mieszać kodu Javy i HTML, tak jak musiałbyś to zrobić, gdybyś napisał tagi w Javie.

 6
Author: Hari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 08:08:41

Według: Java Revisited

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

  2. Wszelkie zmiany w dołączonych zasobach nie będą widoczne w przypadku dyrektywy include dopóki plik jsp nie zostanie skompilowany ponownie. Podczas gdy w przypadku akcji Dołącz, wszelkie zmiany w dołączonym zasobie będą widoczne w następnym żądaniu.

  3. Dyrektywa Include jest importem statycznym, podczas gdy akcja include jest importem dynamicznym.

  4. Dyrektywa Include używa atrybutu file do określenia zasobów, które mają zostać włączone, podczas gdy akcja include używa atrybutu page w tym samym celu.

 1
Author: Abhijeet Ashok Muneshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-11 00:09:17