Como skaffman sugeriu , os arquivos de tags JSP 2.0 são o joelho da abelha.
Vamos dar o seu exemplo simples.
Coloque o seguinte em WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Agora na sua example.jsp
página:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Isso faz exatamente o que você pensa que faz.
Então, vamos expandir isso para algo um pouco mais geral.
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>
Para usar isso:
<%@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>
O que isso te compra? Muito, mas fica ainda melhor ...
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>
Para usar isso: (suponha que tenhamos uma variável de usuário na solicitação)
<%@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>
Mas acontece que você gosta de usar esse bloco de detalhes do usuário em outros lugares. Então, vamos refatorar.
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/>
Agora o exemplo anterior se torna:
<%@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>
A beleza dos arquivos JSP Tag é que ele permite que você basicamente marque uma marcação genérica e depois refatore-a para o conteúdo do seu coração.
JSP Tag Files
usurpou coisas como Tiles
etc., pelo menos para mim. Acho-os muito mais fáceis de usar, pois a única estrutura é o que você fornece, nada preconcebido. Além disso, você pode usar arquivos de tag JSP para outras coisas (como o fragmento de detalhes do usuário acima).
Aqui está um exemplo semelhante ao DisplayTag que eu fiz, mas tudo isso é feito com os arquivos de tag (e a Stripes
estrutura, que é s: tags ..). Isso resulta em uma tabela de linhas, cores alternadas, navegação na página, etc:
<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>
Obviamente, as tags funcionam com o JSTL tags
(como c:if
, etc.). A única coisa que você não pode fazer no corpo de uma tag de arquivo de tag é adicionar código de scriptlet Java, mas isso não é tão uma limitação quanto você imagina. Se eu precisar de material de scriptlet, basta inserir a lógica em uma tag e soltá-la. Fácil.
Portanto, os arquivos de tags podem ser praticamente o que você deseja que eles sejam. No nível mais básico, é simples refatoração de recortar e colar. Pegue um pedaço do layout, corte-o, faça algumas parametrizações simples e substitua-o por uma chamada de tag.
Em um nível superior, você pode fazer coisas sofisticadas, como essa tag de tabela que tenho aqui.
Eu facilitei bastante, a biblioteca de tags de herança JSP Template no estilo Django. https://github.com/kwon37xi/jsp-template-inheritance
Eu acho que facilita o gerenciamento de layouts sem curva de aprendizado.
código de exemplo:
base.jsp: layout
view.jsp: conteúdo
fonte
Com base na mesma idéia básica da resposta de @Will Hartung , aqui está o meu mecanismo de modelo extensível de uma tag mágica. Inclusive inclui documentação e um exemplo :-)
WEB-INF / tags / block.tag:
fonte
Use peças . Isso salvou minha vida.
Mas se você não puder, existe a tag include , tornando-a semelhante ao php.
A tag body pode realmente não fazer o que você precisa, a menos que você tenha um conteúdo super simples. A tag body é usada para definir o corpo de um elemento especificado. Veja este exemplo :
Você especifica o nome do elemento, quaisquer atributos que esse elemento possa ter ("lang" nesse caso) e, em seguida, o texto que o acompanha - o corpo. Então se
content.headerName = h1
,content.lang = fr
econtent.body = Heading in French
Então a saída seria
fonte
Isso também pode ser alcançado com jsp: include. Chad Darby explica bem aqui neste vídeo https://www.youtube.com/watch?v=EWbYj0qoNHo
fonte
adicione dependências para uso <% @ tag description = "Modelo da página do usuário" pageEncoding = "UTF-8"%>
fonte
Eu sei que essa resposta está chegando anos após o fato e já existe uma ótima resposta do JSP por Will Hartung, mas há Facelets, eles são mencionados nas respostas da pergunta vinculada na pergunta original.
Descrição da tag Facelets SO
Infelizmente, a melhor descrição simples do tutorial que encontrei foi na Wikipedia e não em um site de tutoriais. De fato, a seção que descreve os modelos faz o que a pergunta original estava pedindo.
Devido ao fato de o Java-EE 6 ter descontinuado o JSP, eu recomendaria o Facelets, apesar de parecer que pode haver mais necessidade de pouco ou nenhum ganho sobre o JSP.
fonte