Ejercicios de cabeceras y sesiones

1. Los navegadores a menudo tienen sus propias interpretaciones y sintaxis para el código JavaScript. Un ejemplo claro lo tenemos en las diferencias existentes entre Explorer y Netscape. Como prueba de ello, completar el servlet NavServlet de la aplicación appcab1 para que identifique si el cliente accede desde un tipo de navegador u otro. Para ello leemos la cabecera User-Agent con el método getHeader(...) de la petición, y comprobamos su valor. Mostrad la cadena en una página para observar las diferencias entre uno y otro navegador. Una vez tengáis una parte de texto que los diferencia (por ejemplo, imaginemos que en Explorer el User-Agent tiene la cadena "Explorer" (que no la tiene)). En ese caso, distinguiríamos Explorer de Netscape con algo como:

public void doGet(HttpServletRequest req, ...) throws ...
{
	String nav = req.getHeader("User-Agent");
	if (nav.indexOf("Explorer") != -1)     // Cambiar "Explorer" por el texto que sea
		... // Internet Explorer
	else
		... // Netscape
	...
}

Una vez distinguido el navegador, vamos a probar a generar una página con JavaScript que sólo va a funcionar bien en uno de los dos. Por ejemplo, vamos a probar a cambiar una imagen que se muestra en la página desde JavaScript. Supongamos que una página muestra la imagen "a.gif", y en JavaScript la cambiamos a "b.gif". En Explorer el código de dicha página sería:

<html>
<body>

<img src="a.gif" id="miImg">
<script language="JavaScript">
	document.all.miImg.src="b.gif"
</script>

</body>
</html>

Mientras que en Netscape es:

<html>
<body>

<img src="a.gif" id="miImg">
<script language="JavaScript">
	document.miImg.src="b.gif"
</script>

</body>
</html>

Las imágenes a.gif y b.gif están en el directorio raíz de la aplicación. Se pide que el servlet genere una u otra página en función del navegador detectado.

2. El formulario form_datos.html de la aplicación appcab1 se envía al servlet CompruebaServlet. Se pide implementar dicho servlet para comprobar que los datos sean correctos (que no haya ningún campo de texto vacío). En el caso de que no haya errores el servlet simplemente mostrará un mensaje indicando que todo ha ido bien. Si hay algún error, el servlet debe redirigir al servlet ErrorCompruebaServlet, que deberéis completar para que muestre un mensaje con el error producido, y a los 5 segundos redirija al formulario anterior (utilizando una cabecera de respuesta Refresh).

3. Una de las utilidades que se le dan a las cookies es la de personalizar sitios Web. La aplicación appcookies contiene un formulario form_pers.html que le indica al usuario que introduzca su nombre, y elija un color de fondo. Dicho formulario llama después al servlet PersonalizaServlet. La página también tiene un enlace Ir a página principal, que internamente llama al servlet PrincipalServlet. Se pide:

4. La aplicación appsesiones contiene una página form_carro.html que tiene una lista de artículos para comprar. Para comprarlos, basta con pulsar el botón de "Añadir al carro" correspondiente. Dicho formulario llama al servlet CarroServlet. Se pide que dicho servlet almacene como objetos de sesión los objetos que se vayan comprando, y genere una página dinámica con:

NOTA: para almacenar los objetos podemos utilizar cualquier estructura de datos que queramos (Vector, Hashtable, ArrayList, etc), y la guardaremos como un atributo de la sesión. Guardaremos, para cada nombre de artículo, qué cantidad lleva comprada el usuario, y el precio unitario o total, para luego mostrar estos dos datos en la página que se genere. Para tomar el nombre del artículo y el valor, notar que cada artículo tiene asociado en la página un formulario con dos campos ocultos articulo y precio, con estos elementos.

5. (OPTATIVO) Sobre el ejercicio anterior:

a) Añadid un enlace u opción para invalidar la sesión al llamar a CarroServlet. Comprobad que al pincharlo, y luego comprar un artículo, el carro aparecerá sólo con ese artículo.

b) Si quisiéramos aplicar reescritura de URLs en el ejercicio anterior para prevenir que las cookies estén deshabilitadas, ¿qué cambios tendríamos que hacer?