Problema obteniendo usuarios online en Spring

Hola amigos, os cuento, lo que intento es cargar desde un SessionListener el valor de los usuarios online a un bean contador, de tal manera, que después es accedido a través del JSP via JSTL.

Para ello, lo primero que creo es el bean contador.

 

 

Lo siguiente, el SessionListener con acceso al bean contador cargado en el contexto de la aplicación.

 

 

 

 
Añado el listener al web.xml para que sera cargado en el deploy.

 

Y accedo a la propiedad que retorna el número de usuarios del bean contador vía JSTL.

 

Haciendo debug en los métodos sessionCreated y sessionDestroyed funcionan perfectamente, y el valor en cada momento del bean contador es correcto. El PROBLEMA esta en que directamente, en la vista no aparece ningún resultado, blanco.

¿Alguien sabe donde reside el problema?. Gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

enredos

Pues a mi me parece que tu bronca es que en el JSP no tienes el bean usuariosOnline, porque no lo has metido a la pagina. Como que le das muchas vueltas al asunto de tener el applicationContext, no? Por qué no usas el ContextLoaderListener de Spring?

 

Con eso puedes obtener el applicationContext desde un servlet muy fácil:

 

Tiene mucho tiempo que no uso JSP, la última vez todavía era con Spring 2.5 y fue al aventón, pero la manera en que usaba el appcontext en JSP era asi:

 

Aparte de esto, ese bean que cuenta los usuarios, si lo usas de manera concurrente, no va a darte un valor fidedigno. En vez de set y get con un vil int, deberías tener un AtomicInteger y publicar tres metodos en tu bean. Algo como entrar(), salir() y getUsuarios() para que entrar() incremente el número por 1, salir() decremente el número por 1 y getUsuario() devuelve el valor actual. AtomicInteger sirve justo para lo que quieres en ambientes concurrentes.

Imagen de ezamudio

Spring 3

No sé si estaba en Spring 2 pero en Spring 3 ya vi que puedes usar un objeto llamado InternalResourceViewResolver para exponer los beans del contexto en un JSP 2.0. Si usas JSTL, puedes agregar esto a tu applicationContext:

 

Y entonces en tus JSP ya simplemente puedes invocar cualquier bean de tu applicationContext con ${bean} y o con el   de JSTL. Y no tienes que implementar nada más. Tu SessionListener lo sigues teniendo pero usa mucho menos código, porque el applicationContext simplemente lo obtienes con   de modo que no necesitas esa clase MyContext ni la de MyApplicationContextAware.

Hola de nuevo.

Hola ezamudio, y gracias por contestar.

WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext()) no lo puedo utilizar en Listener ya que no tengo forma de acceder a la session de la aplicación al no tener acceso al objeto HttpServletRequest, y a través de event.getSession.getServletContext() me dice que no se encuentra el bean "usuariosOnline" en ese contexto de la aplicación.

PD: Respecto a lo de meter código java en un JSP, soy enemigo total de eso... Para eso tenemos los beans en Spring y JSTL, que sino los diseñadores se asustan... xD

Respecto al problema en particular, sigo sin solucionarlo, he añadido la propiedad "org.springframework.web.servlet.view.JstlView" al viewResolver pero sigue sin funcionar.

Lo que es el SessionListener y el bean contador, funcionan perfectamente, ya que al hacer debug a los métodos del SessionListener, y meterle unos println los datos son correctos, es mas, si envió los datos a la sesión y los recupero en el JSP con "sessionScope.contador" funciona perfectamente. El problema reside unicamente en el acceso desde el JSP a la propiedad de ese maldito bean, no la hace bien y no se porque.

Solucionado.

Hola, nada, era tan sencillo como poner la propiedad exposeContextBeansAsAttributes a true en el viewResolver.

Un saludo y gracias. :)