Foros del Web » Programación para mayores de 30 ;) » Java »

Variables globales en jsp

Estas en el tema de Variables globales en jsp en el foro de Java en Foros del Web. Hola amigos soy nueva en el foro! y ando buscando ayuda porfavor ! se creo un sitio en JSP y todas las variables fueron declaradas ...
  #1 (permalink)  
Antiguo 04/03/2009, 11:39
Avatar de fofis13  
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Variables globales en jsp

Hola amigos soy nueva en el foro! y ando buscando ayuda porfavor ! se creo un sitio en JSP y todas las variables fueron declaradas asi

<%!
private String id_apli="", desc_apli="", ida="", id_us="", attr="";
//private String [][] aplicacion;
private int a=0, x=0, z=0, bot=0, insertado=0, reg=0, tot_reg=0;
private boolean error=false;
varAplicaciones apl=new varAplicaciones();

%>

hasta arriba de la página!!
el sistema funciona muy bien para 1 sola persona pero ya si entran mas usuarios las variables esas son modificadas!!
hay alguna forma de solucionarlo sin reacer el sitio
esperare su respuesta muchs gracias!
  #2 (permalink)  
Antiguo 04/03/2009, 12:08
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Variables globales en jsp

mmmm, no creo q el problema sea q entren muchos usuarios, por q cuando un usuario entra se le crea su propia sesion y por ende su propia instancia de la clase (de sus variables y metodos), o sea se hace un hilo q solo puede ser modificado por ese usuario, a menos q las variables se creen estaticas entonces si cuando se modifica una se modifican para todos, pero veo q no es tu caso, Una pregunta ¿como sabes q se modifican las variables cuando otro usuario entra?, a ver si puedes dar mas detalles para poder ayudarte mejor, bye
  #3 (permalink)  
Antiguo 04/03/2009, 12:18
Avatar de fofis13  
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Variables globales en jsp

gracias por contectar!!!
hize algunas pruebas!!

has de cuenta estan declaradas las variables dentro del <%! %> eso quiere decir q son globales no?

ha pues entrtre con mi usuario al módulo este

por ejemplo esto es lo que me resulto
<%!

private String nombre="";

%>

entro yo y se modifica la variable nombre="reyna"

pero si entra otra persona al mismo modulo ahora nombre="yoana"

e supone q solo yo devo de modificar esas variables o el otro usuario

espero q esto te sirva!!! muchas gracias
  #4 (permalink)  
Antiguo 04/03/2009, 12:20
Avatar de fofis13  
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Variables globales en jsp

hice unas investigaciones hacerca de las variables q estan declaradas entre <%! %> y dice que como son globales estas son modificados por todos los usuarios q entren a la pagina porque se crean junto con el servlet pero no c si si sea de esa manera como yo jamas havia trabajado con jsp
  #5 (permalink)  
Antiguo 04/03/2009, 12:30
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Variables globales en jsp

ooo, perdon, ya vi q tienes <%! %> eso quiere decir q tus variables son estaticas entonces se pueden modificar por todos, solo qitale el simbolo de exclamacion si no quieres q pase eso o las que no quieras q se modifiquen por todos ponlas solo entre <% %> sin el signo de exclamacion, espero q te sirva, bye
  #6 (permalink)  
Antiguo 04/03/2009, 12:39
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Variables globales en jsp

Para ser un poco más exactos, las variables declaradas dentro de <%! %> no son estáticas, y tampoco se crea una instancia de la clase, variables y métodos por sesión.

Existe una sola instancia de la JSP (a nivel de clase es un servlet) y las variables declaradas entre <%! %> son miembros de esa instancia (variables a nivel de instancia), en cambio las que se declaran dentro de <% %> son variables locales del metodo doService() del servlet.

Lo que pasa en cada petición, es que un Thread distinto* ejecuta el método doService sobre la instancia única, y por lo tanto las variables locales entre peticiones son diferentes (cada Thread tiene su propia copia) y las variables de instancia son compartidas (todos los Threads ven la misma).

Eso es lo que ocurre y por que unas peticiones pueden interferir con unas variables y no con otras. Las sesiones no afectan en este caso para nada.

S!

* Para aun más ser exactos los Threads se pueden reutilizar, pero a efectos prácticos de una aplicación se puede considerar como si en cada petición fuesen diferentes.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #7 (permalink)  
Antiguo 04/03/2009, 12:49
Avatar de drac94  
Fecha de Ingreso: mayo-2008
Ubicación: México
Mensajes: 383
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Variables globales en jsp

ok, muchas gracias por tu comentario greeneyed, cada dia se aprende algo nuevo, si sabia q se creaba un hilo por cada sesion, pero yo pensaba q a cada hilo se le creaban sus propios objetos, pero veo q eso no tiene sentido, si no para que los utilizarias si cada sesion iba a tener sus propios objetos solo modificables por la misma sesion, bueno, gracias por la aclaracion
  #8 (permalink)  
Antiguo 04/03/2009, 12:54
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Respuesta: Variables globales en jsp

Una instancia de una página JSP (o un Servlet) puede ser compartida por más de un cliente.

Esto es así porque la instanciación de un JSP es costosa, por ello los contenedores de aplicaciones web, tienen varias instancias de la página JSP, de manera que cuando llega una solicitud, seleccionan una de ellas (sin tener que crearlas en ese momento) y cuando termina el procesado de la página JSP, esta instancia se coloca nuevamente en la lista de instancias disponibles para procesar otras solicitudes.

Si se declaran variables o métodos dentro de los delimitadores <%! y %> estos no van a ser estáticos por que si nomás. Para que una variable o método sea estático, tiene que ser explícitamente declarado como tal (con la palabra clave static).

Lo que te está ocurriendo, es que múltiples usuarios están usando la misma instancia de la página JSP. Esto no es un error, esto es así por cuestiones de rendimiento.

Para que cada usuario tenga su propia variable nombre, y no se pisen unos a otros, lo que debes hacer es guardar la variable "nombre" en la sesión del usuario, en vez de guardarla en un atributo de la página JSP.

Para guardar el nombre en la sesión de usuario:
Código:
session.setAttribute("nombre", "fofis13");
Para leer el nombre desde la sesión de usuario:
Código:
String nombre = (String) session.getAttribute("nombre");
Espero que te sea de ayuda.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #9 (permalink)  
Antiguo 04/03/2009, 15:21
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Variables globales en jsp

Cita:
Iniciado por drac94 Ver Mensaje
... si sabia q se creaba un hilo por cada sesion...
No confundir sesión con petición. Cada petición va en un Thread diferente. Las peticiones de una sesión no tienen nada que ver, a nivel de variables, excepto lo que se obtenga a través del objeto de sesión. En todo lo demás son igual que peticiones de distintas sesiones.

Cita:
Iniciado por TolaWare Ver Mensaje
Una instancia de una página JSP (o un Servlet) puede ser compartida por más de un cliente.

Esto es así porque la instanciación de un JSP es costosa, por ello los contenedores de aplicaciones web, tienen varias instancias de la página JSP, de manera que cuando llega una solicitud, seleccionan una de ellas (sin tener que crearlas en ese momento) y cuando termina el procesado de la página JSP, esta instancia se coloca nuevamente en la lista de instancias disponibles para procesar otras solicitudes.
No exactamente. Por requerimientos de la especificación (sección srv 2.2 Number of Instances), a no ser que el servlet este en un entorno distribuido o implemente la interfaz SingleThreadModel, sólo debe existir una instancia de servlet por declaración, lo cual en el caso de los servlets lleva a una instancia por JSP. De hecho, que haya más de una instancia en un entorno normal, no tiene ningún sentido por que no mejoraría en nada el rendimiento, de hecho empeoraría el uso de memoria, y a cambio introduciría más aleatoriedad en las peticiones concurrentes. Así que no es que "pueda ser compartida por más de un cliente", es que todos los clientes comparten la misma por que así lo manda la especificación.

Quizá estes confundiendo el modelo de instancias compartidas con lo que se hace con los EJB de sesión, que si funcionan así.


S!

PD: Si, quisquilloso, ya lo se . Pero es que estas cosas son importantes para comprender por que a veces pasa lo que pasa, y además por que es bueno saber como se hacen las cosas para poder "imitarlas" cuando tenemos problemas similares (Yo he usado el modelo de 1 instancia + multiples threads para otras cosas). Y mejor dejarlo claro cuanto antes.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #10 (permalink)  
Antiguo 04/03/2009, 18:05
Avatar de fofis13  
Fecha de Ingreso: marzo-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Variables globales en jsp

muchas gracias por sus comentarios
  #11 (permalink)  
Antiguo 05/03/2009, 10:31
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Respuesta: Variables globales en jsp

Cita:
Iniciado por GreenEyed Ver Mensaje
No confundir sesión con petición. Cada petición va en un Thread diferente. Las peticiones de una sesión no tienen nada que ver, a nivel de variables, excepto lo que se obtenga a través del objeto de sesión. En todo lo demás son igual que peticiones de distintas sesiones.



No exactamente. Por requerimientos de la especificación (sección srv 2.2 Number of Instances), a no ser que el servlet este en un entorno distribuido o implemente la interfaz SingleThreadModel, sólo debe existir una instancia de servlet por declaración, lo cual en el caso de los servlets lleva a una instancia por JSP. De hecho, que haya más de una instancia en un entorno normal, no tiene ningún sentido por que no mejoraría en nada el rendimiento, de hecho empeoraría el uso de memoria, y a cambio introduciría más aleatoriedad en las peticiones concurrentes. Así que no es que "pueda ser compartida por más de un cliente", es que todos los clientes comparten la misma por que así lo manda la especificación.

Quizá estes confundiendo el modelo de instancias compartidas con lo que se hace con los EJB de sesión, que si funcionan así.


S!

PD: Si, quisquilloso, ya lo se . Pero es que estas cosas son importantes para comprender por que a veces pasa lo que pasa, y además por que es bueno saber como se hacen las cosas para poder "imitarlas" cuando tenemos problemas similares (Yo he usado el modelo de 1 instancia + multiples threads para otras cosas). Y mejor dejarlo claro cuanto antes.
Estás en lo cierto GreenEyed. Muchas gracias por la aclaración.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:55.