Introducción
- Un servlet no resulta adecuado para presentación (escribir directamente la salida HTML) porque el código HTML está entremezclado dentro del código Java:
- Incómodo cambiar el código HTML.
- No facilita la división de tareas entre diseñadores de HTML y programadores.
- Alternativa: escribir directamente el código HTML con poco código Java incrustado.
- Una página JSP es una página (X)HTML que incorpora ciertos elementos dinámicos: etiquetas especiales y pequeños fragmentos de código.
- El código HTML aparece a la salida sin modificaciones.
- Los elementos dinámicos se evalúan o ejecutan en el servidor en el momento de construcción de la respuesta
JSP como servlet
- Aunque no es estrictamente obligatorio, una página JSP se suele transformar en el código fuente de un servlet, que después se compila y ejecuta.
JSP ejemplo
<%@ page language='java' contentType='text/html;charset=iso-8859-1'%>
<%@ page import='java.util.Date' %>
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<p>Hola, esto es una página JSP.</p>
<p>La hora del servidor es <%= new Date() %></p>
</body>
</html>
JSP ejemplo transformado en un servlet
(...)
out.write("<html>\n ");
out.write(" <head>\n ");
out.write(" <title>Hola Mundo</title>\n ");
out.write(" </head>\n ");
out.write(" <body>\n <p>Hola, esto es una página JSP.</p>\n ");
out.write(" <p>La hora del servidor es ");
out.print( new Date() );
out.write("</p>\n ");
out.write(" </body>\n");
out.write("</html>\n");
(..)
JSP ejemplo: documento recibido por el cliente
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<p>Hola, esto es una página JSP.</p>
<p>La hora del servidor es Wed Nov 06 13:25:34 CET 2002</p>
</body>
</html>
Comentarios en JSP
- Los comentarios JSP no se envían al cliente, al contrario que los comentarios HTML.
<%!-- Esto es un comentario JSP --%>
Directivas JSP: page
- Todas las páginas JSP deberían incluirla. Atributos habituales:
- language: lenguaje de programación (java por defecto).
- contenttype: tipo de contenido de la página (text/html por defecto).
- isErrorPage: indica si es una página de error (false por defecto).
- errorPage: página a la que dirigirse si ocurre una excepción procesando esta página.
<%@ page language='java' contentType='text/html'
isErrorPage='false' errorPage='error.jsp' %>
Otras directivas JSP
- include: permite incluir directamente el código de otro fichero en el punto en que aparezca la directiva.
- import: permite importar clases Java utilizadas en la página JSP.
<%@ include file='footer.html' %>
<%@ page import='java.util.*' %>
Scriptlets
- Permiten incrustar código escrito en otro lenguaje de programación (normalmente Java):
<%= expresión %>
: evalúa la expresión y muestra el resultado en la página.
<% sentencias %>
: ejecuta las sentencias, sin mostrar nada en la página.
<%! declaraciones %>
: declaraciones de variables.
<%!-- los siguientes scriptlets son equivalentes --%>
<%= user.getName() %>
<% out.println(user.getName()); %>
Scriptlets (aviso)
- Con
<%! declaraciones %>
se declaran atributos y métodos de instancia:
- Todas las peticiones a la página JSP comparten la misma instancia del servlet asociado, por lo que también comparten la misma copia de los atributos de instancia.
- Por tanto, no se debe declarar variables locales de la página con esta directiva, sino con:
<% String text = new String(); %>
Scriptlets: ejemplo
<table>
<tr><th>Product</th><th>Price</th></tr>
<%
for (int i=0; i<catalog.length; i++ ) {
ProductInfoBean product = catalog[i];
%>
<tr>
<td>
<a href='<%= response.encodeURL("view?id="
+ product.getId()) %>'>
<%= product.getShortName() %>
</a>
</td>
<td><%= product.getPrice() %> Euros</td>
</tr>
<% } %>
</table>
Variables implícitas
- JSP proporciona automáticamente una serie de variables adecuadamente declaradas e inicializadas, utilizables por el programador:
javax.servlet.ServletContext application
javax.servlet.ServletConfig config
javax.servlet.jsp.JspWriter out
javax.servlet.jsp.PageContext pageContext
javax.servlet.http.HttpServletRequest request
javax.servlet.http.HttpServletResponse response
javax.servlet.http.HttpSession session
<%!-- Sólo en páginas marcadas con isErrorPage: --%>
java.lang.Throwable exception
Acciones: jsp:include
- La acción jsp:include invoca al servlet o JSP dado e incluye en resultado de su ejecución en el punto actual del documento JSP desde el cual se incluya.
- El control retorna finalmente a la página inicial.
- Opcionalmente, se pueden pasar parámetros.
<jsp:include page='header.jsp'>
<jsp:param name='title' value='Welcome' />
</jsp:include>
Acciones: jsp:forward
- La acción jsp:forward invoca al servlet o JSP dado e incluye en resultado de su ejecución en el punto actual del documento JSP desde el cual se incluya, sin que retorne el control a la página inicial.
- Opcionalmente, se pueden pasar parámetros.
<jsp:forward page='list.jsp'>
<jsp:param name='order' value='date' />
</jsp:forward>
Java Beans
- Un Java Bean es una clase Java que cumple el siguiente convenio:
- Contiene propiedades (normalmente atributos de instancia privados).
- El acceso a las propiedades se realiza mediante métodos de acceso get, set e is.
- Tiene siempre un constructor sin argumentos (aunque podría tener más constructores).
Java Beans: ejemplo
public class UserInfoBean implements java.io.Serializable
{
private String firstName;
private boolean registered;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public boolean isRegistered() {
return registered;
}
public void setRegistered(boolean registered) {
this.registered = registered;
}
}
Java Beans en JSP
- JSP proporciona instrucciones especiales para trabajar más cómodamente con Java Beans.
- La acción jsp:useBean:
- Si el bean aún no existe en el contexto:
- Declara, crea e inicializa el bean.
- Crea una referencia al bean con el nombre dado por id.
- Si el bean ya existe en el contexto:
- Obtiene una referencia al mismo con el nombre dado por id.
<jsp:useBean id='user' class='foo.UserInfoBean' scope='session'>
<jsp:setProperty name='user' property='name' value='Pepe' />
</jsp:useBean>
Java Beans en JSP: contextos (I)
- Un bean en JSP se puede almacenar en uno de los siguientes contextos:
- page: asociado a la página JSP y a una petición HTTP concreta, desaparece al finalizar el procesado de la página.
- request: asociado a una petición HTTP concreta, compartida entre todos los JSPs y servlets que atiendan dicha petición, desaparece al finalizar el procesado de la petición.
- session: asociado a la sesión, compartida por todos los JSPs y servlets para todas las peticiones de una misma sesión, desaparece al finalizar la sesión.
- application: asociado al contexto de la aplicación Web, compartido por todos los servlets y JSPs de la aplicación en todas las peticiones.
La acción jsp:getProperty
- Se evalúa al valor de una propiedad de un bean.
<jsp:getProperty name='user' property='fullName' />
La acción jsp:setProperty
- Establece el valor de una propiedad de un bean.
- Convierte, si es necesario, el valor de la propiedad desde una cadena de texto al tipo de datos correspondiente.
- Proporciona un atajo para establecer valores de propiedades a partir de los parámetros de la petición, si ambos tienen el mismo nombre.
<jsp:setProperty name='user' property='firstName'
value='<%= request.getParameter("fisrtName") %>' />
<%!-- si 'firstName' es un parámetro de la petición --%>
<jsp:setProperty name='user' property='firstName' />
<%!-- todos los parámetros de la petición cuyo nombre
coincida con propiedades --%>
<jsp:setProperty name='user' property='*' />
Java Server Pages Tag Libraries
- Permiten declarar nuevas marcas JSP (tags) cuyo código Java se programa en clases de implementación de cada tag:
- Permite reducir el código Java incrustado en páginas.
- Útil para acciones utilizadas a menudo (p.e. acceso a bases de datos).
- No las veremos en esta asignatura.
Algunas referencias
- JSP en sun.com:
http://java.sun.com/products/jsp/
- Libros en línea:
- "Java Server Pages", Hans Bergsten. O'REILLY
http://www.coreservlets.com/
- Manuales en la Web:
http://www.jsptut.com/
http://www.apl.jhu.edu/~hall/java
/Servlet-Tutorial
/Servlet-Tutorial-JSP.html
No hay comentarios:
Publicar un comentario