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: