Переменные на страницах jsp с «включенными» страницами - PullRequest
52 голосов
/ 03 июня 2009

Каковы правила области видимости для переменных на странице jsp со страницами, добавленными к ним с помощью тегов?

Насколько я понимаю, включенная страница по существу копируется дословно в страницу, что заставило бы меня предположить, что если бы я объявил переменную в родительском jsp, она была бы доступна в дочерних.

Однако Eclipse жалуется на это (по понятным причинам, потому что я мог бы реально включить страницы в любую страницу или использовать их как отдельные. И когда я пытаюсь запустить сервер Tomcat, он не запускается.

Я в основном хочу получить пару переменных из сеанса на родительской странице и использовать их на дочерних страницах. Это не работает.

Так что мне пришла в голову мысль получить их из сеанса на каждой из дочерних страниц, однако мне было интересно, могу ли я дать им все одинаковые имена переменных или мне придется выбирать разные имена переменных для них на каждой странице, чтобы они не конфликтовали.

А как насчет импорта, если я импортирую log4net в родительский jss, мне также нужно импортировать его в дочерний файл?

Ответы [ 4 ]

83 голосов
/ 03 июня 2009

В JSP есть два способа включения других страниц JSP.

<%@include file="include.jsp"%>

и

<jsp:include page="include.jsp" />

Если вы используете первое, то любая переменная, объявленная в родительском JSP, будет находиться в области видимости в include.jsp (конечно, Eclipse не увидит этого, как вы и предполагали), поскольку она эффективно копируется компилятором.

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

То же самое для импорта. Хотя это безопасно для избыточного импорта их на странице включения.

Если я использую первое, я предпочитаю добавлять суффиксы к .jspf для обозначения фрагмента JSP. Я могу затем отключить некоторые предупреждения Eclipses в файлах фрагментов. Но в целом я стараюсь избегать использования этого метода и предпочитаю второй подход.

Более подробную информацию можно найти в документации здесь: Включить директиву и JSP включают .

7 голосов
/ 03 марта 2010

Используйте следующее, если вы хотите использовать переменную в пути к включаемой странице:

<% pageContext.include("/cities/" + (String) request.getAttribute("country_code") + ".jsp"); %>
4 голосов
/ 03 июня 2009

С объектно-ориентированной точки зрения я бы рекомендовал не полагаться на то, что область действия переменной parent.jsp включена в child.jsp. Это потому, что когда я включаю фрагмент в jsp, я хочу повторно использовать этот фрагмент во многих разных местах. Например, если у меня есть child.jsp, я могу использовать его в parent1.jsp, а также parent2.jsp. В этом случае лучше не использовать переменное наследование.

2 голосов
/ 04 октября 2011

Когда вы создаете переменную, вы должны установить область для сеанса, иначе включенная страница не увидит ее. Пример:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...