Digamos que tengo un servlet de inicio de sesión simple que comprueba el name
pasado y crea el objeto User
y lo almacena en una sesión.Java servlet y JSP accediendo al mismo bean de sesión
User user = new User();
user.setId(name);
request.getSession().setAttribute("user", user);
response.sendRedirect("index.jsp");
En la página index.jsp
accedo al objeto de usuario a través jsp:useBean
<jsp:useBean id="user" scope="session"
class="package.name.User"/>
<div class="panel">
Welcome ${user.id}
</div>
Funciona hasta ahora.
De la documentación granos JSP
Para localizar o crear una instancia del Bean, toma los siguientes pasos, en este orden:
- intenta localizar un Bean con el alcance y nombre especificar.
- Define una variable de referencia de objeto con el nombre que especifique.
- Si encuentra el Bean, almacena una referencia en la variable. Si ha especificado el tipo, le da a Bean ese tipo.
- Si no encuentra el Bean, crea una instancia de la clase que especifica, guardando una referencia en la nueva variable. Si el nombre de la clase representa una plantilla serializada, Bean se instancia por java.beans.Beans.instantiate.
- Si ha instanciado (más que encuentra) el Bean, y si tiene etiquetas del cuerpo o elementos (entre y), ejecuta las etiquetas del cuerpo.
Las preguntas:
intenta localizar un Bean con el alcance y el nombre que especifique
No especifica el proceso de "localizar". ¿Significa que comprobará HttpServletRequest.getSession()
o simplemente comprobará si otras páginas ya han creado este bean o no?
Si no encuentra el Bean, crea una instancia de la clase que especifique, almacenando una> referencia a ella en la nueva variable.
En realidad, esto significa que JSP puede asociar un grano recién creada con la sesión utilizando jsp_internal_name_user. No hay ninguna palabra sobre cómo almacena JSP y encuentra los granos en la sesión.
Hay una opción para acceder a los objetos de sesión usando ${sessionScope.user}
y eso garantizará que se obtenga el "usuario" del objeto de sesión de Java. El mismo que puse yo mismo.
Java EE 5 ejemplo "Book Store" objetos de sesión de acceso utilizando ${sessionScope.name}
enfoque.
El uso de ${user}
funciona. Y esto es lo que me preocupa. Me gustaría ver una oración específica en la especificación sobre el proceso locate
y si debe funcionar ${user}
o si corresponde a la implementación de referencia JSP y/o JSTL.
¿Hay algún tipo de documentación que describen explícitamente el proceso de resolución de las variables en una página JSP? –
Intellij IDEA completa campos variables solo en el caso de la declaración explícita. –
1) ¿Estás hablando de EL? Verifique la [especificación JSP EL] (https://jsp.dev.java.net/spec/jsp-2_1-fr-spec-el.pdf). En pocas palabras, hace 'PageContext # findAttribute()' para localizar atributos en cualquier ámbito. 2) Ese también es otro argumento que he visto antes. – BalusC