Servlets y JSP

En el alg�n momento, probablemente querramos a�adir alg�n viejo c�digo a nuestras ficheros JSP. Las etiquetas JSP son poderosas y encapsulan tareas que ser�an dif�ciles o llevari�n mucho tiempo de programar. Pero por eso, probablemente querramos usar fragmentos de lenguaje de script para suplementar las etiquetas JSP.

Los lenguajes de script que tenemos disponibles dependen del motor JSP que estemos usando. Con la implementaci�n JSP de Sun, debemos usar el lenguaje Java como lenguaje de script, pero otros motores de JSP de terceras partes podr�an incluir soporte para otros lenguajes.

.��C�mo a�adir Scripting?

Primero, necesitaremos conocer una pocas reglas generales sobre la adicci�n de elementos script a un fichero fuente JSP:

  1. Usamos una directiva page para definir el lenguaje de script utilizado en la p�gina JSP (a menos que estemos usando el lenguaje Java, que es el valor por defecto).
  2. La declaraci�n <%! .. %> declara variables o m�todos.
  3. La expresi�n <%= .. %> define una expresi�n del lenguaje script y fuerza el restulado a un String.
  4. El scriptlet <% .. %> puede manejar declaraciones, expresiones o cualquier otro tipo de fragmento de c�digo v�lido en el lenguaje script de la p�gina.
  5. Cuando escribimos un scriptlet, lo terminamos con %> antes de cambiar a HTML, texto u otra etiqueta JSP.

.�La Diferencia entre <%, <%=, y <%!

Declaraciones, expresiones y scriptlets tienen una s�ntaxis y un uso similar, pero tambi�n tienen diferencias importantes.

Declaracioness (entre las etiquetas <%! y %>) contiene una o m�s declaraciones de variables o m�todos que terminan o est�n separadas por puntos y comas:

<%! int i = 0; %>
<%! int a, b; double c; %>
<%! Circle a = new Circle(2.0); %>

Debemos declarar una variable o m�todo en una p�gina JSP antes de usarla en la p�gina. El �mbito de la declaraci�n normalmente es el fichero JSP, pero si el fichero JSP incluye otros ficheros con la directiva include, el �mbito se expande para incluir tambi�n estos ficheros incluidos.

Expresiones (entre las etiquetas <%= y %>) pueden contener cualquier expresi�n del lenguaje que sea v�lida en el lenguaje de script de la p�gina, pero sin punto y coma:

<%= Math.sqrt(2) %>
<%= items[i] %>
<%= a + b + c %>
<%= new java.util.Date() %>

La definici�n de una expresi�n v�lida depende del lenguaje de script. Cuando usamos lenguaje Java, lo que hay entre las etiquetas de expresi�n puede ser cualquier expresi�n definida en la Expecificaci�n del Lenguaje Java. Las partes de la expresi�n se eval�an de izquierda a derecha. Una diferencia clave entre expresiones y scriptlets es que dentro de las etiquetas de expresi�n no se permiten puntos y comas, incluso si la misma expresi�n lo requiere.

Scriptlets (entre las etiquetas <% y %>) nos permite escribir cualquier n�mero de sentencias del lenguaje Script, de esta forma:

<%
	String name = null;
	if (request.getParameter("name") == null) {
%>

Recuerda que en un scriptlet debemos terminar una sentencia de lenguaje con un punto y coma si el lenguaje los requiere.

Cuando escribamos un scriptlet podemos usar cualquiera de los objetos o clases impl�citos de JSP importados por la directiva page, declarada en una declaraci�n, o nombrada en una etiqueta <jsp:useBean> .

.� The Number Guess Game

El juego Number Guess es divertido y hace buen uso de scriptlets y expressions, as� como de los conocimientos de los formularios HTML que aprendimos en la p�gina anterior.

Sobre "Guess a Number":

.�C�digo de Ejemplo

Mostrar la pantalla de "Number Guess" (numguess.jsp)

<!--
    Number Guess Game
    Written by Jason Hunter, CTO, K&A Software
    [email protected], http://www.servlets.com
    Copyright 1999, K&A Software
    Distributed by Sun Microsystems with permission
-->

<%@ page import = "num.NumberGuessBean" %>

<jsp:useBean id="numguess" class="num.
        NumberGuessBean" scope="session" />
<jsp:setProperty name="numguess" property="*" />

<html>
<head><title>Number Guess</title></head>
<body bgcolor="white">
<font size=4>

<% if (numguess.getSuccess() ) { %>
	Congratulations!  You got it.
	And after just <%= numguess.getNumGuesses() %>
      tries.<p>

	<% numguess.reset(); %>
	Care to <a href="numguess.jsp">try again</a>?

<% } else if (numguess.getNumGuesses() == 0) { %>

	Welcome to the Number Guess game.<p>
	I'm thinking of a number between 1 and 100.<p>

      <form method=get>
      What's your guess? <input type=text name=guess>
      <input type=submit value="Submit">
      </form>

<% } else { %>
      Good guess, but nope.  Try <b><%= numguess.
      getHint() %></b>.
      You have made <%= numguess.getNumGuesses() %> 
      guesses. 
      I'm thinking of a number between 1 and 100.<p>

      <form method=get>
      What's your guess? <input type=text name=guess>
      <input type=submit value="Submit">
      </form>

<% } %>
</font>
</body>
</html>

Manejar el Guess (NumberGuessBean.java)

// Number Guess Game
// Written by Jason Hunter, CTO, K&A Software
// [email protected], http://www.servlets.com
// Copyright 1999, K&A Software
// Distributed by Sun Microsystems with permission

package num;

import java.util.*;
public class NumberGuessBean {

	int answer;
	boolean success;
	String hint;
	int numGuesses;

public NumberGuessBean() {
	reset();
}

public void setGuess(String guess) {
	numGuesses++;

	int g;
	try {
	g = Integer.parseInt(guess);
	}
	catch (NumberFormatException e) {
		g = -1;
	}
	if (g == answer) {
		success = true;
	}
	else if (g == -1) {
		hint = "a number next time";
	}
	else if (g < answer) {
		hint = "higher";
	}
	else if (g > answer) {
		hint = "lower";
	}
}
	public boolean getSuccess() {
		return success;
	}
	public String getHint() {
		return "" + hint;
	}

	public int getNumGuesses() {
		return numGuesses;
	}

	public void reset() {
	    answer = Math.abs(new Random().nextInt() % 100)
              + 1;
	    success = false;
	    numGuesses = 0;
	}
}

.�Usar Elementos Script en un fichero JSP

El fichero numguess.jsp es un ejemplo interesante del uso de elementos script, porque est� estructurado como nosotros estructurariamos un fichero fuente con un una larga sentencia if ... else dentro de las etiquetas scriptlet. La diferencia es que el cuerpo de cada clausula de sentencia est�n escritas en HTML y etiquetas JSP, en vez del lenguaje de programaci�n.

No es necesario que escribamos scriptlets mezclados con HTML y etiquetas JSP,como se muestra en numguess.jsp. Entre las etiquetas <% y %>. Podemos escribir cuantas l�nea de c�digo script creamos necesarias. En general, hacer menos proceso en los scriptles y m�s en los componentes como servlets o Beans haremos el c�digo de nuestra aplicaci�n m�s reutilizable y portable. No obstante, podemos escribir nuestra aplicaci�n JSP como queramos, y la implementaci�n de referencia de JSP 1.0 de Sun no especifica l�mite a la longitud del scriptlet.

.�Mezclar Sentencias Scripting con Etiquetas

Cuando mezclamos elementos scripting con etiquetas HTML y JSP, siempre debemos terminar un elemento de scripting antes de empezar a usar etiquetas y luego reabrir el elemento de scripting, de esta forma:

<% } else { %>   
 <!-- Cerrar el escript antes de empezar las etiquetas-->

... siguen las etiquetas...

<% } %> 
<!-- reabrimos el scriptlet para cerrar el bloque de lenguaje-->

Al principio, esto podr�a parecer un poco extra�o, pero as� se asegura de que los elementos de scripting son transformados correctamente cuando se compila el fichero fuente JSP.

.��Cuando se ejecutan los elementos de Scripting?

Un fichero fuente JSP se procesa en dos estado - traduci�n HTTP y procesamiento de solicitud.

Durante la traduci�n HTTP, que ocurre cuando el usuario carga por primera vez una p�gina JSP, el fichero fuente JSP es compilado a una clase Java, normalmente un Servlet Java. Las etiquetas HTML as� como muchas etiquetas JSP son procesadas en este estado, antes de que el usuario haga una petici�n.

El procesamiento de solicitud ocurre cuando el usuario pulsa en la p�gina JSP para hacer un solicitud. La solicitud es env�ada desde el cliente al servidor mediante el objeto request. Entonces el motor JSP ejecuta el fichero JSP compilado, o servlet, usando los valores del request enviado por el usuario.

Cuando usamos elementos de scripting en un fichero JSP, deber�amos saber cuando son evaluadas. Las declaraciones son procesadas durante la traducci�n HTTP y est�n disponibles para otras declaraciones, expresiones y scriptlets en el fichero compilador JSP. La expresiones tambi�n se eval�an durante la traducci�n a HTTP. El valor de cada expresi�n se convierte a un String y es insertado en su lugar del fichero compilador JSP. Sin embargo, los scriptlets son evaluados durante el proceso de la solicitud, usando las declaraciones y expresiones que se han puesto a su disposici�n.

.��C�mo ejecutar el Ejemplo?

Las instrucciones dadas aqu� usan path al estilo Unix, si utilizamos Windows, usaremos el mismo path pero con el separador apropiado.

  1. El ejemplo Number Guess ya est� instalado en la implementaci�n de referencia JSP.
  2. Los ficheros .jsp y .html est�n en el directorio ../jswdk-1.0/examples/jsp/num .
  3. Los ficheros .java y .class est�n en el directorio ../jswdk-1.0/examples/WEB-INF/jsp/beans/num .
  4. Abrimos un navegador web y vamos a: http://host/examples/jsp/num/numguess.jsp

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR