Incluindo a página JSP em outra página JSP, como evitar várias seções de cabeça / corpo?
-
12-09-2019 - |
Pergunta
Eu gostaria de incluir uma página JSP em outra página JSP. Digamos que eu tenho master.jsp
Isso está incluindo slave.jsp
.
Como slave.jsp
tem o seu próprio <head>
Seção para lidar com JavaScript e CSS, existe uma maneira ou talvez outro método para mesclar o master
e slave
CABEÇAS seção em um único? Também o mesmo deve ser feito para o CORPOS seção.
Eu tenho usado Sitemesh Recentemente, mas acho que é bastante impraticável para configurar um modelo para cada página.
Solução
Eu fui para esta solução passando um parâmetro Ao incluir a página.
dentro Master.jsp
<head>
blablabla
<c:import url="slave.jsp">
<c:param name="sectionName" value="HEAD" />
</c:import>
</head>
<body>
blablabla
<c:import url="slave.jsp">
</c:import>
</body>
e então em slave.jsp O parâmetro é lido e a parte personalizada da página é renderizada.
<c:choose>
<c:when test="${param.sectionName == 'HEAD'}">
head section here [without the <HEAD> tags !]
</c:when>
<c:otherwise>
body section here [without the <BODY> tags !]
</c:otherwise>
</c:choose>
Não é muito bom para ver, mas trabalhando. Dessa forma, sou capaz de remover a duplicação de HEAD
e BODY
peças.
Outras dicas
Você não pode e não deve mesclar dois <html>
documentos um no outro. Isso produziria saída inválida. Melhor incluir CSS/JS condicionalmente com a ajuda de Jstl c:if
ou c:choose
Tag.
Exemplo básico:
<head>
<script type="text/javascript" src="global.js"></script>
<c:if test="${isAdminPage}">
<script type="text/javascript" src="admin.js"></script>
</c:if>
</head>
Fora de Sitemesh, você está praticamente sem sorte. No entanto, eu reconsideraria seu design se você achar que a configuração por página é impraticável. Quantas páginas seu aplicativo terá?
You could also extend the conditional option, and make a meta.jsp
(for example), which contains a Map
for each of the head elements - meta tags, css hrefs, script hrefs, and use the name of the jsp as a key in that Map. Then you call request.getRequestURI()
, and show whatever you have put in the map under that key.
Not a very beautiful solution, but working.