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.