Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
-Tutoriales

Introducción a J2EE


Tecnología JavaServer Pages™ (JSP)

La tecnología JavaServer Pages™ (JSP) nos permite poner segmentos de código servlet directamente dentro de una página HTML estática. Cuando el navegador carga una página JSP, se ejecuta el código del servlet y el servidor de aplicaciones crea, compila, carga y ejecuta un servlet en segundo plano para ejecutar los segmentos de código servlet y devolver una página HTML o imprimir un informe XML.

Esta lección modifica el fichero WAR de la Lección anterior para usar una página JSP en lugar de BonusServlet.

. Crear la Página JSP

Una página JSP se parece a una página HTML con segmentos de código servlet embebidos entre varias etiquetas de apertura ( <% ) y cierre (%> ) JSP. No hay métodos HttpServlet como init , doGet, o doPost. En su lugar, el código que normalmente iría en estos métodos está directamente embebido en la página JSP usando etiequetas JSP.

La siguiente página JAP ( Bonus.jsp ) es equivalente al BonusServlet de la lección anterior. Después del código podremos ver una descripción detallada de las etiquetas JSP. Observa que las etiquetas JSP no pueden estar anidadas. Por ejemplo, no podemos anidar una etiqueta de comentario JSP con una etiqueta scriptlet JSP.

<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
  <%--  Comment
    Scriptlet for import statements
    <%@ indicates a jsp directive --%>
  <%@ page import="javax.naming.*" %>
  <%@ page import="javax.rmi.PortableRemoteObject" %>
  <%@ page import="Beans.*" %>
  <%-- Comment
    Scriptlet to get the parameters, 
    convert string to Integer to int for bonus
    calculation, and declare/initialize bonus
    variable. <% indicates a jsp scriptlet  --%>
  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>
<%
  strMult = request.getParameter("MULTIPLIER");
  socsec = request.getParameter("SOCSEC");
  integerMult = new Integer(strMult);
  multiplier = integerMult.intValue();
  bonus = 100.00;
%>
  <%-- Comment
    Scriptlet to look up session Bean --%>
<%
  InitialContext ctx = new InitialContext();
  Object objref = ctx.lookup("calcs");
  CalcHome homecalc = (CalcHome)
                    PortableRemoteObject.narrow(
                    objref, CalcHome.class);
%>
  <%-- Comment
    Scriptlet to create session Bean, 
    call calcBonus method, and retrieve a database
    record by the social security number 
   (primary key) --%>
<%
  try {
    Calc theCalculation = homecalc.create();
    Bonus theBonus = theCalculation.calcBonus(
                                  multiplier, 
                                  bonus, 
                                  socsec);
    Bonus record = theCalculation.getRecord(socsec);
%>
  <%-- Comment
    HTML code to display retrieved data
    on returned HTML page.  --%>
    <H1>Bonus Calculation</H1>
    Social security number retrieved: 
                    <%= record.getSocSec() %>
    <P>
    Bonus Amount retrieved: <%= record.getBonus() %>
    <P>
  <%-- Comment
    Scriptlet to catch DuplicateKeyException --%>
<%
  } catch (javax.ejb.DuplicateKeyException e) {
    String message = e.getMessage();
%>
  <%-- Comment
    HTML code to display original data passed to JSP
    on returned HTML page --%>
    Social security number passed in: <%= socsec %>
    <P>
    Multiplier passed in: <%= strMult %>
    <P>
    Error: <%= message %>
  <%-- Comment
    Scriptlet to close try and catch block --%>
<%
  }
%>
  <%--  Comment
    HTML code to close HTML body and page --%>
</BODY>
</HTML>

. Comentarios

Las primeras siete líneas de Bonus.jsp muestran un HTML normal seguido por un comentario JSP. Los comentarios JSP son similares a los comentarios HTML excepto en que empiezan con <%-- en lugar de <!--, que es como empiezan en HTML. Podemos usar comentarios JSP o HTML en una página HTML. Los comentarios HTML se envían al navegador web del cliente donde aparezcan como parte de la página HTML, y los comentarios JSP son eliminados y no aparecen en el HTML generado.

Nota:
Hemos visto que poner dos puntos (:) en un comentario JSP como en <%-- Comment: Scriptlet for import statements . . . creaba un error en tiempo de ejecución que desaparecía cuando eliminamos los dos puntos.
<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
<%-- Comment
Scriptlet for import statements
<%@ indicates a jsp directive --%>

. Directivas

Las directivas JSP son instrucciones procesadas por el motor JSP cuando la página JSP se traduce a un servlet. Las directivas usadas en este ejemplo le dicen al motor JSP que incluya ciertos paquetes y clases. Las directivas están encerradas entre etiquetas de directiva <%@ y %>.

<%@ page import="javax.naming.*" %>
<%@ page import="javax.rmi.PortableRemoteObject" %>
<%@ page import="Beans.*" %>

. Declaraciones

Las declaraciones JSP nos permiten configurar variables para su uso posterior en expresiones o scriptlets. También podemos declarar variables dentro de expresiones o scriptlets en el momento de usarlas. El ámbito es toda la página JSP, no hay concepto de variables de ejemplar. Es decir, no tenemos que declarar variables de ejemplar para usar en más de una expresión o scriptlet. Las declaraciones van encerradas entre etiquetas de declaración <%! y %>. Podemos tener varias declaraciones. Por ejemplo, <%! double bonus; String text; %> .

  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>

. Scriptlets

Los scriptlets JSP nos permiten embeber segmentos de código java dentro de una página JSP. El codigo embebido se inserta directamente en el servlet generado que se ejecuta cuando se pide la página. Este scriptlet usa las variables declaradas en las directivas descritas arriba. Los Scriptlets van encerradas entre etiquetas <% y %>.

<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

. Variables Predefinidas

Un scriptlet puede usar las siguientes variables predefinidas: session, request, response, out , e in. Este ejemplo usa la variable predefinida request, que es un objeto HttpServletRequest. De igual forma, response es un objeto HttpServletResponse, out es un objeto PrintWriter, e in es un objeto BufferedReader.

Las variables predefinidas se usan en los scriptlets de la misma forma que se usan en los servelts, excepto que no las declaramos.

<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

. Expresiones

La expresiones JSP nos permiten recuperar dinámicamente o calcular valores a insertar directamente en la página JSP. En este ejemplo, una expresión recupera el número de la seguridad social desde el bean de entidad Bonus y lo pone en la página JSP.

<H1>Bonus Calculation</H1>
Social security number retrieved:
<%= record.getSocSec() %>
<P>
Bonus Amount retrieved: <%= record.getBonus() %>
<P>

. Etiquetas Especificas de JSP

La especificación JavaServer Pages 1.1 define etiquetas específicas de JSP que nos permiten extender la implementación JSP con nuevas características y ocultar mucha complejidad a los diseñadores visuales que necesitan buscar la página JSP y modificarla. El ejemplo JSP de esta lección no usa ninguna de estas etiquetas específicas, pero las veremos en la siguiente lección. Las etiquetas específicas JSP definidas en la especificación 1.1 son las siguientes:

jsp:forward y jsp:include para instruir al motor JSP que pase de la página actual a otra página JSP.

jsp:useBean, jsp:setProperty, jsp:getProperty nos permiten embeber y utilizar tecnología JavaBeans en páginas JSP.

jsp:plugin descarga automáticamente el Plug-In Java al cliente para ejecutar applet en la plataforma Java adecuada.

. Modificar bonus.html

El único cambio que necesitamos hacer a bonus.html es hacer que el parametro ACTION del formulario HTML invoque a Bonus.jsp en lugar de a BonusServlet .

<HTML>
<BODY BGCOLOR = "WHITE">
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<FORM METHOD="GET" ACTION="Bonus.jsp">
<P>
Enter social security Number:
<P>
<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>
<P>
Enter Multiplier:
<P>
<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>
<P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="RESET">
</FORM>
</FORM>
</BLOCKQUOTE>
</BODY>
</HTML>

. Arrancar la Plataforma y las Herramientas

Para ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramienta Deploy, y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientes comandos:

j2ee -verbose
deploytool
cloudscape -start

Si esto no funciona, tecleamos esto desde el directorio J2EE:

Unix

j2sdkee1.2.1/bin/j2ee -verbose
j2sdkee1.2.1/bin/deploytool
j2sdkee1.2.1/bin/cloudscape -start

Windows

j2sdkee1.2.1\bin\j2ee -verbose
j2sdkee1.2.1\bin\deploytool
j2sdkee1.2.1\bin\cloudscape -start

. Eliminar el Fichero WAR

Como se ha añadido una página JSP al componente Web, tenemos que borrar el fichero WAR de las lecciones anteriores y crear uno nuevo con la página JSP.

Local Applications:

  • Pulsar el icono 2BeansApp para poder ver los componentes de nuestra aplicación.
  • Seleccionamos BonusWar para que se ilumine.
  • Seleccionamos Delete desde el menú Edit.

Crear el Nuevo Fichero WAR

Menú File:

  • Seleccionamos New Web Component

Introduction:

  • Leemos y pulsamos Next .

War File General Properties :

Nota:
Parece que hay un bug en la herramienta Deploy. Debemos asegurarnos de añadir primero Bonus.jsp seguido de bonus.html. Si añadimos primero bonus.html, la herramienta Deploy pone bonus.html donde debería ir Bonus.jsp y Bonus.jsp donde debería ir bonus.html. Si esto sucede, podemos corregirlo manualmente copiándolos en las localizaciones correctas. Así es como deben estar después del despliegue:
~/j2sdkee1.2/public_html/JSPRoot/bonus.html
~/j2sdkee1.2/public_html/JSPRoot/WEB-INF/classes/Bonus.jsp
  • Especificamos BonusWar para el nombre de display.
  • Pulsamos Add
  • Vamos al directorio ClientCode y añadimos Bonus.jsp,
  • Pulsamos Next
  • Vamos al directorio ClientCode y añadimos bonus.html
  • Pulsamos Finish .

Propiedades Generales del Fichero War:

  • Pulsamos Next.

Elegir el tipo de Componente: .

  • Seleccionamos Describe a JSP.
  • Pulsamos Next.

Propiedades generales del Componente:

  • Ponemos Bonus.jsp como nombre de fichero JSP.
  • Ponemos BonusJSP como nombre de display.
  • Pulsamos Finish .

Ventana Inspecting:

  • Seleccionamos Web Context
  • Especificamos JSPRoot.

. Verificar y Desplegar la Aplicación J2EE

Antes de desplegar la aplicación, es una buena idea ejecutar el verificador. El verificador mostrará los errores en los componentes de la aplicación como métodos inexistentes que el compilador no captura.

Verificar:

  • Con 2BeansApp seleccionado, elegimos Verifier desde el menú Tools.
  • En el diálogo que aparece, pulsamos OK. La ventana debería decir que no hay ningún fallo.
  • Cerramos la ventana del verificador porque ahora estamos listos para desplegar la aplicación.
Nota:
En la versión 1.2.1 del software podríamos obtener un error tests app.WebURI. Esto significa que la herramienta DeployTool no puso la extensión .war al fichero WAR durante su creacción. Es un error menor y la aplicación J2EE se despliega sin problemas.

Desplegar:

  • Desde el menú Tools, elegimos Deploy Application. Se mostrará una caja de diálogo Deploy BonusApp.
  • Verificar que la selección de Target Server es un host local o el nombre de un host donde se está ejecutando el servidor J2EE.
Nota:
No marcamos la caja "Return Client Jar". El único momento en que debemos chequear esta caja es cuando usamos persistencia controlada por el bean o desplegamos una aplicación solitaria para el programa cliente. Este ejemplo usa un servlet y una página HTML por lo que no debe estár marcada. Esta caja crea un fichero JAR con toda la información de despliegue necesaria para una aplicación solitaria.
  • Pulsamos Next .
  • Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean y bonus para BonusBean. Si no es así, tecleamos los nombres JNDI nosotros mismos, y pulsamos la tecla Return.
  • Pulsamos Next. Nos aseguramos de que el nombre Context Root muestra JSPRoot. Si no es así, lo tecleamos nosotros mismos y pulsamos la tecla Return.
  • Pulsamos Next .
  • Pulsamos Finish para empezar el despliegue. Se mostrará una caja de diálogo que mostrará el estado de la operación de despliegue.
  • Cuando se haya completado, las tres barras de la izquierda se habrán sombreado completamente, como se ve en la siguiente figura. Cuando esto suceda pulsamos OK.

. Ejecutar la Aplicación J2EE

El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la página bonus.html apuntamos nuestro navegador a http://localhost:8000/JSPRoot/bonus.html, que es dónde la herramienta de despliegue puso el fichero HTML.

Nota:
La Herramienta Deploy pone Bonus.jsp bajo public_html/JSPRoot , y bonus.html bajo public_html/JSPRoot/WEB-INF/classes, que es lo opuesto a donde realmente pertenecen. Manualmente los copiamos en sus localizaciones correctas como sigue public_html/JSPRoot/bonus.html y public_html/JSPRoot/WEB-INF/classes/Bonus.jsp.
  • Rellenamos un número de la seguridad social y un multiplicador.
  • Pulsamos el botón Submit. Bonus.jsp procesa nuestros datos y devuelve una página HTML con el bono calculado.
Bonus Calculation

Social Security number retrieved: 777777777
Bonus Amount Retrieved: 200.0

Si hemos suministrado dos veces el mismo número de la seguridad social, veremos algo similar a esto:

Bonus Calculation

Soc Sec passed in: 777777777
Multiplier passed in: 2
Error: Duplicate primary key

. Código Fuente de los Ejemplos

Aquí tienes un fichero Zip con los ficheros fuente de los ejemplos de esta página:

fuentes_L4.zip

 
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network