Переменные на страницах jsp с включенными страницами
Каковы правила определения переменных на странице jsp со страницами, добавленными к ним с помощью тегов?
Мое понимание состоит в том, что включенная страница по существу скопирована на страницу, которая заставила бы меня предположить, что если я объявила переменную в родительском jsp, что она будет доступна в дочерних.
Однако Eclipse жалуется на это (понятно, потому что я могу по возможности включать страницы на любую страницу или использовать их как самостоятельные. И я пытаюсь запустить сервер tomcat, который он не запускает.
В основном я хочу получить пару переменных из его сеанса на родительской странице и использовать их на дочерних страницах. Это не работает.
Итак, я ударил его идею получить их из сеанса на каждой из дочерних страниц, однако мне было интересно, могу ли я дать им все те же имена переменных, или если мне придется выбирать разные имена переменных для них на каждой странице, чтобы они не столкнулись.
Также, что касается импорта, если я импортирую log4net в родительский jss, мне также нужно импортировать его в дочерние?
Ответы
Ответ 1
В JSP есть два способа включения других jsp-страниц.
<%@include file="include.jsp"%>
и
<jsp:include page="include.jsp" />
Если вы используете первое, любая переменная, объявленная в родительском JSP, будет включена в include.jsp(конечно, Eclipse не увидит этого, как вы предполагали), поскольку он эффективно копируется компилятором.
Если вы используете второй подход, включение выполняется во время выполнения, а страница включения имеет свою собственную область.
То же самое для импорта. Хотя безопасно их избыточно импортировать на страницу включения.
Если я использую первый, я предпочитаю суффикс их с .jspf, чтобы обозначить фрагмент JSP. Я могу отключить некоторые предупреждения Eclipses в файлах фрагментов. Но в целом я стараюсь избегать использования этого метода и предпочитаю второй подход.
Более подробную информацию можно найти в документах: Включить директиву и JSP включает.
Ответ 2
С объектно-ориентированной точки зрения я бы рекомендовал не полагаться на область действия переменной в parent.jsp, которая включена в child.jsp. Это связано с тем, что когда я включаю фрагмент в jsp, я склонен захотеть повторно использовать этот фрагмент во многих разных местах. Например, если у меня есть child.jsp, я могу использовать его в parent1.jsp, а также parent2.jsp. В этом случае лучше не изменять наследование.
Ответ 3
Используйте следующее, если вы хотите использовать переменную в пути к странице, которая будет включена:
<% pageContext.include("/cities/" + (String) request.getAttribute("country_code") + ".jsp"); %>
Ответ 4
Когда вы создаете переменную, вы должны установить область действия на сеанс, в противном случае включенная страница ее не увидит.
Пример:
<logic:iterate id="supportTmp" name="publicites" indexId="indexLots" scope="session">
<c:set var="support" value="${supportTmp}" scope="session"/>
<c:choose>
<c:when test="${publiciteMoniteur == true}">
<jsp:include page="/jsp/bodies/suiviEnvoiPubliciteMoniteurLigne.jsp" />
</c:when>
<c:otherwise>
<jsp:include page="/jsp/bodies/suiviEnvoiPubliciteDefautLigne.jsp" />
</c:otherwise>
</c:choose>
</logic:iterate>