Jak sugerował skaffman , pliki znaczników JSP 2.0 to kolana pszczół.
Weźmy twój prosty przykład.
Wprowadź następujące dane WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Teraz na twojej example.jsp
stronie:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
To robi dokładnie to, co myślisz.
Rozbudujmy to do czegoś bardziej ogólnego.
WEB-INF/tags/genericpage.tag
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true" %>
<%@attribute name="footer" fragment="true" %>
<html>
<body>
<div id="pageheader">
<jsp:invoke fragment="header"/>
</div>
<div id="body">
<jsp:doBody/>
</div>
<div id="pagefooter">
<jsp:invoke fragment="footer"/>
</div>
</body>
</html>
Aby użyć tego:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<p>Hi I'm the heart of the message</p>
</jsp:body>
</t:genericpage>
Co to kupuje? Naprawdę dużo, ale robi się jeszcze lepiej ...
WEB-INF/tags/userpage.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@attribute name="userName" required="true"%>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome ${userName}</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<jsp:doBody/>
</jsp:body>
</t:genericpage>
Aby użyć tego: (załóżmy, że w żądaniu mamy zmienną użytkownika)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
</p>
</t:userpage>
Ale okazuje się, że lubisz używać tego bloku danych użytkownika w innych miejscach. A więc zmienimy to.
WEB-INF/tags/userdetail.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@tag import="com.example.User" %>
<%@attribute name="user" required="true" type="com.example.User"%>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
Teraz poprzednim przykładem jest:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
<t:userdetail user="${user}"/>
</p>
</t:userpage>
Piękno plików tagów JSP polega na tym, że pozwala ono zasadniczo oznaczać ogólne znaczniki, a następnie refaktoryzować je do zawartości twojego serca.
JSP Tag Files
prawie uzurpowałem sobie takie rzeczy Tiles
, przynajmniej dla mnie. Uważam, że są o wiele łatwiejsze w użyciu, ponieważ jedyną strukturą jest to, co dajesz, nic nie z góry założonego. Ponadto możesz używać plików znaczników JSP do innych celów (takich jak fragment szczegółów użytkownika powyżej).
Oto przykład podobny do DisplayTag, który zrobiłem, ale wszystko to odbywa się za pomocą Tag Files (i Stripes
frameworka, to jest s: tags ...). Powoduje to powstanie tabeli wierszy, naprzemiennych kolorów, nawigacji strony itp .:
<t:table items="${actionBean.customerList}" var="obj" css_class="display">
<t:col css_class="checkboxcol">
<s:checkbox name="customerIds" value="${obj.customerId}"
onclick="handleCheckboxRangeSelection(this, event);"/>
</t:col>
<t:col name="customerId" title="ID"/>
<t:col name="firstName" title="First Name"/>
<t:col name="lastName" title="Last Name"/>
<t:col>
<s:link href="/Customer.action" event="preEdit">
Edit
<s:param name="customer.customerId" value="${obj.customerId}"/>
<s:param name="page" value="${actionBean.page}"/>
</s:link>
</t:col>
</t:table>
Oczywiście tagi działają z JSTL tags
(podobnymi c:if
itp.). Jedyną rzeczą, której nie można zrobić w treści znacznika pliku znacznika, jest dodanie kodu skryptletu Java, ale nie jest to tak duże ograniczenie, jak mogłoby się wydawać. Jeśli potrzebuję skryptu, po prostu umieszczam logikę w tagu i upuszczam tag. Łatwo.
Tak więc pliki znaczników mogą być praktycznie takie, jakie chcesz. Na najbardziej podstawowym poziomie jest to proste refaktoryzowanie wycinania i wklejania. Chwyć kawałek układu, wytnij go, dokonaj prostej parametryzacji i zastąp go wywołaniem znacznika.
Na wyższym poziomie możesz robić wyrafinowane rzeczy, takie jak ten tag tabeli, który tu mam.
Uczyniłem bibliotekę znaczników dziedziczenia szablonów JSP w stylu Django. https://github.com/kwon37xi/jsp-template-inheritance
Myślę, że ułatwia zarządzanie układami bez uczenia się krzywej.
przykładowy kod:
base.jsp: layout
view.jsp: zawartość
źródło
Opierając się na tym samym podstawowym pomyśle, co w odpowiedzi @Will Hartung , oto mój magiczny silnik szablonów z możliwością rozszerzenia o jeden tag. Zawiera nawet dokumentację i przykład :-)
WEB-INF / tags / block.tag:
źródło
Użyj kafelków . Uratowało mi to życie.
Ale jeśli nie możesz, istnieje tag włączający , dzięki czemu jest podobny do php.
Tag treści może nie robić tego, czego potrzebujesz, chyba że masz super prostą treść. Znacznik body służy do definiowania treści określonego elementu. Spójrz na ten przykład :
Podajesz nazwę elementu, wszelkie atrybuty, które może mieć element (w tym przypadku „lang”), a następnie tekst, który się w nim znajduje - treść. Więc jeśli
content.headerName = h1
,content.lang = fr
, icontent.body = Heading in French
Wtedy wynik byłby
źródło
Można to również osiągnąć za pomocą jsp: include. Chad Darby dobrze wyjaśnia tutaj w tym filmie https://www.youtube.com/watch?v=EWbYj0qoNHo
źródło
dodaj zależności do użycia <% @ tag description = strona „Szablon strony użytkownika” pageEncoding = „UTF-8”%>
źródło
Wiem, że ta odpowiedź nadejdzie wiele lat po fakcie i jest już świetna odpowiedź JSP Willa Hartunga, ale są Facelety, są nawet wspomniane w odpowiedziach na powiązane pytanie w pierwotnym pytaniu.
Opis znacznika SO Facelets
Niestety najlepszy opis samouczka, jaki znalazłem, znajduje się w Wikipedii, a nie w witrynie z samouczkami. W rzeczywistości sekcja opisująca szablony jest zgodna z pierwotnym pytaniem.
Z uwagi na fakt, że Java-EE 6 przestało działać JSP, zaleciłbym skorzystanie z Facelets, mimo że wygląda na to, że może być więcej wymaganych za niewielki lub żaden zysk w stosunku do JSP.
źródło