Beruflich Dokumente
Kultur Dokumente
ÍNDICE
OBJETIVOS................................................................................................................................................................ 107
INTRODUCCIÓN....................................................................................................................................................... 108
3.1. Introducción a HTML........................................................................................................................................... 109
3.2. Creando Aplicaciones web con NetBeans......................................................................................................... 114
3.3. Servlet.................................................................................................................................................................. 119
3.3.1. Conceptos básicos sobre Servlets......................................................................................................................... 120
3.3.2. Creación de Servlets en NetBeans......................................................................................................................... 126
3.3.3. Estructura básica de un Servlet y ciclo de vida......................................................................................................... 129
3.3.4. Descriptor de despliegue web.xml.......................................................................................................................... 131
3.3.5. Inicialización del servlet con ServletConfig............................................................................................................... 134
3.3.6. Compartición de información a través de ServletContext........................................................................................... 135
3.3.7. Persistencia en la información de sesión................................................................................................................. 139
3.3.8. Ejemplo: mi primer Servlet.................................................................................................................................... 141
3.4. Java Server Pages (JSPs)................................................................................................................................... 149
3.4.1. Embebiendo sentencias Java en una JSP............................................................................................................... 149
3.4.2. Sintaxis XML para JavaServer Pages...................................................................................................................... 150
3.4.3. Objetos implícitos en JSPs.................................................................................................................................... 151
3.4.4. Creando JavaServer Pages con NetBeans.............................................................................................................. 152
3.4.5. Expression Language 2.1..................................................................................................................................... 162
3.4.6. Tags JSP........................................................................................................................................................... 163
3.4.7. JSTL 1.1........................................................................................................................................................... 174
3.4.8. Configuración de web.xml para JSP....................................................................................................................... 175
3.5. Novedades de la especificación Servlets 3.0.................................................................................................... 178
3.5.1. Anotaciones....................................................................................................................................................... 178
3.5.2. Despliegue con web.xml y web-fragment.xml.......................................................................................................... 184
RESUMEN................................................................................................................................................................... 187
105
3: Desarrollo con Servlets y Java Server Pages
OBJETIVOS
■
Comprender el concepto de Servlet, su ciclo de vida, su papel en el desarrollo de
aplicaciones web, y la diferencia entre clase, objeto e instancia.
■
Comprender las clases e interfaces fundamentales del API Servlets 3.0, sus atributos y
sus métodos.
■
Comprender el papel que juega el contendor de servlets durante la ejecución de una
aplicación web.
■
Comprender las diferencias que existen entre los interfaces ServletConfig y
ServletContext, así como la operativa de su uso para la inicialización de parámetros de
un servlet y una aplicación web.
■
Conocer las reglas básicas que permiten escribir JavaServer Pages como documentos
XML.
■
Enumerar y utilizar los cuatro mecanismos existentes para poder embeber código fuente
Java en una JavaServer Page.
■
Conocer los tipos de objetos implícitos en una JSP y cómo se utilizan.
■
Enumerar los elementos fundamentales del lenguaje de expresión.
■
Conocer los tipos de etiquetas JSPs, cuál es su uso más habitual y ser capaz de poder
crear una librería personalizada de etiquetas con las características más elementales.
■
Escribir un descriptor de aplicación web del tipo web.xml, utilizando las etiquetas más
habituales.
■
Crear una aplicación web sencilla que contenga diferentes elementos como servlets,
JavaServer Pages y otros recursos web como documentos HTML o ficheros de estilos
de tipo CSS.
■
Crear un proyecto en NetBeans para el desarrollo de una aplicación web y saber estructurar
adecuadamente los ficheros que lo componen.
107
Desarrollo de aplicaciones Web con Java EE
INTRODUCCIÓN
En la unidad 1 hemos presentado la historia de Java El alumno está listo para comenzar a desarrollar su
y cómo ha llegado a ser lo que es hoy, así como primera aplicación web sencilla y para ello esta lección
algunos conceptos básicos sobre el protocolo HTTP, introducirá las dos herramientas imprescindibles
fundamento principal de Internet y de muchas de las que permiten la creación de aplicaciones web java:
aplicaciones que vamos a construir con Java EE. Servlets y JSPs. Además daremos una introducción al
La unidad 2 nos ha enseñado a configurar nuestro lenguaje HTML, esencial para el diseño de las páginas
entorno de desarrollo con NetBeans y nos ha que completarán la interfaz gráfica de las aplicaciones
presentado algunas herramientas útiles durante la web desarrolladas.
fase de desarrollo y pruebas de un proyecto software.
108
3: Desarrollo con Servlets y Java Server Pages
109
Desarrollo de aplicaciones Web con Java EE
Algunas etiquetas se utilizan en combinación, por ejemplo todas las que están
asociadas a la creación de tablas o listas (ya sean numeradas o no).
Además, hay que tener en cuenta que al contrario que en XML, las tags no están
normalizadas y pueden ser de tres tipos:
Además, asociados a las etiquetas HTML, pueden definirse atributos como los
siguientes:
id Sirve para asignar un identificador al tag asociado. El nombre asignado, se podrá usar a lo
largo del documento HTML para ser referenciado.
Asigna un nombre de clase a un tag. La clase es un concepto vinculado a las hojas de
estilos. Por ejemplo puede definirse la clase “título_principal” que tiene determinadas
propiedades de formato (tamaño de letra, tipo de fuente, color, posición relativa, etc.) y así
evitar incluir la serie de atributos en todas las tags de este tipo.
class
Con el uso de este atributo junto con las hojas de estilos se consigue desacoplar formato
y contenido en el documento: si deseamos cambiar el estilo, bastará con hacerlo en la
definición de clase de la hoja de estilos y no en todas las etiquetas que sean de esa clase
en un documento HTML muy extenso.
Este atributo está vinculado a etiquetas como <a> y sirve para definir la URI a la que se
href hace referencia en el vínculo. Por ejemplo:
110
3: Desarrollo con Servlets y Java Server Pages
action Este atributo se corresponde con la tag <form> y sirve para determinar qué archivo o
ejecutable será el responsable de procesar la información recogida en el formulario.
Atributo vinculado a <form>, sirve para especificar el método por el que se enviarán los
method datos del formulario a la entidad servidora que va a procesar la información. Los valores
posibles son“get” y “post”.
width Vinculado al tag <table>, sirve para especificar el ancho de la tabla. Su valor puede
darse de forma absoluta (en pixels) o relativa (en tanto por ciento).
border Vinculado al tag <table>, define el ancho del borde de una tabla expresado en píxeles.
Vinculado al tag <tr> de las filas de una tabla, establece el tipo de alineación para el
align texto de cada celda. Sus posibles valores son left, center, right, jus-
tify o char.
valign Similar al anterior, establece el tipo de alineación vertical para el texto en una celda. Sus
valores posibles son top, middle, bottom o baseline.
111
Desarrollo de aplicaciones Web con Java EE
<body>
<h1 align=”center”>
CURSO DE APLICACIONES WEB CON JAVA EE
</h1>
<br>Esperamos que estés disfrutándolo.</br>
<p>Estás en la unidad 3 aprendiendo conceptos básicos
de HTML, como por ejemplo:</p>
<center>
<table BORDER=3 CELLSPACING=3 CELLPADDING=3
WIDTH=”579” BORDERCOLOR=”#000000” >
<tr>
<th WIDTH=”50%”><font SIZE=+1>VISUALIZACIÓN</th>
<th WIDTH=”50%”><font SIZE=+1>
ETIQUETAS REQUERIDAS
</th>
</tr>
<tr>
<td><h2>Encabezado H2</h2></td>
<td><pre><font SIZE=+1>
<h2>Encabezado h2</h2></pre>
</td>
</tr>
<tr>
<td><h4>Encabezado H4</h4></TD>
<td><pre><font SIZE=+1>
<h4>Encabezado h4</h4></pre>
</td>
</tr>
<tr>
<td><h6>Encabezado H6</h6></td>
<td><pre><font SIZE=+1>
<h6>Encabezado h6</h6></pre>
</td>
</tr>
<tr>
<td>Texto en <b>negrita</b> o <i>cursiva</i></td>
<td><pre><font SIZE=+1>
Texto en <b>negrita</b> o en
<i>cursiva</i></pre>
</td>
</tr>
</table></center>
</body>
</html>
Figura 3.3. Ejemplo de página HTML sencilla.
112
3: Desarrollo con Servlets y Java Server Pages
113
Desarrollo de aplicaciones Web con Java EE
Para ello, accedemos al menú “File → New Projec → Java Web →Web
Application” y sseleccionamos un nombre para un proyecto prueba, por ejemplo
“EjemploAplicacionWeb”. Al marcar “Use Dedicated Folder for Storing Libraries” se
generará una carpeta donde se añadirán todas las librerias que use el proyecto con
rutas relativas al directorio de la aplicación.
114
3: Desarrollo con Servlets y Java Server Pages
http://localhost:8080/EjemploAplicacionWeb/index.html
Finalmente, NetBeans nos permite incluir frameworks para el desarrollo de sitios web
como Spring MVC, JavaServer Faces, Struts o Hibernate. Algunos de ellos serán
tratados en profundidad más adelante en este curso.
115
Desarrollo de aplicaciones Web con Java EE
116
3: Desarrollo con Servlets y Java Server Pages
■■ web: esta carpeta contiene los recursos web que requiere la aplicación.
En esta carpeta por defecto se crea con una página de índice (el formato de
la misma dependerá de los posibles frameworks y librerias seleccionadas) y
un directorio WEB-INF que contendrá los documentos de configuración como
puede ser un XML descriptor de despliegue llamado web.xml. En él podrán
definirse diferentes parámetros de la aplicación y su contenido se verá en detalle
más adelante.
117
Desarrollo de aplicaciones Web con Java EE
□□ Etc.
Con estos conocimientos básicos sobre como ayuda NetBeans a comenzar con el
desarrollo de aplicaciones web, podremos ir a conocer en detalle qué es un Servlet,
de qué se compone, cómo y para qué se usa.
118
3: Desarrollo con Servlets y Java Server Pages
3.3. Servlet
Un servlet puede definirse como un componente web basado en Java que es
gestionado por un contenedor y posee la capacidad de generar contenido HTML de
forma dinámica. Además de esto, los servlets son responsables de:
La siguiente figura muestra un esquema sencillo de interacción entre todos los actores
del escenario de comunicación con el protocolo HTTP.
119
Desarrollo de aplicaciones Web con Java EE
Esto es solo un ejemplo sencillo con un único servlet que gestiona una transacción
independiente de las anteriores. En la vida real no es tan sencillo, por ello es necesario
conocer en detalle cuáles son las funcionalidades que ofrecen los Servlets y en
concreto los Servlets para gestionar el modelo de petición-respuesta del protocolo de
Internet HTTP.
120
3: Desarrollo con Servlets y Java Server Pages
Otra referencia importante para tener a mano es el javadoc del API de Servlets. Para
ello, basta con realizar la siguiente búsqueda en internet: “javax.servlet Java EE 6”, y
nos llevará a este enlace http://docs.oracle.com/javaee/6/api/javax/servlet/package-
summary.html .
121
Desarrollo de aplicaciones Web con Java EE
Sirve para obtener el valor del atributo de inicialización pasado como parámetro.
■■ ServletContext getServletContext():
■■ void init():
■■ void destroy():
■■ java.util.Enumeration getAttributeNames():
■■ java.util.Map getParameterMap():
Devuelve un array de objetos tipo String que incluyen todos los valores asociados
con un determinado parámetro.
122
3: Desarrollo con Servlets y Java Server Pages
■■ String getContextPath():
Protocolo://servidor:puerto/contexto/ruta_al_fichero/nombre_
del_fichero
■■ Cookie[] getCookies():
□□java.util.Enumeration getHeaderNames():
■■ String getMethod():
■■ HttpSession getSession():
123
Desarrollo de aplicaciones Web con Java EE
Este método sirve para añadir una cookie a la respuesta enviada al cliente.
■■ java.util.Collection getHeaderNames():
Devuelve los nombres de las cabeceras HTTP incluidas en la respuesta.
Este método envía al servidor una respuesta con el código de error HTTP
especificado.
■■ ServletOutputStream getOutputStream():
Este método devuelve un objeto tipo ServletOutputStream que suele servir para
establecer respuestas binarias.
124
3: Desarrollo con Servlets y Java Server Pages
■■ String getId():
■■ ServletContext getServletContext():
Este método sirve para añadir un objeto nuevo a la sesión identificado por el
nombre de atributo.
Este método sirve para determinar el tiempo máximo en segundos que el cliente
HTTP puede estar inactivo, sin interaccionar con el servidor HTTP, antes de que
el contendor invalide la sesión.
Como ya se vió en una unidad anterior, las cookies toman un valor numérico que
sirve para identificar de forma unívoca a un cliente, por lo que este concepto va ligado
normalmente al de gestión de sesiones.
125
Desarrollo de aplicaciones Web con Java EE
Los métodos típicos asociados al objeto cookie serán getX() y setX() viculados a cada
uno de los valores anteriores:
■■ String getValue() y void setValue(String newValue).
■■ String getDomain() y void setDomain(String domain).
■■ String getPath() y void setPath(String uri).
■■ etc…
request.getParameter(“usuario”));
cookie.setDomain(“www.seas.es”);
cookie.setComment(“Nombre de usuario”);
cookie.setMaxAge(60*60*12);
response.addCookie(cookie);
126
3: Desarrollo con Servlets y Java Server Pages
A continuación, usando “Next >”, podemos configurar otros aspectos del despliegue
del servlet, como su nombre y lo que denomina NetBeans como “URL Pattern”, que
no es más que la ruta relativa al servlet desde el navegador. De esta forma acceder a
él es posible con la URL:
http://[IP-host]:[puerto]/[nombre_de_la_app]/[URL_pattern]
NetBeans dará como resultado un nuevo fichero java con la estructura básica de un
servlet, como se muestra a continuación.
127
Desarrollo de aplicaciones Web con Java EE
package com.seas.ud3.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MiPrimerServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, Http-
ServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
PrintWriter out = response.getWriter();
try {
out.println(“<html>”);
out.println(“<head>”);
out.println(“<title>Servlet MiPrimerServlet</title>”);
out.println(“</head>”);
out.println(“<body>”);
out.println(“<h1>Servlet MiPrimerServlet at “ +
request.getContextPath() + “</h1>”);
out.println(“</body>”);
out.println(“</html>”);
} finally { out.close(); }
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return “Short description”;
}
}
Figura 3.13. Estructura básica de un Serlvet creado por NetBeans.
128
3: Desarrollo con Servlets y Java Server Pages
</web-app>
129
Desarrollo de aplicaciones Web con Java EE
Las instrucciones que típicamente van en cada uno de ellos están ligadas a su ciclo de
vida en el contenedor web, que se muestra gráficamente en la siguiente figura.
2. El contendor carga la clase asociada al Servlet A y crea una instancia del objeto.
4. El objeto está creado: éste será el responsable de gestionar todas las peticiones
HTTP que lleguen a dicho servlet.
130
3: Desarrollo con Servlets y Java Server Pages
7. Los pasos 6-7 serán ejecutados tantas veces como peticiones HTTP
correspondientes a la misma sesión se produzcan.
■■ ServletContextAttributeListener y ServletContextAttribute
Event cuando hay alguna modificación sobre los atributos del ServletContext.
■■ HttpSessionListener, HttpSessionActivationListener y
HttpSessionEvent cuando se crea, invalida, activa, pausa o expira la sesión
vinculada a un servlet.
■■ ServletRequestAttributeListener y ServletRequestAttribute
Event cuando algún atributo de la petición del servlet es modificado.
131
Desarrollo de aplicaciones Web con Java EE
Así, sabemos que desde un navegador, podemos acceder a nuestro servlet a través
de la URL: http://[host]:[port]/[WebApp][URLPattern], pero, ¿cómo
podemos establecer también esa correspondencia para en nuestro caso tener la URL:
http://localhost:8080/EjemploApplicacionWeb/MiPrimerServlet?.
■■ <error-page> sirve para mapear códigos de error HTTP con la ruta a los
recursos web que los muestran al usuario.
132
3: Desarrollo con Servlets y Java Server Pages
133
Desarrollo de aplicaciones Web con Java EE
<mime-type>application/pdf</mime-type>
</mime-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
</web-app>
Figura 3.16. Ejemplo de fichero web.xml.
134
3: Desarrollo con Servlets y Java Server Pages
/*Se definen variables estáticas y privadas al ámbito del servlet para almacenar los paráme-
tros de inicialización */
static private String param1;
static private String param2;
// . . .
■■ Para servir de canal de comunicación entre los recursos tipo servlets o JSPs de
una misma aplicación web.
135
Desarrollo de aplicaciones Web con Java EE
■■ ClassLoader getClassLoader():
136
3: Desarrollo con Servlets y Java Server Pages
■■ String getContextPath():
■■ JspConfigDescriptor getJspConfigDescriptor():
■■ SessionCookieConfig getSessionCookieConfig():
Los parámetros habituales que forman parte del ServletContext son valores
globales a toda la aplicación web como URLs a recursos externos (bases de datos,
servidores), información de autenticación en servidores externos, pool de conexiones
a bases de datos. No hay que olvidar que es posible almacenar objetos, no solo
Strings. Vamos a ver un ejemplo de inicialización del ServletContext.
137
Desarrollo de aplicaciones Web con Java EE
</context-param>
super.init(config);
// . . .
ServletContext context = config.getServletContext();
String url = context.getInitParameter(“DatabaseURL”);
String user = context.getInitParameter(“UserDB”);
String password = context.getInitParameter(“PasswordDB”);
}
Figura 3.20. Inicialización de la aplicación web a través de ServletContext.
138
3: Desarrollo con Servlets y Java Server Pages
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext context = config.getServletContext();
String url = context.getInitParameter(“DatabaseURL”);
139
Desarrollo de aplicaciones Web con Java EE
// Declaración de variables
PrintWriter out = response.getWriter();
Integer contadorAccesos;
// Devuelve la sesión si existe. Si no existe, crea una nueva.
HttpSession session = request.getSession(true);
// Los accesos al objeto sesión están sincronizados para
//garantizar la contabilización de todos los accesos al
//servlet.
synchronized(session) {
contadorAccesos = (Integer)session.getAttribute(“con-
tadorAccesos”);
if (contadorAccesos == null) {
contadorAccesos = 0;
} else {
contadorAccesos = contadorAccesos + 1;
}
session.setAttribute(“contadorAccesos”, contadorAccesos);
}
140
3: Desarrollo con Servlets y Java Server Pages
@Override
protected void doGet(HttpServletRequest request, HttpServ-
letResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServ-
letResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return “Short description”;
}// </editor-fold>
}
Figura 3.21. Código fuente de SessionServlet.java.
El resultado será una página HTML en la que se puede visualizar que el número de
accesos se incrementa conforme accedemos al enlace “Refrescar”. Cabe resaltar las
anotaciones que aparecen encima del nombre de la clase ya que, gracias a ellas
podremos obviar la declaración del servlet en el archivo web.xml.
141
Desarrollo de aplicaciones Web con Java EE
package com.seas.ud3.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
142
3: Desarrollo con Servlets y Java Server Pages
super.init(config);
ResumenServlet.param1 = getInitParameter(“Proveedor”);
ResumenServlet.param2 = getInitParameter(“Contacto”);
ServletContext context = config.getServletContext();
contextAtt1 = context.getInitParameter(“DatabaseURL”);
contextAtt2 = context.getInitParameter(“UserDB”);
contextAtt3 = context.getInitParameter(“PasswordDB”);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletRes-
ponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletRes-
ponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return “Short description”;
}
143
Desarrollo de aplicaciones Web con Java EE
}
Figura 3.23. Codigo fuente de ResumenServlet.java.
144
3: Desarrollo con Servlets y Java Server Pages
EJERCICIO PROPUESTO
Para reforzar los conceptos introducidos hasta aquí se recomienda al alum-
no realizar esta sencilla práctica.
Crea un proyecto en NetBeans para una aplicación web que sirva para re-
coger encuestas a los alumnos de un curso con el título “Desarrollo web con
Servlets”. Para ello, la aplicación debe contener un servlet que recoja los
datos de un formulario con los siguientes campos:
■■ Campo de texto “Nombre del alumno”.
■■ Campo de password “Password del alumno”.
■■ Lista desplegable “Edad de alumno”.
■■ Botones de selección “Sexo” con valores posibles “Hombre” o “Mujer”.
■■ Lista desplegable “Nivel de estudios” con los siete valores posibles:
graduado escolar, bachillerato, grado medio, grado superior, diplomado,
licenciado/ingeniero, master.
■■ Apartado “Conocimientos previos” con los siguientes check-box dis-
ponibles: Java básico (Java SE), C, C++, C#, ObjectiveC, Cobol y PHP.
■■ Lista desplegable “Valora el material del curso” con valores del 1 al 10.
■■ Lista desplegable “Nivel de satisfacción con los conocimientos adqui-
ridos en el curso” con valores del 1 al 10.
■■ Área de texto “Comentarios”.
El servlet se encargará de recoger esta información y de presentar al alumno
una página HTML que contenga la siguiente información:
■■ Damos las gracias al usuario que ha realizado la encuesta.
■■ Se informa al usuario de que su email solo será utilizado como medio
de contacto para darle más información sobre el curso y feedback por
sus comentarios.
■■ Se presenta la información introducida en modo texto.
Además recomendamos al usuario, que al implementar su servlet tenga en
cuenta estas reflexiones:
■■ ¿Qué pasa si el alumno introduce una edad no válida? Ej., caracteres
alfabéticos en lugar de numéricos.
■■ ¿Cómo puede verificarse que lo realmente introducido en el campo del
email es una dirección de correo electrónico válida?
■■ ¿Qué pasa si el usuario deja en blanco alguno de los campos?
Y que tenga presente la teoría acerca de etiquetas HTML como <input>
y su atributo type o <form>.
145
Desarrollo de aplicaciones Web con Java EE
Podrá completarse con algunos datos ficticios como los mostrados a continuación:
146
3: Desarrollo con Servlets y Java Server Pages
147
Desarrollo de aplicaciones Web con Java EE
<parameter-encoding default-charset=”UTF-8”/>
148
3: Desarrollo con Servlets y Java Server Pages
Puede decirse que las JSP son también Servlets, solo que tienen forma de plantilla
para focalizar el esfuerzo del desarrollador más en la interfaz gráfica diseñada con
HTML, que en el código Java.
■■ Scriptlets: sirven para incluir sentencias java comunes acotadas por los símbolos
<% %>. El código así escrito es insertado dentro del método service() del
servlet vinculado a la JSP.
149
Desarrollo de aplicaciones Web con Java EE
El valor por defecto es true, y con valor false se indica que no se están utilizando
sesiones.
errorPage <%@ page errorPage=”/404.html” %>
isErrorPage <%@ page isErrorPage=”false” %>
Se utiliza true para indicar que sí existe una página de error. False es el valor por
defecto, que indica que no existe página de error.
isThreadS- <%@ page isThreadSafe=”false” %>
afe
El valor false indicará que el servlet asociado debe implementar el modelo Sin-
gleThreadModel, para así tener diferentes instancias para gestionar cada petición
simultánea. Recuerda que usar esta caracterísitca tiene un gran impacto sobre la
latencia de la aplicación web, por ello su valor por defecto es true.
extends <%@ page extends=”com.seas.ClasePadre” %>
info <%@ page info=”Nombre de la JSP” %>
include: estas directivas se utilizan para incluir las rutas a otros ficheros,
normalmente tipo jsp, pero también HTML con cabeceras, pies de páginas,
etc., para que su código sea embebido en la página resultante en el servidor.
Hasta entonces un fichero JSP tenía casi el aspecto de un documento XML, pero
la inserción de scriptlets alteraba considerablemente el código y lo enmarañaba
demasiado. Se define entonces una nueva etiqueta <jsp:> que será utilizada como
base para normalizar el documento JSP. Pero fue realmente en la especificación 2.0
de JSP cuando se formalizan las definiciones para conseguir así mover JSP hacia una
sintaxis de tipo XML.
150
3: Desarrollo con Servlets y Java Server Pages
■■ Tags estándar JSP: están identificadas por el valor <jsp:>, con lo que la
apariencia del código embebido se estructura como en un documento XML, sin
alterar demasiado el orden de la página. Por ejemplo:
151
Desarrollo de aplicaciones Web con Java EE
152
3: Desarrollo con Servlets y Java Server Pages
■■ Carpeta dentro del directorio “Location”. Esto suele hacerse cuando el proyecto
tiene un tamaño considerable, y se han estructurado las JSPs de acuerdo a
criterios de funcionalidad, por ejemplo. En nuestro caso dejaremos este cuadro
de texto vacío.
■■ Opciones de creación: existen dos opciones: fichero JSP con sintaxis estándar
o bien documento JSP con sintaxis XML. Seleccionamos en nuestro caso la
primera opción.
153
Desarrollo de aplicaciones Web con Java EE
NetBeans creará la estructura de una JSP sencilla que podrá ser completada por el
desarrollador.
En ambos casos, una vez desplegada la aplicación web en el servidor, podrá ejecutarse
a través de las URL:
■■ http://localhost:8080/<Proyecto>/MiPrimerJSP.jsp para la
página JSP y
■■ http://localhost:8080/<Proyecto>/MiPrimerDocJSP.jsp para el
documento JSP.
154
3: Desarrollo con Servlets y Java Server Pages
A continuación damos una lista de editores gratuitos de este tipo para que el alumno
pueda escoger el que más le convenga.
■■ NVU. Se trata de un proyecto opensource que dio origen a NVU y Blue Griffon.
Puede accederse a más información desde su site oficial: http://net2.com/nvu/
index.html.
155
Desarrollo de aplicaciones Web con Java EE
156
3: Desarrollo con Servlets y Java Server Pages
Figura 3.33. Wizard para crear un nuevo JSP en nuestro proyecto en NetBeans.
Para aquellos alumnos que todavía no posean un dominio de las etiquetas HTML
como para editar directamente una interfaz gráfica, pueden utilizar BlueGriffon para
crear una plantilla que sirva de base para la JSP final. Aquí la creatividad de cada uno
juega un papel importante, podemos simplemente partir de algo como lo que muestra
la siguiente figura:
157
Desarrollo de aplicaciones Web con Java EE
La siguiente tabla muestra a modo de ejemplo el código fuente incluido para cada uno
de los campos del formulario.
158
3: Desarrollo con Servlets y Java Server Pages
159
Desarrollo de aplicaciones Web con Java EE
160
3: Desarrollo con Servlets y Java Server Pages
161
Desarrollo de aplicaciones Web con Java EE
EJERCICIO PROPUESTO
Vamos a profundizar en el ejemplo propuesto para hacerlo más exhaustivo
de acuerdo al patrón de diseño Modelo-Vista-Controlador (MVC). Para ello
se propone lo siguiente:
■■ Crea una clase de tipo bean, por ejemplo DatosEncuestaBean.
java, que represente los valores aportados por cada alumno en el
formulario de satisfacción del curso.
■■ Modifica tu FormularioJSP.jsp para que obtenga los valores
de un objeto de tipo DatosEncuestaBean que sea pasado como
parámetro por alguno de los objetos asociados al JSP.
Reflexiona sobre lo siguiente:
■■ ¿Será necesario crear alguna clase adicional para gestionar la repre-
sentación gráfica de los datos?
■■ ¿Piensas que este paso es innecesario o por el contrario aporta algo
positivo al diseño de tu web? ¿Por qué?
Desde su nacimiento junto con la versión 1.2 de las JSP ha seguido usándose, si bien
no posee una JSR propia que lo defina, y sus versiones van actualizándose de forma
paralela a las de JSP. La versión actual es la 2.1.
162
3: Desarrollo con Servlets y Java Server Pages
${requestScope} Es un objeto tipo Map que incluye las parejas nombre-valor de los atribu-
tos del objeto request.
${sessionScope} Objeto tipo Map que incluye las parejas nombre-valor de los atributos del
objeto session.
${paramValues} Objeto tipo Map que asocia nombres de parámetros a un array de Strings
con sus valores posibles.
${header} Mapa de asociaciones entre nombres de cabeceras y sus valores.
${initParam} Mapa que incluye los nombres de los parámetros de inicialización y sus
valores.
${cookie} Mapa de cookies y sus valores.
■■ Las expresiones aceptan todo tipo de operadores lógicos: ==, !=, div,
and, or, etc.
Las tags JSP introducen un nuevo elemento sintáctico denominado acciones que
sirven para proporcionar información en la fase de procesado de la petición. Dado
que las acciones son en realidad XML poseen las siguientes características generales:
163
Desarrollo de aplicaciones Web con Java EE
164
3: Desarrollo con Servlets y Java Server Pages
<jsp:element name=”td”>
<jsp:attribute name=”class”>celda</jsp:attribute>
<jsp:body>dato</jsp:body>
</jsp:element>
Figura 3.38. Ejemplo de uso de la etiqueta <jsp:element>.
Así, las custom tags son una herramienta muy potente pero su uso no es sencillo dado que
añaden una capa intermedia entre las páginas JSP y el servidor de aplicaciones.
Ejemplos típicos del uso de custom tags son las que permiten lógica java, código
en definitiva, del look-and-feel o la representación gráfica ofrecida por la página JSP,
como por ejemplo:
165
Desarrollo de aplicaciones Web con Java EE
■■ Etc.
■■ Una clase de tipo Tag Handler, que puede implementar el interfaz javax.
servlet.jsp.tagext.Tag o javax.servlet.jsp.tagext.BodyTag,
que incluye el código a ejecutar vinculado a las etiquetas.
■■ Un fichero de tipo *.tld (Tag Library Descriptor) que sirve para establecer la
correspondencia entre clases y etiquetas a través de elementos XML.
■■ Las páginas JSP que hacen uso de estas etiquetas e incluyen declaraciones de
tipo <%@taglib ... %> .
Figura 3.39. Selección del descriptor TLD en el proyecto NetBeans de la aplicación web.
166
3: Desarrollo con Servlets y Java Server Pages
NetBeans crea e incluye por defecto las etiquetas de cabecera del descriptor de
librerías, como se muestra a continuación:
<tlib-version>1.0</tlib-version>
<short-name>mitaglibrary</short-name>
<uri>/WEB-INF/tlds/mitaglibrary</uri>
</taglib>
Figura 3.41. Descriptor TLD generado por defecto por NetBeans.
A esto deben añadirse etiquetas tipo <tag>. Cada una de ellas representa una
nueva custom tag con nombre, y clase vinculada que la implementa.
167
Desarrollo de aplicaciones Web con Java EE
En este ejemplo vamos a crear una nueva tag de nombre help que se encargará
de insertar mensajes de ayuda en nuestras JSP. Para ello creamos una clase
HelpHandler.java bajo el paquete com.seas.ud3.tags que extenderá el interfaz
BodyTagSupport, y que implementará la conversión de la url del recurso. Se
muestra a continuación el asistente de NetBeans.
Figura 3.43. Asistente de NetBeans para incluir una clase de tipo Tag Handler.
168
3: Desarrollo con Servlets y Java Server Pages
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public HelpHandler() {
super();
}
169
Desarrollo de aplicaciones Web con Java EE
170
3: Desarrollo con Servlets y Java Server Pages
Este método solo se utiliza cuando la tag utilizada tiene cuerpo asociado, y
servirá para su procesamiento.
171
Desarrollo de aplicaciones Web con Java EE
En etiquetas de uso simple, basta con tener en cuenta los métodos doStartTag() y
doEndTag(). Si se desea profundizar en el uso de estos métodos y otros adicionales de la
librería javax.servlet.jsp.tagext.*, revisar la especificación JSP 2.1.
<tag>
<name>help</name>
<tag-class>com.seas.ud3.tags.HelpHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>code</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>int</type>
</attribute>
</tag>
172
3: Desarrollo con Servlets y Java Server Pages
case 2:
out.println(“MENSAJE DE AYUDA 2”);
break;
case 3:
out.println(“MENSAJE DE AYUDA 3”);
break;
case 4:
out.println(“MENSAJE DE AYUDA 4”);
break;
default:
out.println(“MENSAJE DE AYUDA POR DEFECTO”);
break;
}
De esta forma, cualquier página JSP mostrará por pantalla el mensaje de ayuda
correspondiente codificado según una lista dada.
</taglib>
Figura 3.47. Declaración del uso de una librería de etiquetas custom.
173
Desarrollo de aplicaciones Web con Java EE
Además, la librería JSLT permite referenciar a cualquier objeto de los objetos request,
response, o session de la JSP utilizando el esquema ${objeto.propiedad}.
<!DOCTYPE html>
<html>
<head>
174
3: Desarrollo con Servlets y Java Server Pages
<hr>
<table border=”1” width=”200”>
<tr>
<th>Nombre comercial</th>
<th>Unidades en stock</th>
<th>Precio unitario</th>
</tr>
</table>
<br />
<a href=”index.html”>Inicio</a>
</body>
</html>
Figura 3.49. Código fuente con ejemplo de uso de la librería JSTL core.
Para poder utilizar una librería JSTL, es necesario especificar donde se encuentra su
especificación, equivalente a la sentencia import en java.
175
Desarrollo de aplicaciones Web con Java EE
Para las JavaServer pages es posible utilizar etiquetas específicas que vamos a
repasar a continuación:
</servlet-mapping>
Su valor siempre debe comenzar por la barra (/) cuando la JSP se encuentra
bajo el directorio raíz de la aplicación web como es el caso.
</jsp-config>
El valor del elemento <taglib-uri> puede ser también una dirección URL.
176
3: Desarrollo con Servlets y Java Server Pages
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<include-prelude>/WEB-INF/jsp/cabecera.jsp</include-prelude>
<include-coda>/WEB-INF/jsp/pie.jsp</include-coda>
</jsp-property-group>
177
Desarrollo de aplicaciones Web con Java EE
En este curso, vamos a repasar las más relevantes para un programador que se
enfrenta por primera vez al desarrollo de aplicaciones web.
3.5.1. Anotaciones
La especificación Servlet 3.0 recogida en la JSR-315 supone una revolución por
muchos motivos. Uno de ellos es que el descriptor de despliegue web.xml pasa a
convertirse en un elemento opcional. En su lugar, se incluye una nueva y potente
herramienta llamada anotaciones.
Las anotaciones son expresiones con la forma @XXX{} que incluyen fragmentos de
código que pueden incluirse tanto en el fichero .java que define un servlet como en
las JavaServer pages para definir información relacionada con la configuración de la
aplicación.
178
3: Desarrollo con Servlets y Java Server Pages
■■ urlPatterns: array que incluye los patrones de las URL que permiten acceder
al servlet. Debe incluirse al menos un patrón.
179
Desarrollo de aplicaciones Web con Java EE
180
3: Desarrollo con Servlets y Java Server Pages
<servlet-mapping>
<servlet-name>EjemploServlet</servlet-name>
<url-pattern>/EjemploServlet</url-pattern>
</servlet-mapping>
■■ @WebFilter
Esta anotación sirve para definir una clase de tipo filtro dentro de la aplicación
web. Las clases que tienen esta anotación implementan el interfaz javax.
servlet.Filter.
Los parámetros que tiene asociados esta anotación son los siguientes:
□□ urlPatterns: array que incluye los patrones de las URL que permiten
acceder a la clase. Debe incluirse al menos un patrón.
181
Desarrollo de aplicaciones Web con Java EE
□□ servletNames: lista de nombres de Servlets para los que este Filtro está en uso.
182
3: Desarrollo con Servlets y Java Server Pages
Los eventos que escuchan estos listeners están relacionados normalmente con
la adición o borrado de atributos, o bien con la inicialización o destrucción de
parámetros.
■■ @MultipartConfig
Los valores que permite definir esta anotación son los siguientes:
183
Desarrollo de aplicaciones Web con Java EE
Además de estas dos opciones, la especificación Servlets 3.0 incluye una tercera vía a
través de lo que define como fragmentos web. Este concepto hace referencia a unos
segmentos de configuración encapsulados en un nuevo descriptor de despliegue
denominado web-fragment.xml, que también estará ubicado bajo la carpeta
META-INF/ del fichero war que se configura como desplegable.
También es posible que los fragmentos web formen parte de ficheros tipo .jar, y en este
caso el despliegue en el servidor de aplicaciones será responsable de revisar todos
ellos en busca de este tipo de archivos para aplicar los parámetros de configuración
que correspondan.
184
3: Desarrollo con Servlets y Java Server Pages
Hemos visto que la forma de dar prioridad a anotaciones sobre ficheros de configuración
es a través del atributo metadata-complete. Si su valor es “true” no se tendrán
en cuenta ninguno de los ficheros de configuración, en caso contrario sí y habrá que
ver cómo se ordena su prioridad:
web-fragment.xml web-fragment.xml
<web-fragment> <web-fragment>
<name>Fragmento1</name> <name>Fragmento2</name>
<ordering> <ordering>
<after> <before>
<name>Fragmento3</name> <others />
</after> </before>
</ordering> </ordering>
</web-fragment> </web-fragment>
web-fragment.xml web.xml
<web-fragment> <web-app metadata-complete=”false”>
<name>Fragmento3</name> . . .
</web-fragment> </web-app>
185
3: Desarrollo con Servlets y Java Server Pages
RESUMEN
A lo largo de esta unidad hemos dado las pautas fundamentales que hay que
tener en cuenta para manejarnos con servlets y Java Server Pages en la versión
6 de la plataforma Java Enterprise Edition. Además, se ha ilustrado su uso con
la implementación de ejemplos sencillos en NetBeans. En definitiva, al finalizar
■
esta unidad, debemos de ser capaces de lo siguiente:
Generar un servlet con NetBeans que procese la información llegada a través de los
métodos GET/POST de una petición HTTP.
■ Crear un servlet que mantiene información del número de accesos en gracias al uso
combinado de objetos tipo HttpSession y Cookie.
187