Как предположил Скаффман , JSP 2.0 Tag Files - это колени пчелы.
Давайте возьмем ваш простой пример.
Поместите следующее в 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, который я сделал, но все это делается с помощью Tag Files (и Stripes
фреймворка, это s: tags ..). Это приводит к таблице строк, чередующихся цветов, навигации по страницам и т.д .:
<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
, и т. Д.). Единственное, что вы не можете сделать в теле тега file tag, это добавить код Java-скриптлета, но это не такое ограничение, как вы думаете. Если мне нужно что-то из скриплетов, я просто добавляю логику в тег и опускаю тег. Легко.
Таким образом, файлы тегов могут быть практически такими, какими вы хотите их видеть. На самом базовом уровне это простой рефакторинг для вырезания и вставки. Возьмите кусок макета, вырежьте его, выполните простую параметризацию и замените его вызовом тега.
На более высоком уровне вы можете делать сложные вещи, как этот тег таблицы, который я здесь.
Я сделал довольно легко, библиотеку тегов наследования JSP-шаблонов в стиле Django. https://github.com/kwon37xi/jsp-template-inheritance
Я думаю, что легко управлять макетами без обучения.
пример кода:
base.jsp: макет
view.jsp: содержание
источник
Основано на той же основной идее, что и в @Will Hartung , вот мой волшебный расширяемый шаблонный движок с одним тегом. Это даже включает документацию и пример :-)
WEB-INF / теги / block.tag:
источник
Используйте плитки . Это спасло мою жизнь.
Но если вы не можете, есть тег include , который делает его похожим на php.
Тег body может на самом деле не делать то, что вам нужно, если у вас нет супер простого контента. Тег body используется для определения тела указанного элемента. Посмотрите на этот пример :
Вы указываете имя элемента, любые атрибуты, которые этот элемент может иметь (в данном случае «lang»), а затем текст, который идет в нем, - тело. Так что если
content.headerName = h1
,content.lang = fr
, иcontent.body = Heading in French
Тогда вывод будет
источник
Этого также можно добиться с помощью jsp: include. Чед Дарби хорошо объясняет здесь в этом видео https://www.youtube.com/watch?v=EWbYj0qoNHo
источник
добавить зависимости для использования <% @ tag description = "Шаблон страницы пользователя" pageEncoding = "UTF-8"%>
источник
Я знаю, что этот ответ придет спустя годы после факта, и Уилл Хартунг уже дал отличный ответ JSP, но есть Facelets, они даже упоминаются в ответах на связанный вопрос в оригинальном вопросе.
Описание тегов Facelets SO
К сожалению, лучшее простое описание учебника, которое я нашел, было в Википедии, а не на сайте учебника. Фактически, раздел, описывающий шаблоны, даже соответствует тому, о чем просил исходный вопрос.
В связи с тем, что Java-EE 6 устарела для JSP, я бы порекомендовал использовать Facelets, несмотря на тот факт, что может показаться, что может потребоваться больше для того, чтобы немного выиграть или не получить преимущества над JSP.
источник