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

Enviar datos al cliente desde un servlet

Estas en el tema de Enviar datos al cliente desde un servlet en el foro de Java en Foros del Web. Saludos!!! Tengo un servidor y hasta ahora no habia tenido que enviar grandes cantidades de datos al cliente. Hasta ahora lo hacia mediante: Un codigo ...
  #1 (permalink)  
Antiguo 23/08/2011, 10:31
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Enviar datos al cliente desde un servlet

Saludos!!! Tengo un servidor y hasta ahora no habia tenido que enviar grandes cantidades de datos al cliente. Hasta ahora lo hacia mediante:

Un codigo como este en el servlet, y luego recuperaba los datos en el cliente.
Código:
response.setHeader("usuario", nombre);
			response.setHeader("password", pass);
			response.setHeader("imagen", imagen);
			response.setIntHeader("puntuacion", puntuacion);
Se podría hacer esto?

Código:
ej: clase Datos{ String nombre, String apellido, int edad,.....}

ArrayList <Datos> lista = new ArrayList<Datos>();

   para cada usuario hacer{
           Datos auxiliar=getTodoslosdatosdeunUsuario();
           lista.add(auxiliar);
  }

 response.setHeader("arrayconlosdatos", lista);
Serian pocos campos pero pueden ser un arraylist bastante grande. Creo que es una chapuza


Tengo pasarle a mi cliente un ArrayList de objetos. ¿Alguien me puede decir alguna manera de hacerlo? y algún ejemplo o tutorial que seguir.

Muchas gracias.
  #2 (permalink)  
Antiguo 23/08/2011, 12:14
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Enviar datos al cliente desde un servlet

No envies parametros en los headers. Agrega atributos a tu request usando setAttribute.
http://download.oracle.com/javaee/1....lang.Object%29

Los headers son las cabeceras y no deberias de poner valores propios dentro de las cabeceras.
  #3 (permalink)  
Antiguo 23/08/2011, 12:20
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

ok, muchas gracias. Y en lo que respecta a El envio de un ArrayList muy grande de objetos???? como puedo hacerlo???

Creo en el servlet un PrintWriter, creo un xml y lo interpreto en el cliente o hay un método mejor?
  #4 (permalink)  
Antiguo 23/08/2011, 12:22
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Enviar datos al cliente desde un servlet

Pasalo directamente como un atributo, con el metodo request.setAttribute(), y deja que tu vista se encargue de imprimirlo. NO hay necesidad de pasarlo a XML ni nada.
  #5 (permalink)  
Antiguo 23/08/2011, 12:29
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Muchas gracias, lo decia por que eran gran cantidad de datos y no sabía si era lo correcto. Te comento un poco más.

Cada cierto tiempo el cliente llama al servlet y le pide 5 variables de cada Usuario de la base de datos, como hay que estar así periodicamente y hay bastantes usuarios pensaba que lo correcto sería utilizar xml.

Por cierto, ahora mismo cambio lo de las cabeceras. ¿Sabes de algún tutorial o explicación de como puedo crear una sesión en mi servidor?

Muchas gracias.
  #6 (permalink)  
Antiguo 23/08/2011, 13:15
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Enviar datos al cliente desde un servlet

No conozco ningun material en internet que sea realmente bueno en cuanto al tema, he usado libros.
De todas maneras, con una busqueda rapida en Google encontre esta pagina:
http://www.cs.bham.ac.uk/~tmw/servle...sessions.shtml
  #7 (permalink)  
Antiguo 23/08/2011, 14:47
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

ok, gracias. Más o menos lo de las sesiones lo he ojeado. He intentado no hacer lo de mandar parametros en las cabeceras que me decias que lo hiciera con setAttribute. El problema es que no me aclaro

Yo antes lo que hacia era:


En el Servlet
Código:
response.setHeader("usuario", nombre);
			response.setHeader("password", pass);
			response.setHeader("imagen", imagen);
			response.setIntHeader("puntuacion", puntuacion);

Y las recogia así en el cliente:
Código:
Header[] header = nueva.parametrosRespuesta();
	        	for (Header header2 : header) {
	        		System.err.println(header2);
	        		if(header2.getName().equals("puntuacion"))
	        			puntuacion=header2.getValue();
	        		if(header2.getName().equals("imagen"))
	        			imagen=header2.getValue();
				}

El método que tu me estas diciendo es el request, como debo inicializarlo y donde para poder utilizarlo?
  #8 (permalink)  
Antiguo 23/08/2011, 15:50
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Enviar datos al cliente desde un servlet

Es el metodo setAttribute() de la clase HttpServletRequest.

Cuando tu defines un servlet, lo defines mas o menos de la siguiente manera:

Código Javascript:
Ver original
  1. public class TuServlet extends HttpServlet {
  2.   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3.     //Aqui tienes acceso a la instancia del objeto HttpServletRequest, que le puede poner como desees
  4.     //Pero lo tengo definido como request
  5.   }
  6. }
  #9 (permalink)  
Antiguo 24/08/2011, 00:16
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Vale de acuerdo, a lo que yo me refiero es como recupero luego ese dato en el cliente. Este es más o menos el código de mi servlet.

Código:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		PrintWriter out = response.getWriter();
		ArrayList<String> error = new ArrayList<String>();
		Boolean flag=true;
		
		String nombre= request.getParameter("nombre");
		String pass=request.getParameter("password");
		
		String text="";
		if(nombre.length()<=3 || (nombre.length()>16) || (nombre.isEmpty())){
			//tamño del nick entre 4 y 15
			System.err.println("Nick: El tamaño debe ser entre 4 y 15");
			text="Error en el Nick: Tamaño debe estar entre 4 y 15";
			error.add(text);
			flag=false;
		}
		if(pass.length()<=5 ||( pass.length()>16) || (pass.isEmpty())){
			//tamaño del pass entre 6 y 15
			System.err.println("Pass:El tamaño debe ser entre 6 y 15");
			text="\nError en el password: Tamaño debe estar entre 6 y 15";
			error.add(text);
			flag=false;
		}
		
		if(!Controlador.Loguearse(nombre, pass)){
		
			System.err.println("El nombre/password incorrecto/s\n");
			text="\nEl nombre/password incorrecto/s";
			error.add(text);
			flag=false;
		}
		if(flag){
			//Aqui hay que conectar al usuario y crear cookies o objetos de sesion
			System.out.println("Hasta aqui lo hace");
			String imagen= Controlador.getUsuario(nombre).getImg_perfil();
			int puntuacion= Controlador.getJuego(nombre).getPuntuacion();
			response.setHeader("usuario", nombre);
			response.setHeader("password", pass);
			response.setHeader("imagen", imagen);
			response.setIntHeader("puntuacion", puntuacion);
			

//Aqui es donde he añadido lo que tu me has dicho, en lugar de en las cabeceras
			request.setAttribute("nombre", nombre);
			
			System.out.println("Esto tambien");
			
		}else{
			for(String err: error){
				out.println(err);
			}
		}
		
		
		out.close();
	}

A lo que yo me refiero es: si el request es la petición, ¿no habría que envíar los datos en el response? que supuestamente es la respuesta del servidor al cliente.

En caso de que haya que utilizar el request, que código es necesario para recuperar el atributo "nombre" en el cliente.
yo lo he hecho así:

Código:
public HttpParams parametrosRespuesta_noheader(){
		HttpParams parametros;
		
		parametros= request.getParams();
		return parametros;
	}
El problema es que me da error de puntero vacío ya que el request no contiene nada, a esto me refería con como tengo que inicializar el request(dentro del cliente) para que pueda recuperar los parametros.

por ejemplo, cuando yo inicializo la variable response lo hago en esta linea

response = httpcliente.execute(post);

Supongo que tengo que hacer lo mismo con el request, pero no se como.

No se si me he explicado, sino dimelo.

Muchas gracias
  #10 (permalink)  
Antiguo 26/08/2011, 02:39
Avatar de jomaruro
Colaborador
 
Fecha de Ingreso: junio-2002
Ubicación: Naboo
Mensajes: 5.442
Antigüedad: 21 años, 9 meses
Puntos: 361
Respuesta: Enviar datos al cliente desde un servlet

Hola:

En el servlet, creas la sesión:

Código Java:
Ver original
  1. HttpSession ss = request.getSession();

En este ejemplo, que tenía a mano, utilizo método que rellena un vector al que llamo v pero es lo mismo. Utilizas el método setAttribute:

Código Java:
Ver original
  1. ss.setAttribute("lista", v);

y donde recibas la información lees la sesion, creas el vector y la enumeración que lo recorra (en el caso del ejemplo que tengo más a mano):

Código Java:
Ver original
  1. Vector<Familias> v = (Vector)session.getAttribute("lista");
  2. Enumeration <Familias> e = v.elements();

Saludos.


Última edición por jomaruro; 26/08/2011 a las 03:04
  #11 (permalink)  
Antiguo 26/08/2011, 03:12
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Muchas gracias, esto era exactamente lo que me hacia falta.
  #12 (permalink)  
Antiguo 27/08/2011, 03:03
Avatar de jomaruro
Colaborador
 
Fecha de Ingreso: junio-2002
Ubicación: Naboo
Mensajes: 5.442
Antigüedad: 21 años, 9 meses
Puntos: 361
Respuesta: Enviar datos al cliente desde un servlet

Hola:

Me alegro que te haya servido.

Saludos.

  #13 (permalink)  
Antiguo 27/08/2011, 03:07
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Buenas de nuevo, me está dando problemillas. Creo la sesion en un servlet y luego cuando intento recuperar los objetos de sesión en otro servlet me pone que todos son null.

He comprobado que el servlet donde se crea la sesión los guarda bien, pero en el siguiente servlet al que llamo(y compruebo los parametros por seguridad) me los devuelve como null:

¿Sabes a que puede ser debido?
Te pongo el código si lo quieres.
  #14 (permalink)  
Antiguo 27/08/2011, 07:45
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Enviar datos al cliente desde un servlet

Si, muéstranos el código porfavor.
  #15 (permalink)  
Antiguo 27/08/2011, 13:30
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Aqui os lo pongo:

Servlet que inicia la sesión:
Código:
	HttpSession sesion=request.getSession(true);
		
				sesion.setAttribute("logueado", true);
				sesion.setAttribute("nombre", nombre);
				
				sesion.setMaxInactiveInterval(21600); //Una hora sin cambios cierra la sesion
				
				System.out.println("Logueado: "+sesion.getAttribute("logueado")+" Nombre: "+sesion.getAttribute("nombre"));
Ahi los datos de la sesión son correctos

Servlet que comprueba la sesion existente:

Código:
try {
			
			HttpSession sesion=request.getSession(false);
			if(sesion==null){
				System.err.println("Falla porque no existe la sesion que quiere recuperar");
			}
			Boolean logueado=(Boolean) sesion.getAttribute("logueado");
			String user=(String) sesion.getAttribute("nombre");
			
			System.out.println("logueado: "+logueado+" nombre:"+user);
			if((logueado==null) || (user==null)){
				System.out.println("Error, en la sesion");
				if(Controlador.DesactivarUsuario(nombre)){
					System.out.println("Error en la Sesion. se han guardado los datos de usuario para evitar errores.");
				}
				
				out.print("desconectar");
				return;
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("error, la sesion no existe");
			e.printStackTrace();
			
			//aqui se mandaría al usuario al login y se desconectaria del juego
			
			
		}
Aqui me dice que los parámetros son null
  #16 (permalink)  
Antiguo 28/08/2011, 00:39
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet

Saludos!!! creo que ya se de donde puede venir el error. Mi problema está en que yo comunico una aplicación android con mi servidor web. Para comunicarme con el servidor web, cree una clase Comunicación en el cliente que es la que se encarga tanto de envios como de recibir los datos.

Entonces, yo cada vez que quiero enviar algo desde el cliente llamo a esa clase y lo envía por método post.

¿Puede estar el problema en que he metido la comunicación en esa clase y cada vez me esta cogiendo una sesión nueva??? Me refiero a que cada vez que llamo a la clase Comunicación se crean un request y un response nuevos. ¿Debería pasarle como parametro los request y response anteriores para que así se me solucione lo de las sesiones???

Voy a ponerme a cambiarlo, si a alguien se le ocurre otra cosa que me lo diga
  #17 (permalink)  
Antiguo 28/08/2011, 09:46
Avatar de atapuerkasman  
Fecha de Ingreso: febrero-2011
Mensajes: 76
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Enviar datos al cliente desde un servlet



Solucionado!!!!!!!! El problema estaba en que toda la comunicación la habia hecho desde dentro de la clase Comunicación. Por lo visto cada vez que hacia una nueva llamada a los servlet a estos les llegaba una sesion nueva y no habia manera de controlarlo. He sacado los métodos de la clase comunicación y los he utilizado tal cual en mi cliente (poniendo las variables HttpPost, HttpClient... y demás como globales) y funciona perfectamente.

Muchas gracias por chapa que os he pegado :P

Etiquetas: cliente, jsp-servlets, servlet, string
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 23:30.