Professional Documents
Culture Documents
CU RSO 2 00 3 /20 04 4
Pgina 296
13.1. INTRODUCCIN
Con servlets es fcil ...
q q q q q q
Leer datos de un formulario Leer las cabeceras de las peticiones HTTP Establecer cdigos de estado y cabeceras de las respuestas HTTP Usar cookies para el seguimiento de sesiones Compartir datos entre servlets Recordar datos entre peticiones Emplear sentencias println para generar HTML Mantener ese cdigo HTML Usar cdigo HTML para la mayor parte de la pgina Sealar el cdigo del servlets con marcas especiales Toda la pgina JSP se traduce a un servlet (una vez), y se invoca a dicho servlet en cada peticin
Pgina 297
Consistencia
q q q
Ejemplo
<!DOCTYPE > <HTML> <HEAD> <TITLE>Confirmacion de la orden</TITLE> </HEAD> <BODY> <H2>Confirmacion de la orden</H2> Gracias por solicitarnos <I><%= request.getParameter("titulo") %></I> </BODY> </HTML>
Pgina 298
13.1.1.
Los servlets son ms generales, y tienen ventajas tcnicas con respecto a las pginas JSP; sin embargo es preferible el uso de JSPs para:
q q q
Escribir, leer y mantener pginas HTML Emplear herrmientas estndar de desarrollo para HTML Dedicar especficamente algunas personas al trabajo con el diseo HTML mientras otras se dedican a la programacin en Java JSP facilita la separacin entre la parte que genera el contenido (Java) y la que lo muestra (HTML)
De todas maneras, los programadores en JSP siguen necesitando conocer cmo funciona la programacin con servlets Tambin presenta otras ventajas en cuanto a la configuracin 23:
q q q
No hace falta modificar el CLASSPATH No es necesario compilar el cdigo No hace falta el uso de paquetes para evitar los conflictos entre nombres
23
no es palicable a las clases Java ordinarias usadas por las pginas JSP Pgina 299
No se necesitan URLs especiales (slo extensiones de ficheros) para invocar pginas JSP
Pgina 300
13.1.2.
EJEMPLO
Pgina 301
13.2. ESTRATEGIA JS P
Dos opciones:
q q
Colocar 25 lneas de cdigo Java directamente en la pgina JSP Colocar esas mismas 25 lneas en una clase Java separada, y 1 lnea en la pgina JSP que la invoca Desarrollo: se escribe la clase separada en un entorno Java (editor o IDE), no en un entorno HTML Depuracin: si existen errores sintcticos, se localizan rpidamente en el momento de la compilacin. Pueden usarse sentencias print Testing: podemos escribir una rutina de prueba con un bucle que testee 10.000 veces y volver a aplicarlo tras cada cambio Reutilizacin: puede emplearse la misma clase para diferentes pginas
Pgina 302
Comentarios HTML
q q
<!Comentario -->
Comentarios JSP
q q q
No se enva al cliente Para colocar la combinacin de smbolos <% como salida, usar <\%
Pgina 303
Pgina 304
Resultado
q
La expresin se evala, se convierte en String y se coloca el resultado en el lugar en el que apareca la expresin dentro de la pgina JSP Es decir, la expresin se coloca dentro de out.print en _jspService Hora y fecha actuales Direccin del ordenador cliente
Ejemplos
q
No se pueden mezclar versiones en la misma pgina. Debe emplearse XML para toda la pgna si se usa jsp:expression
Pgina 305
Pgina 306
13.5.2.
... <BODY> <H2>Expresiones JSP</H2> <UL> <LI>Hora y fecha actuales: <%= new java.util.Date() %></LI> <LI>Servidor: <%= application.getServerInfo() %></LI> <LI>Identificador de sesion: <%= session.getId() %></LI> <LI>El parametro <CODE>test</CODE> del formulario: <%= request.getParameter(test) %></LI> </UL> </BODY></HTML>
Pgina 307
13.5.3.
request
q
out
q
El Writer (de tipo JspWriter pero con buffer) empleado para enviar la salida al cliente
HttpSession asociado con la peticin (salvo que se haya desactivado ediante el atributo
session
q
Pgina 308
13.5.4.
public class TresParametros extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { out.println(docType + "<HTML>\n" + "<HEAD><TITLE>Leer 3 parametros</TITLE>\n+ </HEAD>\n<BODY>\n" + "<H1 ALIGN=\"CENTER\">Leer 3 parametros</H1>\n" + "<UL>\n" + " <LI><B>param1</B>: " + request.getParameter("param1") + "</LI>\n" + " <LI><B>param2</B>: " + request.getParameter("param2") + "</LI>\n" + " <LI><B>param3</B>: " + request.getParameter("param3") + "</LI>\n" + "</UL>\n" + "</BODY></HTML>"); } }
Pgina 309
<!DOCTYPE > <HTML> <HEAD> <TITLE>Leer 3 parametros</TITLE> </HEAD> <BODY> <H1>Leer 3 parametros</H1> <UL> <LI><B>param1</B>: <%= request.getParameter("param1") %></LI> <LI><B>param2</B>: <%= request.getParameter("param2") %></LI> <LI><B>param3</B>: <%= request.getParameter("param3") %></LI> </UL> </BODY> </HTML>
Pgina 310
Resultado
q
Ejemplo
<% String queryData = request.getQueryString(); out.println(Datos incorporados en GET: + queryData); %> <% response.setContentType(text/plain); %>
Pgina 311
Pgina 312
13.6.2.
EJEMPLO D E SC RIPTLET
Supngase que se pretende que los usuarios personalicen el color de fondo de una pgina. Qu hay mal en el fragmento de cdigo siguiente?
<BODY BGCOLOR= "<%= request.getParameter("bgColor") %>">
Pgina 313
13.6.3.
Los scriptlets se insertan en el servlet tal y como han sido escritos No precisan ser expresiones Java completas, pero es mucho ms complejo de mantener Ejemplo
<% if (Math.random() < 0.5) { %> Te deseo un dia <B>agradable</B>! <% } else { %> Te deseo un dia <B>para olvidar</B>! <% } %>
Pgina 314
Resultado
q
El cdigo se inserta sin modificacin en la definicin de clases del servlet, fuera de los mtodos
Ejemplos
<%! private int loqueSea = 5; %> <%! private void unMetodo(...) {...} %>
Consideraciones de diseo
q q
til para las variables de instancia En el caso de los mtodos suele ser mejor definirlos en una clase Java separada
Pgina 315
<H1>Cabeceras</H1> <%! private String cabeceraAleatoria() { return("<H2>" + Math.random() + "</H2>"); } %> <%= cabeceraAleatoria() %> Alternativa: definir cabeceraAleatoria como un mtodo esttico en una clase Java separada
Pgina 317
13.7.2.
<!DOCTYPE > <HTML> <HEAD> <TITLE>Declaraciones JSP</TITLE> </HEAD> <BODY> <H1>Declaraciones JSP</H1> <%! private int numeroAccesos = 0; %> <H2>Numero de accessos a esta pagina desde el reinicio del servidor: <%= ++numeroAccesos %></H2> </BODY> </HTML>
Pgina 318
13.7.3.
destroy
De la misma forma que los servlets, las pginas JSP pueden necesitar usar los mtodos init y Problema: puede que el servlet procedente de la pgina JSP ya use ambos mtodos
q
Para evitar problemas con su sobreescritura, es ilegal usar declaraciones JSP para declarar init o destroy Se garantiza que el servlet obtenido desde la JSP llame a estos mtodos desde init y destroy, pero las versiones estndar de ambas se encuentran vacas, listas para ser sobreescritas
Pgina 319
13.7.4. Problema
q
Las variables predefinidas (request, response, out, session, ...) son locales al mtodo
_jspService
No son accesibles a los mtodos definidos por las declaraciones JSP ni a los de las clases auxiliares
Pgina 320
13.8. EJERCICIOS
Introducimos primero una clase auxiliar que ser aprovechada en los 3 ejercicios
package coreservlets; // Always use packages!! /** Utilidad para generar enteros aleatorios */ public class RanUtilities { /** Un entero aleatorio entre 1 y el rango (inclusives) */ public static int randomInt(int range) { return(1 + ((int)(Math.random() * range))); } public static void main(String[] args) { int range = 10; try { range = Integer.parseInt(args[0]); } catch(Exception e) { // Indice del vector o formato de numero // No hacer nada: el rango ya tiene un valor por defecto } for(int i=0; i<100; i++) { System.out.println(randomInt(range));
}}}
Pgina 321
1) Escribir una lista no ordenada de cinco enteros aleatorios entre 1 y 10 Como la estructura de esta pgina viene determinada y usamos una clase auxiliar separada para el mtodo randomInt, slo necesitamos expresiones JSP
<!DOCTYPE > <HTML> <HEAD> <TITLE>Numeros Aleatorios</TITLE> </HEAD> <BODY> <H1>Numeros Aleatorios</H1> <UL> <LI><%= coreservlets.RanUtilities.randomInt(10) <LI><%= coreservlets.RanUtilities.randomInt(10) <LI><%= coreservlets.RanUtilities.randomInt(10) <LI><%= coreservlets.RanUtilities.randomInt(10) <LI><%= coreservlets.RanUtilities.randomInt(10) </UL> </BODY> </HTML>
Pgina 322
2) Generar una lista conteniendo, al azar, entre 1 y 10 entradas cada una deellas con un entero entre 1 y 10 Como el nmero de entradas en la lista y, por tanto, la estructura de la pgina es dinmica, necesitamos scriptlets JSP
<!DOCTYPE > <HTML> <HEAD> <TITLE>Lista Aleatoria</TITLE> </HEAD> <BODY> <H1>Lista Aleatoria</H1> <UL> <% int numEntradas = coreservlets.RanUtilities.randomInt(10); for(int i=0; i<numEntradas; i++) { out.println("<LI>" + coreservlets.RanUtilities.randomInt(10) + "</LI>"); } %> </UL> </BODY> </HTML>
Pgina 323
Pgina 324
3) Generar un nmero aleatorio en la primera peticin, y a partir de ese momento mostrar el mismo nmero en todas las peticiones hasta el reinicio del servidor La forma natural de conseguir esta persistencia consiste en emplear variables de instancia. Debe usarse declaraciones JSP
<!DOCTYPE > <HTML> <HEAD> <TITLE>Numero Semialeatorio</TITLE> </HEAD> <BODY> <%! private int aleatorio = coreservlets.RanUtilities.randomInt(10); %> <H1> Numero Semialeatorio:<BR><%= aleatorio %></H1> </BODY> </HTML>
Pgina 325