Як запропонував скафман , файли тегів JSP 2.0 - це коліна бджіл.
Візьмемо ваш простий приклад.
Помістіть наступне WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Зараз на вашій example.jsp
сторінці:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Це робить саме те, що ви думаєте, що це робить.
Отже, давайте розширимо це на щось трохи більш загальне.
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>
Щоб скористатися цим:
<%@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>
Що це купує у вас? Дійсно, але стає ще краще ...
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>
Щоб скористатися цим: (припустимо, у запиті є змінна користувача)
<%@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>
Але виявляється, ви хочете використовувати цей блок деталей користувача в інших місцях. Отже, ми його рефакторируем.
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/>
Тепер попередній приклад стає:
<%@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>
Краса файлів тегів JSP полягає в тому, що вони в основному дозволяють тегувати загальну розмітку, а потім переробляти її на вміст вашого серця.
JSP Tag Files
Tiles
принаймні узурпували такі речі, як тощо, принаймні для мене. Мені здається, що їх набагато простіше використовувати, оскільки єдина структура - це те, що ти їй надаєш, нічого не задумане. Крім того, ви можете використовувати файли тегів JSP для інших речей (наприклад, фрагмент деталей користувача вище).
Ось приклад, схожий на DisplayTag, який я робив, але все це робиться за допомогою файлів тегів (і Stripes
фреймворку, це s: теги ..). Це призводить до таблиці рядків, змінних кольорів, навігації по сторінці тощо:
<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>
Звичайно, теги працюють з JSTL tags
(як c:if
, і т.д.). Єдине, що ви не можете зробити в тілі тегу файлу тегів, це додати код скрипту Java, але це не стільки обмеження, скільки ви можете подумати. Якщо мені потрібні речі з сценаріїв, я просто вкладаю логіку в тег і відпускаю тег. Легко.
Отже, файли тегів можуть бути майже будь-якими, якими ви їх хочете. На самому базовому рівні це просте вирізання та наклеювання рефакторингу. Візьміть шматок макета, виріжте його, зробіть просту параметризацію та замініть на виклик тегів.
На більш високому рівні ви можете робити складні речі, наприклад, цей тег таблиці, який я маю тут.