2009-06-03 6 views
44

Quali sono le regole di scoping per le variabili in una pagina jsp con le pagine aggiunte usando tag?Variabili nelle pagine jsp con pagine "incluse"

La mia comprensione è che una pagina inclusa viene essenzialmente copiata verbatum nella pagina, il che indurrebbe a supporre che, se ho dichiarato una variabile in un Jsp padre, sarebbe disponibile in quelle secondarie.

Tuttavia Eclipse lamenta (comprensibilmente perché ho potuto tenerne includere le pagine in qualsiasi pagina o usarli come stand-alone. E whe cerco di avviare il server Tomcat che non si avvia.

Io fondamentalmente voglio ottenere un paio di variabili dalla sua sessione nella pagina madre e usarle nelle pagine secondarie.Questo non funziona.

Quindi ho colpito l'idea di ottenerle dalla sessione in ciascuna delle pagine figlio , tuttavia, mi chiedevo se potevo dare loro tutti gli stessi nomi delle variabili, o se dovessi scegliere nomi di variabili diversi per ciascuna pagina in modo che non si scontrassero.

Anche per quanto riguarda le importazioni se importo log4net nel genitore jss devo anche importarlo in quelle child?

+0

Se le variabili sono in sessione, dov'è il problema? E BTW cosa intendi per sessione della pagina madre? –

+1

Le variabili sono variabili intere e poiché le ho raccolte dalla sessione, quindi le ho trasferite su Integer, quindi ottengo il valore int di esse ogni volta che le uso. anche controllando la nullità stavo cercando di risparmiarmi un po 'di dolore non dovendo farlo dichiarando solo una variabile locale. –

risposta

75

In JSP ci sono due modi per includere altre pagine jsp.

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

e

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

Se si utilizza il primo, allora qualsiasi variabile dichiarata sul genitore JSP sarà portata nella include.jsp (ovviamente Eclipse non vedranno questo come ipotizzato) come è effettivamente copiato dal compilatore.

Se si utilizza il secondo approccio, l'inclusione viene eseguita in fase di esecuzione e la pagina di inclusione ha il proprio ambito.

Idem per le importazioni. Sebbene sia sicuro importarli in modo ridondante nella pagina di inclusione.

Se utilizzo il primo, preferisco il suffisso con .jspf per indicare un frammento JSP. Posso quindi disattivare alcuni degli avvisi di Eclipse nei file dei frammenti. Ma in generale cerco di evitare di usare quel metodo e preferisco il secondo approccio.

Ulteriori informazioni possono essere trovate nei documenti qui: Include directive e JSP include.

+3

+1 per jspf advice – Alfabravo

+0

Sono confuso da questo esempio. Forse ci sono sfide con il codice Jasmper? Utilizzando il modulo * <% @ include ...> *; Ottengo un errore del compilatore JSP durante il runtime quando provo a scrivere su una stringa all'interno del 'inclued' .JSP. Posso accettare che forse non sono autorizzato a passare i valori "all'indietro" - Perché l'errore, in base alle regole dichiarate per @include? – will

+1

Si noti che uno spazio tra <% e @ causerà un errore, quindi non provare a scrivere <% @include file = "include.jsp"%>. Senza spazio come mostrato nella risposta funzionerà bene. – CodeReaper

4

Da un punto di vista orientato agli oggetti, raccomanderei di non fare affidamento sull'ambito della variabile in parent.jsp inclusa in child.jsp. Questo perché quando includo un frammento in un jsp tendo a voler riutilizzare quel frammento in molti posti diversi. Ad esempio, se ho un child.jsp, potrei volerlo usare in parent1.jsp e parent2.jsp. Nel caso è meglio non ereditare variabili.

+8

Cosa faresti invece? – Brimstedt

4

Usare la seguente, se si desidera utilizzare variabile all'interno del percorso della pagina da includere:

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

Quando si crea una variabile, è necessario impostare l'ambito alla sessione, in caso contrario, la pagina inclusa non lo vedrò Esempio:

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