web-dev-qa-db-fra.com

Variables dans les pages jsp avec des pages "incluses"

Quelles sont les règles de portée pour les variables dans une page jsp avec des pages qui leur sont ajoutées à l'aide de balises?

Ma compréhension est qu'une page incluse est essentiellement copiée verbatum dans la page, ce qui me conduirait à supposer que si j'ai déclaré une variable dans un parent jsp, elle serait disponible dans les enfants.

Cependant Eclipse s'en plaint (naturellement parce que je pourrais inclure les pages dans n'importe quelle page ou les utiliser comme autonomes. Et lorsque j'essaie de démarrer le serveur Tomcat, il ne démarre pas.

Je veux essentiellement obtenir quelques variables de la session dans la page parent et les utiliser dans les pages enfants. Ça ne marche pas.

J'ai donc eu l'idée de les obtenir de la session dans chacune des pages enfants, mais je me demandais si je pouvais leur donner tous les mêmes noms de variables, ou si je devais choisir des noms de variables différents pour eux dans chaque page afin qu'ils ne se heurtent pas.

Et qu'en est-il des importations si j'importe log4net dans le jss parent, dois-je également l'importer dans les enfants?

52
Omar Kooheji

Dans JSP, il existe deux façons d'inclure d'autres pages jsp.

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

et

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

Si vous utilisez la première, alors toute variable déclarée sur le JSP parent sera dans la portée dans le include.jsp (bien sûr Eclipse ne verra pas cela comme vous l'avez supposé) car elle est effectivement copiée par le compilateur.

Si vous utilisez la deuxième approche, l'inclusion est effectuée au moment de l'exécution et la page d'inclusion a sa propre portée.

Idem pour les importations. Bien qu'il soit sûr de les importer de manière redondante dans la page d'inclusion.

Si j'utilise l'ancien, je préfère les suffixer avec .jspf pour signifier un fragment JSP. Je peux ensuite désactiver certains des avertissements Eclipses dans les fichiers de fragments. Mais en général, j'essaie d'éviter d'utiliser cette méthode et préfère la deuxième approche.

Plus d'informations peuvent être trouvées dans les documents ici: directive Include et JSP include .

83
Kris

Utilisez ce qui suit, si vous souhaitez utiliser une variable dans le chemin de la page à inclure:

<% pageContext.include("/cities/" + (String) request.getAttribute("country_code") + ".jsp"); %>
7
Dagvadorj

D'un point de vue orienté objet, je recommanderais de ne pas compter sur la portée de la variable dans parent.jsp étant incluse dans child.jsp. En effet, lorsque j'inclus un fragment dans un jsp, j'ai tendance à vouloir réutiliser ce fragment dans de nombreux endroits différents. Par exemple, si j'ai un child.jsp, je peux vouloir l'utiliser dans parent1.jsp ainsi que parent2.jsp. Dans le cas il vaut mieux ne pas hériter de variable.

4
mR_fr0g

Lorsque vous créez une variable, vous devez définir la portée sur session, sinon la page incluse ne la verra pas. Exemple :

<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>
2