Posso quebrar um loop jsp foreach com layouts de listras
Pergunta
Diga que tenho o seguinte para cada um em uma definição de layout de listras
<c:foreach items="${foo}" var="bar" >
<s:layout-component name="whatever" />
</c:foreach>
Então, quando eu renderizo, faço algo assim
<s:layout-component name="whatever">
//Do something with bar
</s:layout-component>
O que qualquer componente for renderizado antes de ser colocado no layout, para que a barra seja nula e falha. Existe uma maneira de construir uma página inteira antes que o JSP seja analisado?
Solução
Vendo a ausência de qualquer resposta e a pergunta parecendo bastante trivial, não acho que haja muitos usuários de listras aqui. Então, aqui estão meus dois centavos:
Este é definitivamente um problema de escopo. a <s:layout-component>
Não tem acesso ao escopo da página/loop da página pai. Problema semelhante existe no JSP/JSTL quando você faz um <jsp:include>
dentro de a <c:forEach>
. A variável de loop é inacessível no trecho de código incluído por <jsp:include>
. Mas em JSP/JSTL que poderia ser resolvido passando por um <jsp:param>
ao longo de <jsp:include>
. Eu dei uma olhada rápida na documentação do Stripes e descobri um <stripes:param>
. Veja se isso ajuda. Pelo menos aqui está um JSP/JSTL baseado Sscce Para ter a ideia:
main.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// Just for demo purposes. Do NOT use scriptlets in real work.
request.setAttribute("items", java.util.Arrays.asList("foo", "bar", "waa"));
%>
<c:forEach items="${items}" var="item">
<jsp:include page="include.jsp">
<jsp:param name="item" value="${item}" />
</jsp:include>
</c:forEach>
Incluir.jsp
${param.item}<br>
resultado:
foo
bar
waa