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

No entiendo sesiones en Java

Estas en el tema de No entiendo sesiones en Java en el foro de Java en Foros del Web. Hola a todos. Tengo el sgte codigo parte de un servlet: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código JAVA: Ver original public void doPost ( HttpServletRequest request, HttpServletResponse response ...
  #1 (permalink)  
Antiguo 29/11/2010, 07:21
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 11 meses
Puntos: 43
No entiendo sesiones en Java

Hola a todos. Tengo el sgte codigo parte de un servlet:

Código JAVA:
Ver original
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2.    throws ServletException, IOException {  
  3.   PrintWriter out = response.getWriter();
  4.   HttpSession session = request.getSession(true);
  5.   ArrayList<DetallepBean> array =(ArrayList<DetallepBean>)session.getAttribute("milista");
  6.  
  7.   if(array==null){
  8.       array=new ArrayList<DetallepBean>();
  9.       session.setAttribute("milista",array);
  10.   }
  11.  
  12.    DetallepBean depBean=new DetallepBean();
  13.    depBean.setAlmacen(request.getParameter("almacen"));
  14.    depBean.setDescripcion(request.getParameter("descripcion"));
  15.        
  16.    array.add(depBean);  
  17.  
  18.   //session.setAttribute("milista",array);
  19.  }
Cuando ejecuto por primera vez el servlet, el array es nullo, si es nulo creo un array en blanco y lo almaceno en una variable milista de la sesion. Se supone que esta variable almacena un array en blanco en ese instante, pero cuando ejecuto por segunda vez el servlet y recupero esa variable contiene un array con un registro. Porqué?

Despues de agregar un objeto al array, porque ya no es necesario hacer esto: session.setAttribute("milista",array); ???

Alguien me podría dar una explicacion mas a fondo de como funciona un geAttribute y un setAttribute? en internet no encontre nada, solo ejemplos clasicos.

Muchas Gracias.
  #2 (permalink)  
Antiguo 29/11/2010, 10:07
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: No entiendo sesiones en Java

Hola:

Ese es el comportamiento q has programado.
En la primera llamada a tu servlet:
- creas la session si no existe: request.getSession(true)
- adicionas un atributo "milista" a la session: session.setAttribute("milista",array);
- y le adicionas un elemento a la lista q ya está en la session: array.add(depBean);

cualquier libro decente de JavaEE (incluso los de J2EE) te puede dar una buena explicación acerca de q es una sesión y como trabajar con ellas. De todas formas aki van unos links:
http://www.javapassion.com/portal/java-ee-programming-basics-i-with-passion/java-ee-programming-with-passion
http://pdf.coreservlets.com/
http://www.programacion.com/articulo/servlets_y_jsp_82/10


slds;

Nup_

Última edición por nup_; 29/11/2010 a las 10:44
  #3 (permalink)  
Antiguo 29/11/2010, 11:39
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 11 meses
Puntos: 43
Respuesta: No entiendo sesiones en Java

Dejame ver si entendi la variable array está asociado a la sesión y cualquier cambio que haga en array esos cambios se guardarán automaticamente en la sesion?
Ya no es necesario hacer un setAttribute("milista",array) para que se guarde los cambios?
  #4 (permalink)  
Antiguo 29/11/2010, 12:08
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: No entiendo sesiones en Java

Cita:
Iniciado por chicohot20 Ver Mensaje
Dejame ver si entendi la variable array está asociado a la sesión y cualquier cambio que haga en array esos cambios se guardarán automaticamente en la sesion?
Ya no es necesario hacer un setAttribute("milista",array) para que se guarde los cambios?

No exactamente.
La variable array es una referencia a un objeto ArrayList. En la sesión también hay una referencia a este mismo objeto, esta referencia se puede obtener mediante session.getAttribute("milista").
Cuando haces una operación sobre cualquiera de estas referencias (array o la q obtuviste de la session) estás actuando sobre el mismo objeto.

Por tanto, no es q los cambios se guarden automáticamente en la sesión sino q tanto array como session.getAttribute("milista") están referenciando al mismo objeto.

Échale un vistazo a este link:
http://jpangamarca.wordpress.com/cafe-java/en-java-el-paso-de-parametros-es-por-valor/

slds;

Nup_
  #5 (permalink)  
Antiguo 29/11/2010, 12:49
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 11 meses
Puntos: 43
Respuesta: No entiendo sesiones en Java

Bueno gracias, lo del link no entiendo que tiene que ver con sesiones, pero algo entendi.
Otra ultima duda porque en este ejemplo no me imprime 1, es diferente?
Código JAVA:
Ver original
  1. Integer count =(Integer)session.getAttribute("contador");
  2.             if (count == null) {
  3.             count = new Integer(0);
  4.             session.setAttribute("contador",count);
  5.             }
  6.             count = new Integer(count.intValue() + 1);
  7.              out.println(session.getAttribute("contador"));

Gracias nup_
  #6 (permalink)  
Antiguo 29/11/2010, 14:27
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: No entiendo sesiones en Java

Hola:

El link es para q tengas una idea de que son las referencias en java. Supongo q eso también lo puedes encontrar en algún buen tutorial, no solo de java sino de programación en general.

En cuanto al código q pones:
El operador new crea un nuevo objeto y te devuelve una referencia a él. Por tanto:
Código JAVA:
Ver original
  1. count = new Integer(count.intValue() + 1);
va a crear un nuevo objeto de tipo Integer y count va a perder su valor original y ahora va a referenciar al nuevo objeto recién creado. Por lo q session.getAttribute("contador") va a estar referenciando a un objeto y count a otro.
Es diferente a lo q hacías antes:
Código JAVA:
Ver original
  1. array = new ArrayList()
  2. session.setAttribute( "milista" , array )
  3. array.add( blabla ) // array es el mismo objeto q está en la sesión

Ahora haces esto:
Código JAVA:
Ver original
  1. count = new Integer(0);
  2. session.setAttribute("contador",count);
  3. count = new Integer(count.intValue() + 1); // count tiene un nuevo objeto diferente del q esta en la sesión.

espero haya aclarado algo.

slds;

Nup_
  #7 (permalink)  
Antiguo 29/11/2010, 14:37
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 11 meses
Puntos: 43
Respuesta: No entiendo sesiones en Java

Dejame decirte que estas equivocado.
Si coloco así tampoco me imprime el nuevo valor de count:
Código JAVA:
Ver original
  1. Integer count =(Integer)session.getAttribute("contador");
  2.             if (count == null) {
  3.             count = new Integer(0);
  4.             session.setAttribute("contador",count);
  5.             }
  6.             count = 2;
  7.              out.println(session.getAttribute("contador"));

Eso porque Integer es un dato inmutable y el objeto ArrayList no lo es, para el integer si es necesario, despues de asignar un valor count=2, hacer esto session.setAttribute("contador", count); en cambio en el ArrayList no.

Así sí me imprime el nuevo valor
Código JAVA:
Ver original
  1. Integer count =(Integer)session.getAttribute("contador");
  2.             if (count == null) {
  3.             count = new Integer(0);
  4.             session.setAttribute("contador",count);
  5.             }
  6.             count = 2;
  7.                 session.setAttribute("contador", count);
  8.              out.println(session.getAttribute("contador"));

Última edición por chicohot20; 29/11/2010 a las 14:43
  #8 (permalink)  
Antiguo 29/11/2010, 17:49
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: No entiendo sesiones en Java

Cita:
Iniciado por nup_
va a crear un nuevo objeto de tipo Integer y count va a perder su valor original y ahora va a referenciar al nuevo objeto recién creado. Por lo q session.getAttribute("contador") va a estar referenciando a un objeto y count a otro.



Cita:
Dejame decirte que estas equivocado.


Lo que te ha dicho es cierto, sólo habló de ArrayList, con count = 2 estabas haciendo justo lo que te dijo que no estaba bien, ya que

Cita:
count = 2; es equivalente a count = new Integer(2)
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #9 (permalink)  
Antiguo 29/11/2010, 20:00
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 14 años, 11 meses
Puntos: 43
Respuesta: No entiendo sesiones en Java

Gracias Xerelo, admito mi error, ahora mis dudas aumentan mas. Supongamos que tengo la siguiente clase:
Código JAVA:
Ver original
  1. public class Miclase(){
  2.     private String cadena;
  3.     private ArrayList<Detalleclass> lista;
  4.     public Miclase(){
  5.         this.lista=new ArrayList<Detalleclass>();
  6.     }
  7.     public void setLista(ArrayList<Detalleclass> lista){
  8.         this.lista=lista;
  9.     }
  10.     public ArrayList getLista(){
  11.         return this.lista;
  12.     }
  13.     public void setCadena(String cadena){
  14.         this.cadena=cadena;
  15.     }
  16.     public String getCadena(){
  17.         return this.cadena;
  18.     }
  19. }

y este es parte de un Servlet:
Código JAVA:
Ver original
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {  
  3. PrintWriter out = response.getWriter();
  4. HttpSession session = request.getSession(true);
  5.  
  6. Miclase clase =(Miclase)session.getAttribute("clase");
  7. if (clase == null) {
  8. clase = new Miclase();
  9. session.setAttribute("clase",clase);
  10. }
  11.  
  12. ArrayList<Detalleclass> array =((Miclase)session.getAttribute("clase")).getLista();
  13.  
  14. Detalleclass detBean=new Detalleclass();
  15. detBean.setAlmacen(request.getParameter("almacen"));
  16. detBean.setDescripcion(request.getParameter("descripcion"));
  17. array.add(depBean);
  18.  
  19.  
  20. clase.setCadena("Una cadena");
  21. clase.setLista(array);
  22. //session.setAttribute("clase",clase);
  23.  
  24. }

Si le quito esto: clase.setLista(array); la sesiones funcionan perfecto! Pero si no le quito aparece el mismo detalle(los mismos registros del array) en ambos navegadores, en los que hago las pruebas, en otras palabras no me funciona. Por que ocurre esto?

Por otro lado clase.setCadena("Una cadena"); funciona bien si le agrego esto: session.setAttribute("clase",clase); al final, pero deja de funcionar el array en las sesiones.

Me esta volviendo loco esto. Si algo no se entiende me lo hacen saber. Algo estaré haciendo mal?

Gracias a todos.

Etiquetas: sesiones
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 18:21.