Cómo pasar el parámetro a jsp: incluir a través de c: establecer? ¿Cuáles son los scopes de las variables en JSP?

Tengo esto en welcome.jsp

  

Y esto en head.jsp:

 Site Name - ${pgTitle} 

Pero la variable está en blanco, y la salida es meramente

 Site Name - 

He leído muchos artículos y no puedo entender cuál es el problema. Si me hago eco de ${pgTitle} otro lugar dentro del mismo welcome.jsp, entonces ${pgTitle} bien.

Incluyo la biblioteca de tags núcleo en ambas páginas.

Esto se debe a que la variable pgTitle se establece en el scope de la página. Verifíquelo aquí (lo siento, no puedo obtener una documentación oficial para esto).

Si desea que esto funcione, debe establecer la variable en el ámbito de solicitud al menos. Para establecer su variable en el scope de la solicitud, use el atributo de scope en :

  

Según su comentario, en el desarrollo web, el scope de las variables es importante porque define dónde se puede usar la variable (similar a una variable declarada como campo en una clase y una variable declarada localmente en un método). Hay cuatro ámbitos en JSP conocidos como contexto:

  • Alcance de página (manejado por PageContext ). Las variables solo se pueden alcanzar si se establecen como atributos en la página actual. Esto significa que solo la página actual puede acceder a estos atributos, las páginas incluidas son páginas diferentes, por lo que no pueden acceder a estos atributos.
  • Alcance de la solicitud (manejado por ServletRequest ). Las variables solo se pueden alcanzar si se establecen como atributos en la solicitud actual. Esto significa que cada página manejada en la misma solicitud puede acceder a estos atributos. Nota importante : una redirección implica un nuevo proceso de solicitud / respuesta. Esto significa que si establece atributos en la solicitud y ejecuta una redirección, estos atributos no se establecerán como atributos en la nueva solicitud.
  • Alcance de sesión (manejado por HttpSession ). Las variables solo se pueden alcanzar si se establecen como atributos en la sesión de usuario actual. Esto significa que cada página utilizada en la misma sesión de usuario puede usar estos atributos hasta que se eliminen o la sesión expire.
  • Ámbito de aplicación (manejado por ServletContext ). Las variables solo se pueden alcanzar si se establecen como atributos en el contexto actual. Esto significa que cada página de cada atributo de sesión puede acceder a estas variables hasta que se eliminen de SessionContext o la aplicación web no se despliegue.

Más información:

  • ¿Cuáles son los diferentes ámbitos en JSP?

¿Es esta la manera correcta de lograr lo que estoy tratando de hacer?

Si hay un servlet u otro controlador que maneja los atributos que se establecerán en la solicitud (por ejemplo, @Controller de Spring MVC o Bean administrado por JSF), establezca el atributo allí y no en su página directamente.

Personalmente, toma tiempo ganar experiencia y definir el mejor scope de las variables cuando se usan en aplicaciones web. Ejemplos básicos:

  • La división de una String por comas para fines de presentación solo afectará a la vista actual, por lo que se puede establecer en el scope de la página.
  • El error y los mensajes exitosos son los más adecuados en el scope de la solicitud. Si el usuario actualiza la página, es probable que no vea los mismos mensajes a menos que los datos se vuelvan a procesar.
  • La información de usuario como nombre, apodo y preferencias se puede configurar en el scope de la sesión.
  • Si tiene que mostrar una lista de países (que no debería cambiar en pocos días), puede almacenar esta lista en el scope de la aplicación.

Una forma es pasar variables a una inclusión a través de parámetros de consulta:

      

A continuación, puede acceder a esos parámetros con ${param.foo}

Otra sería usar tags personalizadas:

/WEB-INF/tags/head.tag

 <%@ attribute name="title" %>  ${title}  

somePage.jsp

 <%@ taglib prefix="layout" tagdir="/WEB-INF/tags" %>     

Debe establecer que la variable sea (al menos) request ámbito. Puede hacer la identificación de la siguiente manera:

   

Y luego, en head.jsp , puede generar la variable de esta manera: