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

llegar a servlet desde jsp

Estas en el tema de llegar a servlet desde jsp en el foro de Java en Foros del Web. Hola, estoy intentando llegar a un servlet desde una jsp mediante una llamada Ajax, pero no funciona, siempre me dá error. Tengo el servlet en ...
  #1 (permalink)  
Antiguo 25/05/2011, 08:46
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
llegar a servlet desde jsp

Hola, estoy intentando llegar a un servlet desde una jsp mediante una llamada Ajax, pero no funciona, siempre me dá error. Tengo el servlet en mi web.xml, el servlet creado, pero no hay manera. No sé que me falta por hacer para que funcione. Mi código es el siguiente:

En la jsp:
Código:
<script type="text/javascript">			
var urlIdioma = '/idioma.servlet';	
			jQuery.ajax({
			   type: 'GET',
			   cache: false,
			   url: urlIdioma,
			   dataType: 'text',
			   success: function (text, textstatus) {
				 alert('text'+text);
				 alert('textstatus'+textstatus);
				 
			   },
			   error: function (xhr, textEstatus, errorThrown) {
				 alert('xhr'+xhr+', textEstatus'+textEstatus+', errorThrown'+errorThrown);
			   }
			});		</script>
y en el servlet, lo siguiente:


Código:
package es.indra.aodb.maintenance.resources.web.action.gate;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdiomaServlet extends HttpServlet {
	
	private static final long serialVersionUID = -7897645237016575215L;

	@Override
	public void service (HttpServletRequest request, HttpServletResponse response)
	{					
		String clientLanguage = request.getHeader("Accept-Language");
		((HttpServletResponse) request).setHeader("Accept-Language", clientLanguage);
		request.getSession().setAttribute("idioma",clientLanguage);	
	}
}
Y en el web.xml:


Código:
<servlet>
        <servlet-name>IdiomaServlet</servlet-name>
        <servlet-class>es.indra.aodb.maintenance.resources.web.servlet.IdiomaServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
		<servlet-name>IdiomaServlet</servlet-name>
		<url-pattern>/idioma.servlet</url-pattern>
	</servlet-mapping>
Y no hace más que darme error, el 404. Creo que debe estar mal direccionado al servlet, o que me falte algo, pero ahora no veo qué es. Si me podéis echar un cable os lo agradecería, porque no sé dónde falla. Muchas gracias,
Un saludo
  #2 (permalink)  
Antiguo 25/05/2011, 11:29
Avatar de LordJhony  
Fecha de Ingreso: septiembre-2010
Mensajes: 472
Antigüedad: 13 años, 8 meses
Puntos: 24
Respuesta: llegar a servlet desde jsp

Una pregunta... Si tu servlet se llama "IdiomaServlet" porque en la jsp y en xml lo invocas "idioma.servlet"
  #3 (permalink)  
Antiguo 25/05/2011, 12:11
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: llegar a servlet desde jsp

No deberías sobreescribir el método service, utiliza el doGet, que es lo que estás solicitando desde AJAX.
__________________
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.
  #4 (permalink)  
Antiguo 25/05/2011, 17:12
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: llegar a servlet desde jsp

Cita:
Iniciado por LordJhony Ver Mensaje
Una pregunta... Si tu servlet se llama "IdiomaServlet" porque en la jsp y en xml lo invocas "idioma.servlet"
El patron URL no debe ser igual al nombre del Servlet. Es solamente la URL a la que quieres que se mapee el Servlet, puede ser lo que desees.
  #5 (permalink)  
Antiguo 26/05/2011, 01:27
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: llegar a servlet desde jsp

Hola, en el web.xml le he puesto como url '/idioma.servlet', por lo que en la llamada Ajax entiendo que en "url" le tengo que poner lo mismo. He cambiado el servlet como me aconsejásteis, implementando el método doGet:

Código:
package es.indra.aodb.maintenance.resources.web.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdiomaServlet extends HttpServlet {
	
	private static final long serialVersionUID = -7897645237016575215L;

	protected void doGet (HttpServletRequest request, HttpServletResponse response)
	{					
		String clientLanguage = request.getHeader("Accept-Language");
		((HttpServletResponse) request).setHeader("Accept-Language", clientLanguage);
		request.getSession().setAttribute("idioma",clientLanguage);	
	}
}
pero sigo con el mismo error. Además, haciendo debug parece que al servlet no llega, no se mete dentro. Si he declarado el servlet en el web.xml, y he puesto bien la dirección en la llamada Ajax, ¿qué es lo que me falta? ¿O como puedo hacer para ver de dónde viene ese error?

Muchas gracias, un saludo
  #6 (permalink)  
Antiguo 26/05/2011, 02:17
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: llegar a servlet desde jsp

Si haces directamente la llamada al servlet desde la barra de direcciones ¿qué hace?
__________________
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.
  #7 (permalink)  
Antiguo 26/05/2011, 02:25
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: llegar a servlet desde jsp

Hola, sobre todo muchas gracias por responderme, cuando no consigues dar con la solución te parece estar dando palos de ciego, y ver que hay quien intenta ayudarte es un apoyo muy grande. Al final me faltaba, en la llamada ajax, cambiar :

var urlIdioma = '/idioma.servlet';

por

var urlIdioma = '/AODB2/idioma.servlet';

donde AODB2 es el nombre de mi aplicación. Y el servlet tampoco me reconocia la parte:

((HttpServletResponse) request).setHeader("Accept-Language", clientLanguage);

porque me decía que no podía hacerle un cast, pero sin el cast me daba error el request. Como me valía con meter ese valor en sesión, al final el servlet me ha quedado de la siguiente manera:

Código:
package es.indra.aodb.maintenance.resources.web.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdiomaServlet extends HttpServlet {
	
	private static final long serialVersionUID = -7897645237016575215L;

	protected void doGet (HttpServletRequest request, HttpServletResponse response)
	{					
		String clientLanguage = request.getHeader("Accept-Language");
		//request.setHeader("Accept-Language", clientLanguage);
		String firstLanguage = clientLanguage.split(",")[0];
		if (firstLanguage.contains("-"))
		{
			firstLanguage = firstLanguage.split("-")[0];
		}
		request.getSession().setAttribute("idioma",firstLanguage);	
	}
}
Y me funciona, luego en la jsp, lo que hago es preguntar por ese valor de sesión para incluir un fichero js u otro, de la siguiente manera:

Código:
<% if (session.getAttribute("idioma").equals("en")) {%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-en.js"/>" ></script>
		<% 
		}	
		else {
		%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-es.js"/>" ></script>
		<%}%>
Espero que ésto le ayude a alguien, la verdad es que el tema de coger el lenguaje del navegador con IE no había manera de que funcionara, y así se puede sacar. Muchas gracias a todos, un saludo
  #8 (permalink)  
Antiguo 26/05/2011, 03:08
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: llegar a servlet desde jsp

Hola otra vez, resulta que no termina de funcionar como yo quiero. Funciona, sí, pero carga la página antes de terminar de pasar por el servlet, con lo cual primero coge el atributo de sesión y después hace el servlet y lo cambia. Pensaba que el cargar la página era de manera secuencial, es decir, línea a línea, pero si en la jsp tengo:

Código:
<script type="text/javascript">
...
			var urlIdioma = '/AODB2/idioma.servlet';	
			jQuery.ajax({
			   type: 'GET',
			   cache: false,
			   url: urlIdioma,
			   dataType: 'text',
			   success: function (text, textstatus) {	 
			   },
			   error: function (xhr, textEstatus, errorThrown) {
			   }
			});
					</script>
		
		<% if (session.getAttribute("idioma").equals("en")) {%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-en.js"/>" ></script>
		<% 
		}	
		else {
		%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-es.js"/>" ></script>
		<%}%>
...
me hace primero la parte:

Código:
<% if (session.getAttribute("idioma").equals("en")) {%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-en.js"/>" ></script>
		<% 
		}	
		else {
		%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-es.js"/>" ></script>
		<%}%>
y después termina la consulta Ajax. ¿Sabéis si hay alguna manera de que primero haga toda la consulta, y luego siga cargando la página? Muchas gracias, un saludo
  #9 (permalink)  
Antiguo 26/05/2011, 04:21
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: llegar a servlet desde jsp

Ese es el funcionamiento lógico de JSP y AJAX.

JSP genera un HTML que se devuelve al navegador, el navegador lee el código, encuentra una llamada AJAX y la realiza (de ahí lo de asíncrono), pero mientras sigue mostrando el contenido de la página.

Si lo que quieres es que no se note el cambio de contenido que hace AJAX, oculta lo que vas a cambiar hasta que finalice la llamada AJAX.

Y por supuesto los cambios que quieras hacer, tienes que especificarlos en función de lo que devuelva AJAX, no en función de la sessión, ya que cuando ejecutes AJAX tu web es HTML, no JSP.
__________________
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.
  #10 (permalink)  
Antiguo 26/05/2011, 05:03
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: llegar a servlet desde jsp

En realidad lo que me gustaría es contener la descarga del resto de la página hasta que finalice la función Ajax. Es verdad que quizá puedo cambiar el servlet y en vez de utilizar una variable de sesión utilizar la HTTPresponse, lo intentaré. Pero no sé como hacer el resto. Lo que quiero conseguir es que a partir del valor que obtenga de la función ajax, poner después un js u otro. Intentaré mirar alguna manera de hacerlo, muchas gracias
  #11 (permalink)  
Antiguo 26/05/2011, 05:28
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: llegar a servlet desde jsp

Cita:
en vez de utilizar una variable de sesión utilizar la HTTPresponse
No lo has entendido, no se trata de que no puedas usar la sesion, se trata de que la página está formada, por lo que no podrás acceder a objetos java.

Los datos que llegan a través de AJAX, es texto plano/objetos javascript, por lo tanto tendrás que tratarlos mediante javascript/jquery.

Tu problema ahora es de javascript, no de java.

Puedes echarle un vistazo a esto y combinarlo con el jquery.Ready, y posiblemente te puedan ayudar más en el foro de javascript.

http://www.javascriptkit.com/javatut...criptcss.shtml

Otra opción que tienes, es que se cargue un js u otro en función de un valor que se genera al crear la página en el servidor, sin hacer la llamada AJAX. La validez de este método depende de cuál y cuándo sea el evento que hace que se elija un js.
__________________
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.
  #12 (permalink)  
Antiguo 27/05/2011, 02:39
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: llegar a servlet desde jsp

Hola, ya he visto como hacerlo con response, el servlet quedaría así:

Código:
package es.indra.aodb.maintenance.resources.web.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdiomaServlet extends HttpServlet {
	
	private static final long serialVersionUID = -7897645237016575215L;

	protected void doPost (HttpServletRequest request, HttpServletResponse response)
	{					
		String clientLanguage = request.getHeader("Accept-Language");
		//request.setHeader("Accept-Language", clientLanguage);
			
		response.setHeader("Accept-Language", clientLanguage);
	}
}
y en la jsp puedo obtener ese valor.

Pero al final he visto otra manera mucho más sencilla de conseguir lo que quiero, que es poder coger el idioma seleccionado en el navegador y según ese idioma añadir un js u otro, y no necesito llamar a ningún servlet. Y es escribiendo en la jsp:

Código:
<% String strParam = request.getHeader("Accept-Language");	//recoge los idiomas del navegador
		strParam = strParam.substring(0,2);	//obtiene si es en(ingles) o es(castellano) u otro
		if (strParam.equals("es"))
		 {%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-es.js"/>" ></script>
		<% 
		}	
		else {
		%>
		<script type="text/javascript" src="<s:url value="/js/grid.locale-en.js"/>" ></script>
		<%}%>
Espero que le sirva a alguien, la verdad es que a mí me ha costado bastante dar con esta solución. Muchas gracias a todos, un saludo

Etiquetas: jsp, jsp-servlets, servlet
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 16:57.