Передача переменной c:forEach в jsp:include

Я пытаюсь получить доступ к некоторым переменным JSTL, которые были установлены в цикле for JSTL во включении.

Пример:

<c:forEach items="${cart.entries}" var="entry">
 <jsp:include page="helper.jsp"></jsp:include>
</c:forEach>

Внутри helper.jsp я хочу иметь возможность ссылаться на переменную 'entry'. Он продолжает появляться как «пустой». Я подумал, может быть, есть способ добавить область видимости для переменной forEach, как это можно сделать с обычными установленными переменными.

Любые идеи?


person littlevahn    schedule 17.10.2011    source источник


Ответы (2)


ОТВЕТ: Мне просто пришлось сделать это, чтобы заставить его работать.

<c:forEach items="${cart.entries}" var="entry">
<c:set var="entryFC" value="${entry}" scope="request"></c:set>
 <jsp:include page="helper.jsp"></jsp:include>
</c:forEach>

Затем я сослался на entryFC в моем include. Не очень элегантный, но он работает, так что я думаю, что плохо с ним.

person littlevahn    schedule 03.11.2011
comment
Я искал более элегантный способ, но в итоге сделал это. Кстати, вам не нужно переименовывать переменную: <c:set var="entry" value="${entry}" scope="request"/> отлично работает и, скорее всего, будет менее запутанным. - person Dmitri; 12.08.2012

Я знаю, что очень поздно отвечать на этот вопрос, но могу быть полезен тем, кто застрял в этой ситуации и ищет ответы.

Мой ответ будет работать, если вы не обязаны использовать тег <jsp: include> для включения jsp. Вместо этого вы можете использовать <%@include file="/WEB-INF/views/path-to-jsp.jsp" %> для импорта другого JSP на страницу, и эта страница может использовать вашу переменную цикла тега <c:forEach>.

Например.

<c:forEach items="${users}" var="user">

    <%@include file="/WEB-INF/views/path-to-jsp.jsp" %> <!-- here ${user} can be use in importing jsp file. -->
</c:forEach>

Это работает, потому что тег <%@include file="" %> вставит содержимое именованного файла в JSP, содержащий тег, как если бы он был скопирован и вставлен. Это делается до анализа содержимого включенного файла, а не во время анализа содержащего JSP. Это больше похоже на директиву C #include, где во время предварительной обработки включаемый файл «вставляется» на место перед компиляцией файла. После того, как содержимое включено, оно оценивается в том же контексте и, следовательно, с теми же доступами и ограничениями, которые были бы у включенного кода, если бы содержимое было просто напечатано на месте.

Принимая во внимание, что тег <jsp:include page=""/> ведет себя по-другому, поскольку результат рендеринга указанной страницы вводится в содержащий JSP в точке тега. Это делается путем отправки запрошенной страницы в тот же контейнер в качестве отдельного запроса на отрисовку и получения результатов, а не содержимого файла. Этот запрос выполняется в собственном контексте, то есть он не использует ту же информацию о странице, что и страница, содержащая тег. Это может быть удобно, особенно если включенный контент может, например, иметь конфликтующие переменные.

person Vijay Shegokar    schedule 15.06.2017