JTagua

Inicio » JSP/SERVLETS » Directivas » @page » Tutorial de JSP (7) – Directiva @page

Tutorial de JSP (7) – Directiva @page

Licencia

Creative Commons License

Visitas:

  • 813.331 hits

Esta directiva se usa para establecer las propiedades generales de una página JSP. Podemos usar esta directiva varias veces a lo largo de la pagina JSP, pero sólo podemos asignar el valor de un atributo una vez por cada una, excepto para el atributo import. Los valores de la directiva se aplicarán a toda la pagina.

Sintaxis

Aquí podemos ver la sintaxis de la directiva page con todos sus atributos. Los valores por defecto se muestran en negrita. Los corchetes ([…]) indican un término opcional. La barra vertical (|) proporciona una elección entre dos valores como true y false.

<%@ page

[ languaje=”java”]

[ extends=”package.class“]

[ import= “{ package.class|package.*}, …” ]

[ session=”true|false”]

[ buffer=”none|8kb|sizekb”]

[ autoFlush=”true|false”]

[ isThreadSafe=”true|false”]

[ info=”text“]

[ errorPage=”URLrelativa“]

[ contentType=”mimeType[ ;charset=characterSet]” | “text/html; charset=ISO-8859-1”]

[ isErrorPage=”true|false“]

%>

Atributos

language=”java”

Este atributo define el lenguaje de script usado en los scriptlet, declaraciones y expresiones en el fichero JSP y en cualquier fichero incluido. En JSP 1.0 el único lenguaje permitido es Java.

extends=”package.class”

Este atributo especifica un nombre totalmente cualificado de una superclase que será extendida por la clase Java en el fichero JSP.  Sun recomienda que usemos este atributo con cuidado, ya puede limitar la habilidad del motor del JSP a proporcionar la superclase especializada que mejora la calidad del fichero compilado.

import= “{ package.class | package.* }, …”

Esta lista especifica una lista separada por comas de uno o más paquetes o clases que el fichero JSP debería importar. Las clases de los paquetes se ponen a disposición de los scriptlets, expresiones, declaraciones y etiquetas dentro del fichero JSP.

Como cabría esperar, el atributo import debe aparecer antes de cualquier etiqueta que refiera la clase importada. Para importar varios paquetes, podemos usar una lista separada por comas, más de una directiva import o una combinación de ambas.

session=“true|false”

Todo cliente debe unirse a una sesión HTTP para poder usar una página JSP. Si el valor es true, el objeto session se refiere a la sesión actual o a una nueva sesión. Si el valor es false, no podemos utilizar el objeto session en el fichero JSP. El valor por defecto es true.

buffer=”none|8kb|sizekb”

Este atributo especifica el tamaño del buffer en kilobytes que será usado por el objeto out para manejar la salida enviada desde la página JSP compilada hasta el navegador cliente. El valor por defecto es 8 kb.

autoFlush=“true|false”

Este atributo especifica si la salida sería enviada o no cuando el buffer esté lleno. Por defecto, el valor es true, el buffer será descargado. Si especificamos false, se lanzará una excepción cuando el buffer se sobrecargue.

isThreadSafe=“true|false”

Este atributo especifica si la seguridad de threads está implementada en el fichero JSP. El valor por defecto, true, significa que el motor puede enviar múltiples solicitudes concurrentes a la página.

Si usamos el valor por defecto, varios threads pueden acceder a la página JSP. Por lo tanto, debemos sincronizar nuestros métodos para proporcionar seguridad de threads.

Con false, el motor JSP no envía solicitudes concurrentes a la página JSP. Probablemente no querremos forzar esta restricción en servidores de gran volumen porque puede dañar la habilidad del servidor de enviar nuestra página JSP a múltiples clientes.

info=“text”

Este atributo nos permite especificar una cadena de texto que es incorporada en el página JSP compilada. Podemos recuperar el string más tarde con el método getServletInfo().

errorPage=“URLrelativa”

Este atributo especifica un path a un fichero JSP al que este fichero JSP envía excepciones. Si el path empieza con una “/”, el path es relativo al directorio raíz de documentos de la aplicación JSP y es resuelto por el servidor Web. Si no, el path es relativo al fichero JSP actual.

isErrorPage=”true|false”

Este atributo especifica si el fichero JSP muestra una página de error. Si es true, podemos usar el objeto exception, que contiene una referencia a la excepción lanzada, en el fichero JSP. Si es false (el valor por defecto), significa que no podemos usar el objeto exception en el fichero JSP.

contentType=”mimeType [ ; charset=characterSet ]” | “text/html;charset=ISO-8859-1”

Este atributo especifica el tipo MIME y la codificación de caracteres que use el fichero JSP cuando se envía la respuesta al cliente. Podemos usar cualquier tipo MIME o conjunto de caracteres que sean válidos para el motor JSP.

El tipo MIME por defecto es text/html, y el conjunto de caracteres por defecto es ISO-8859. (En el IDE de Netbeans es UTF-8).
Los atributos  contentType, pageEncoding e import son los mas usados. De hecho la plantilla básica que proporciona el IDE de NetBeans incorpora siempre la directiva <%@page contentType=”text/html” pageEncoding=”UTF-8″ %>

Los atributos language y extends no suele utilizarse. El resto de los atributos se utilizan para situaciones muy concretas.

EJEMPLO 1:

Veamos un ejemplo relacionado con el atributo import. Aunque ya conocemos este atributo por problemas anteriores, aprovecharemos aquí para conocer cómo se crean paquetes dentro del entorno IDE de NetBeans.

1.- Iniciamos un nuevo proyecto “Java Web” y “Web Application”.

2.- Llamamos al proyecto “DirPage_import1”.

3.- Sustituimos el código de la plantilla index.jsp por este otro

<%-- 
    Document   : index
    Created on : 24-sep-2008, 21:28:00
    Author     : Juan Tagua
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="JTagua.EjemploClase" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Ejemplo de directiva page con atributo import
            con nueva clase dentro de un nuevo paquete</title>
    </head>
    <body>
    <font size="20" color="red">
     <%
	EjemploClase ejemplo = new EjemploClase();
	out.print(ejemplo.presentar());
     %>
    </font>
</html>

En la línea 8 estamos incluyendo una directiva page con un atributo import que hace referencia al paquete (contenedor de clases) denominado JTagua y a la clase EjemploClase incluida dentro de dicho paquete.

Además, en la línea 20 estamos llamando al constructor de la clase para crear/instanciar un nuevo objeto con la instrucción new.

Además:

  1. En la línea 22 llamamos al método presentar del objeto ejemplo para recuperar un texto, que
  2. finalmente imprimimos con el objeto implícito que veremos más adelante denominado out.

Obviamente aún no existe ni el paquete ni la clase ni el método por ello el IDE está presentando errores. !Vamos a ello!!.

4.- Nos situamos ahora con el botón derecho en el nombre del proyecto y hacemos click con el botón derecho. Aparecerá el menú contextual. Hacemos “Nuevo” y finalmente “Paquete Java”, cumplimentamos con el nombre del paquete, en mi caso “JTagua” y finalizamos. Ya tenemos creado el paquete. Entregue ahora el foco a index.jsp (seleccione la pestaña index.jsp). Comprobará que ya tiene menos errores.

Image1

5.-Nos situamos ahora con el botón derecho en el paquete recién construido y hacemos click con el botón derecho. Aparecerá el menú contextual. Hacemos “Nuevo” y finalmente “Clase Java”, cumplimentamos con el nombre de la clase, en mi caso “EjemploClase” y finalizamos. Ya tenemos creado la clase dentro del paquete. Entregue ahora el foco a index.jsp (seleccione la pestaña index.jsp). Comprobará que ya tiene menos errores.

Image2

6.- Incorpore ahora el código del siguiente método/función a la clase recién creada. Finalmente obtendrá el siguiente código para la clase,

package JTagua;
/**
 *
 * @author Juan Tagua
 */
public class EjemploClase {
 public String presentar(){
    return "Opción import de la directiva page,<br> además utiliza un paquete y una clase";
  }
}

Entregue ahora el foco a index.jsp (seleccione la pestaña index.jsp). Comprobará que ya NO TIENE ERRORES.

7.-Ejecute el proyecto y comprobará lo que sigue,

Con esto debiera quedar claro cómo se crean paquetes en el IDE, las clases dentro de los paquetes y cómo pueden importarse en otras clases a través de la directiva page con el atributo import.

EJEMPLO 2:

Veamos otro ejemplo del atributo import. Llamaremos a este proyecto dirPage_import, para ello iniciamos un proyecto en Netbeans en la forma acostumbrada y finalmente sustituimos el código de la plantilla del archivo index.jsp por el siguiente otro:

<%-- 
    Document   : index
    Created on : 09-dic-2007, 13:09:40
    Author     : jtagua
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Directiva page (import)</title>
    </head>
    <body bgcolor="ffffcc">
        <center>
        <h2>Fecha y Hora (2)</h2>
        <%-- Introducimos un comentario --%>
        La fecha y la Hora son: <%= new Date() %>
        </center>
    </body>
</html>

Obtendremos después de ejecutar la siguiente salida,

Image1Vemos que en la línea 21 obtenemos la fecha del servidor a través de la instanciación de la clase Date, dado que esta clase no ha sido creado por nosotros y se trata de una clase definida en en el lenguaje Java, es por lo que tenemos que importar la librería que contenga su propia definición. Esto se hace con la línea 08. La librería a importar podría ser mucho más específica, por ejemplo java.util.Date

Sugerencias:

  1. Pruebe a comentar la línea 8 y vea que ocurre en el IDE para index.jsp.
  2. Lea más sobre la librería java.util.Date

EJEMPLO 3:

Veamos un ejemplo relacionado con los atributos  autoFlush y buffer. Supongamos por un momento que queremos devolver con una página JSP el texto de uno o más capítulos de la obra de Cervantes “Don Quijote”. La idea es que la página HTML prevista en el index.jsp  tenga un peso mayor de 8 Kb. Vamos a comprobar la relación entre los atributos autoFlush y buffer. La página JSP es muy sencilla, se trata de puro texto.

Si escribimos la directiva

<%@page contentType=”text/html” pageEncoding=”UTF-8″ autoFlush=”false” buffer=”10kb”%>

tan pronto como ejecutemos aparece el mensaje de error siguiente

java.io.IOException: Error:Buffer de JSP desbordado

Lo que ha ocurrido es que la página supera los 10 Kb, previstos del bufer y no se le ha permitido descargarse ( autoFlush=”false”).

SUGERENCIAS:

Se sugiere al lector que busque alguna solución, e interprete correctamente la relación de los atributos autoFlush y buffer dependiendo del peso de la página.

EJEMPLO 4:

Veamos otro ejemplo, en este caso utilizaremos los atributos errorPage y isErrorPage de la directiva page.

1.- Iniciamos un nuevo proyecto “Java Web” y “Web Application”.

2.- Llamamos al proyecto “divpageerrorPage”.

3.- Sustituimos el código de la plantilla index.jsp por este otro

<%-- 
    Document   : index
    Created on : 21-dic-2007, 20:54:42
    Author     : jtagua
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<%@ page errorPage="ErrorVelocidad.jsp" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Directiva page (errorPage)</title>
    </head>
    <body>
 
        <%!
    // Se lanzará un  excepcion NumberFormatException si el valor es nulo o
    // esta mal formateado
    // Ejecutar : http://localhost:8084/DirpageerrorPage/?espacio=4&tiempo=2
    private double toDouble(String value) {
        return (Double.valueOf(value).doubleValue());
    }
        %>
        <%
            double espacio = toDouble(request.getParameter("espacio"));
            double tiempo = toDouble(request.getParameter("tiempo"));
            double velocidad = espacio / tiempo;
        %>
        <UL>
            <LI>Espacio: <%= espacio%>.
            <LI>Tiempo: <%= tiempo%>.
            <LI>Velocidad: <%= velocidad%>.
        </UL>    
    </body>
</html>

Vea que en este código pretendemos dos cosas:

  1. Capturar dos parámetros en la llamada a la página (espacio y tiempo), y esto lo hacemos con el objeto implícito request, y que veremos más ademante.
  2. Adoptar como tipo numérico double los dos parámetros que acompañan a la llamada, para luego dividirlos y obtener supuestamente la velocidad como otro valor numérico double.

Provocaremos un “error de tipo” al introducir en la llamada a la página un grupo de caracteres que no pueda convertirse a numérico, por ejemplo, introducir un textual “Juan” en el parámetro espacio. Esto provocará un error en la línea 27, ya que no se podrá convertir a double dicho grupo de caracteres. Este error será procesado por la página ErrorVelocidad.jsp …

Para comprender el mecanismo de conversión de una cadena a double sería necesario ver la classe Double

4.- Ahora añadimos un nuevo archivo JSP al que llamaremos ErrorVelocidad.jsp y sustituimos el código por el siguiente otro,

<%-- 
    Document   : ErrorVelocidad
    Created on : 21-dic-2007, 20:58:38
    Author     : jtagua
    Esta página se muestra cuando index.jsp tiene un error.
--%>

<%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Ejemplo de directiva page con atributo isErrorPage</title>
    </head>
    <body>
        <%@ page isErrorPage="true" %>
        <center>
        <TABLE BORDER=5 ALIGN="CENTER">
        <TR><TH CLASS="TITLE">
        Error al calcular la velocidad</TABLE>
        <P>
        Hay un error en la página Velocidad.jsp:
        <I><%= exception %></I>. 
     </center>
    </body>
</html>

Puede verse que si se produce un error (por ejemplo de conversión de tipos) dentro de la página index.jsp, ésta desviará el flujo de la aplicación a la página ErrorVelocidad.jsp que mostrará el mensaje o, si procede, intentará resolverlo.
Véase que la ejecución de la página se produce con valores concretos del espacio y la velocidad. Estos valores tienen que ser entrados en la llamada a la página. Para hacer que esto sea automático basta presentar el menu de contexto del proyecto y seleccionar propiedades, aparecerá un cuadro con una opción “Run”, si la seleccionamos,

Image4

Si mantenemos como valor del espacio el valor 4 y como valor del tiempo el valor 2, aparecerá finalmente una salida del tipo

  • Image5En las líneas 27 y 28 se ha utilizado un objeto llamado implícito, que se estudiará más adelante, y que se utiliza para recoger los valores de las variables que acompañan a la llamada a la página index.jsp.
  • En la página ErrorVelocidad.jsp se ha utilizado el objeto implícito exception que se estudiará más adelante.

SUGERENCIAS:

Pruebe a realizar una llamada a index.jsp con un valor erróneo en el tipo para la variable espacio, por ejemplo establezca un tipo de valor alfabético. ¿Qué pasaría?.

Image1

Comente la directiva page en index.jsp y compruebe que es lo que ocurre.

Sustituya la directiva page de index.jsp en la que la página del tratamiento de error no sea ErrorVelocidad.jsp ¿Qué pasaría?.

EJEMPLO5:

La mayor parte de las veces el atributo contentType es “text/html”, esto quiere decir que la información con la que el servidor responde a la petición del cliente es un texto plano. Sin embargo, esto no es verdad en todos los casos. Y así por ejemplo podemos hacer que el servidor devuelva una información estructurada y que tendrá que ser atendida por cualquier otra aplicación, siempre que sepa manejarla en el cliente.

Este ejemplo supone que el servidor envía datos con destino a una aplicación que procese una hoja de cálculo.

1.- Iniciamos un nuevo proyecto “Java Web” y “Web Application”.

2.- Llamamos al proyecto “DirpageContentType”.

3.- Sustituimos el código de la plantilla index.jsp por este otro

<html>
  <body>
   <%@ page contentType="application/vnd.ms-excel; charset=UTF-8" %>
   <%-- Establecemos el tipo de comunicación --%>
   <% response.setHeader("Content-Disposition", "attachment; filename=\"HojaEjemplo.xls\""); %>
   <%-- Tabla con valores--%>
    <table>
     <% for(int i = 1; i <= 12; i++){ %>
     <tr>
     <% for(int j = 1; j <= 12; j++){ %>
     <td>
     <%= i * j %>
     </td>
     <% } %>
     </tr>
     <% } %>
   </table>
   </body>
</html>

(Escriba el código desde la primera línea sin comentarios y sin lineas en blanco.)

4.- Al ejecutar comprobará que en cliente aparece el siguiente cuadro de diálogo

Image2

Obviamente, si dispone de Microsoft Excel podrá abrir la hoja de cálculo con los datos, también podría abrirlos con Open Offices.

De nuevo se ha utilizado en este ejemplo el objeto implícito response, que se estudiará mas adelante, para escribir la cabecera de la información devuelta al cliente.

Consideraciones:

Pruebe a sustituir el atributo con este otro valor contentType=”application/vnd.sun.xml.calc”

(No está garantizado que se puedan abrir los datos para todas las versiones de MS Excel o de OpenOffice Calc.). En el apartado de Servlet veremos algún ejemplo de transmisión binaria de una imagen, para ello utilizaremos  image/gif o image/jpeg

EJEMPLO6:

Veamos un nuevo ejemplo de la directiva page, concretamente el atributo info. Aprovecharemos este ejercicio para estudiar el objeto DateFormat para formatear fechas y un objeto muy importante que estudiaremos en lecciones posteriores que se utiliza para producir salida HTML. Se trata del objeto implícito out. Iniciamos una nueva sesión de Netbeans y creamos un proyecto denominado dirpage_info, sustituimos el código de la plantilla del archivo index.jsp por este otro:

<%-- 
    Document   : index
    Created on : 09-dic-2007, 18:33:59
    Author     : jtagua
--%>
<%@page info="Copyright por J. Ant.Tagua" contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.*,java.text.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Directiva page (info)</title>
    </head>
    <body>
        <center>
        <%
          Date hoy=new Date();
          DateFormat df=DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
                  DateFormat.MEDIUM,Locale.getDefault());
        %>
          Fecha en Español y formato medio: <%=df.format(hoy)%>
          <br>
          <hr>
         <% out.println(getServletInfo()); %>
        <center>
    </body>
</html>

Vemos que

  1. En la línea 06 hemos introducido el atributo info de la directiva page. Más tarde en la línea 26 a través del objeto implícito out hemos escrito en la página devuelta al cliente el comentario anterior.
  2. En la línea 19 se declara una variable del tipo Date.
  3. En las líneas 20 y 21 se define el objeto df de la clase DateFormat, con una definición de formato adecuada.
  4. En la línea 23 utilizamos el método format del objeto dt sobre la variable hoy en una extresión jsp para mostrar el valor de hoy.

Cuestiones a recordar:

Objetos y propiedades en Java de los datos o variables de fechas y horas.

Concepto, sintaxis, atributos y usos de la directiva page.

Atributos import, session, buffer, autoFlush, contentType, errorPage, IsErrorPage.


1 comentario

  1. Danny dice:

    Hey de verdad excelente material la verdad estaba buscando justamente esto. Muchas gracias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: