2009-06-03 17 views
44

¿Cuáles son las reglas de determinación del alcance de las variables en una página jsp con páginas añadidas mediante etiquetas?Variables en páginas jsp con páginas "incluidas"

Según tengo entendido, una página incluida se copia básicamente verbatum en la página, lo que me llevaría a suponer que si he declarado una variable en un jsp principal, estaría disponible en las secundarias.

Sin embargo Eclipse se queja de esto (es comprensible porque podía incluir factiblemente las páginas en cualquier página o utilizarlos de manera autónoma. Y cuando planees intento iniciar el servidor Tomcat no se puede iniciar.

Básicamente quiero Obtenga un par de variables de la sesión en la página principal y úselas en las páginas secundarias. Esto no funciona.

Así que he pensado en la idea de obtenerlos de la sesión en cada una de las páginas secundarias. Sin embargo, me preguntaba si podría darles todos los mismos nombres de variable, o si tendría que elegir nombres de variable diferentes para ellos en cada página para que no chocaran.

¿Qué pasa con las importaciones si importo log4net en el jss padre también tengo que importarlo en los secundarios?

+0

Si las variables están en sesión, ¿cuál es el problema? Y por cierto, ¿qué quiere decir con la sesión de la página principal? –

+1

Las variables son variables enteras y como las tengo que extraer de la sesión, las vuelvo a Entero y luego obtengo el valor int de ellas cada vez que las uso. también comprobando la nulidad. Estaba tratando de ahorrarme algo de dolor al no tener que hacer eso simplemente declarando una variable local. –

Respuesta

75

En JSP hay dos formas de incluir otras páginas jsp.

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

y

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

Si utiliza el primero, entonces cualquier variable declarada en la matriz JSP será de alcance en el include.jsp (por supuesto Eclipse no ver esto como que habrá deducido) como está efectivamente copiado por el compilador.

Si usa el segundo enfoque, la inclusión se realiza en tiempo de ejecución y la página de inclusión tiene su propio alcance.

Ídem para las importaciones. Aunque es seguro importarlos redundantemente en la página de inclusión.

Si utilizo el primero prefiero que sufijo con .jspf para significar un fragmento JSP. Puedo desactivar algunas de las advertencias de Eclipses en los archivos de fragmentos. Pero, en general, trato de evitar usar ese método y prefiero el segundo enfoque.

Más información se puede encontrar en los documentos aquí: Include directive y JSP include.

+3

+1 para el consejo jspf – Alfabravo

+0

Estoy desconcertado por este ejemplo. Tal vez hay desafíos con el código de Jasmper? Usando el formulario * <% @ include ...> *; Obtengo un error del compilador JSP en tiempo de ejecución cuando trato de escribir en una cadena dentro del .JSP 'inclued'. Puedo aceptar que tal vez no se me permita pasar los valores "hacia atrás" - ¿Por qué el error, basado en las reglas establecidas para @include? – will

+1

Tenga en cuenta que un espacio entre <% y @ provocará un error, por lo que no intente escribir <% @include file = "include.jsp"%>. Sin espacio como se muestra en la respuesta funcionará bien. – CodeReaper

4

Desde un punto de vista orientado a objetos, recomendaría no confiar en el alcance de la variable en parent.jsp que se incluye en child.jsp. Esto se debe a que cuando incluyo un fragmento en un jsp tiendo a querer reutilizar ese fragmento en muchos lugares diferentes. Por ejemplo, si tengo un archivo child.jsp, me gustaría usarlo en parent1.jsp y parent2.jsp. En el caso, es mejor no heredar de forma variable.

+8

¿Qué harías en su lugar? – Brimstedt

4

Utilice la siguiente, si desea utilizar la variable dentro de la ruta de la página que se incluirá:

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

Cuando se crea una variable, debe establecer el alcance de la sesión, de lo contrario, la página incluida no lo verá Ejemplo:

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