JavaServer Pages (JSP) es una tecnología Java para generar contenido Web dinámico. De forma simplificada se puede decir que JSP permite incluir código Java en las páginas HTML.
En últimas JSP es una forma alternativa de construir servlets ya que toda página JSP se compila a un programa Java la primera vez que se invoca, la clase resultante se ejecuta en el servidor como un servlet. “La principal diferencia entre los servlets y los JSPs es el enfoque de la programación: un JSP es una página Web con etiquetas especiales y código Java incrustado, mientras que un servlet es un programa Java puro que recibe peticiones y genera a partir de ellas una página web” .
JSP está diseñado para crear páginas que respondan de forma dinámica a las solicitudes del cliente, no obstante también se pueden crear páginas estáticas que sólo contienen código HTML.
La siguiente podría ser una página JSP
<html><body><p>Hola, Soy una JSP estática, subutilizada! </p> </body> </html>
El anterior código se guarda como prueba.jsp en el subdirectorio examples dentro del directorio webapps de Tomcat.

Primera aplicación JSP directorios
Al ejecutarse se visualiza lo siguiente:

Ejemplo simple JSP
El ejemplo anterior se puede mejorar agregando código Java. Mejor aún creando una aplicación Web con su propia estructura de directorios y algunos archivos esenciales como el web.xml que inicializa la aplicación Web.
Estructura de directorios
Para la primera aplicación Web se crea un directorio llamado primeraAplicacion dentro del directorio webapps de Tomcat. El directorio primeraAplicacion es el directorio raíz. Dentro del directorio raíz se crea el directorio WEB-INF y dentro de éste se crean los directorios lib y classes como ilustra la imagen.

Estructura directorios primera aplicación JSP
En el directorio raíz (primeraAplicacion) se guardan los archivos HTML. El directorio lib es para guardar los archivos *.jar y se utilizan para agregar funcionalidades adicionales. En el directorio classes se guardan las programas Java compilados, es decir, los *.class. Es importante decir que sólo el directorio raíz es visible en Internet. El directorio WEB-INF y su contenido no se pueden acceder directamente desde la Web.
Hay un archivo esencial llamado web.xml que va dentro del directorio WEB-INF. Este archivo define aspectos especiales de la aplicación.
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd”
version=”2.5″>
<display-name>primeraAplicacion</display-name>
<description>
Ejemplo de aplicacion con EL (Expression Language)
</description>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
La página JSP mejorada
En web.xml se configuró como página de bienvenida index.jsp. Esta página estará ubicada en el directorio raíz y no en WEB-INF.
El código de index.jsp
<%@ page contentType=”text/html; charset=utf-8″ %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//ES” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Bienvenida</title>
</head>
<body>
<form>
El pasatiempo elegido es <b>${param.pasatiempo}</b>
<p><label for=”pasatiempo”>Pasatiempo: </label>
<input type=”text” value=”">
<input type=”submit” value=”Enviar”>
</p>
</form>
</body>
</html>
La página anterior parece sólo HTML excepto por el código ${param.pasatiempo} y por la extensión del archivo que es *.jsp. Estos cambios sencillos permiten que el valor presente en la cadena de solicitud se muestre en el navegador.
Para ejecutar la aplicación se digita en la barra de direcciones del navegador http://localhost:8080/primeraAplicacion/

Ejecutando la primera aplicación JSP
Al digitar un pasatiempo y pulsar clic en el botón Enviar

Aplicación dinámica que toma datos del usuario
Cuando el usuario llena el campo formulario llamado Pasatiempo y pulsa clic en el botón Enviar se genera una solicitud (request) del navegador al servidor. El servidor reconoce la extensión jsp y llama al motor de servlet que procesa la solicitud y devuelve la respuesta al navegador.
El código ${param.pasatiempo} se llama Expression Language (EL). Las expresiones EL van encerradas en los caracteres ${…} y sirven para acceder a los datos de la cadena de solicitud que parece en la barra de direcciones usando la palabra param y el nombre del elemento formulario que contiene los datos (pasatiempo).
A modo de resumen
Para procesar datos suministrados por el usuario se necesita que la aplicación Web procese páginas dinámicas. Una aplicación Web debe tener una estructura de directorios. Hay un archivo muy importante llamado web.xml que sirve para configurar la aplicación. JSP es una forma de tener páginas dinámicas. Las expresiones EL se utilizan para mostrar contenido dinámico en una página JSP. Toda página JSP, a la hora de la verdad, se convierte en un servlet. Escribí una entrada en el blog sobre servlets en http://kikev.wordpress.com/2009/07/29/ejecutar-un-servlet-por-primera-vez-sin-dolores-de-cabeza/