problemas de nuevo con jsp

Gabriel
02 de Octubre del 2003
Que tal:

Pues otra vez yo con problemas al llamar funciones dentro de mi jsp

Supongamos que estas son las últimas líneas de mi jsp

<% mostrarLineas(); %>
</body>
</html>
<%!
void mostrarLineas()
{
int contador;
contador = 1;
while (contador <= 5)
{
%>
<h1> el contador está en el número <%= contador %> </h1>
<%!
contador++;
}
}
%>

Antes de la etiqueta “</body>” estoy llamando a la función “mostrarLineas” para que imprima cinco líneas de código html, cada una de estas líneas va a imprimir el valor que tenga la variable “contador”.

Al momento de correr el jsp me marca un error de compilación precisamente en la línea

<h1> el contador está en el número <%= contador %> </h1>

Diciéndome que “contador” es una variable no definida.

¿Ustedes saben por qué sucede esto?
¿Cómo es entonces que debo mandar a imprimir la variable?

Estoy utilizando Tomcat 4.0.6, j2sdk1.4.1_02 y Windows 2000


Muchísimas gracias.

smartin
02 de Octubre del 2003
Me parece que estas haciendolo mal. La expresión que estás poniendo antes del código es <%!
y esto indica declaración de variables.
Has de poner <%

sturner
02 de Octubre del 2003
Eso no lo puedes hacer, la explicación de el porque es
un poco larga así que si de verdad te interesa me la pides
y te la envió.

pero el caso es que si deseas escribir en la página y usar
métodos para esto debes de pasar la variable out como parametro

es decir

<%! void mostrarlinea(JspWriter out){
out.print(lo que voy a imprimir);
}
%>

y para llamarlo
%!
mostrarlinea(out);
%>
además te faltan las etiquetas html y body superiores :)
el código arreglado luce así

<html>
<head><title>JSP Page</title></head>
<body>

<% mostrarLineas(out); %>

<%!

void mostrarLineas(JspWriter out){
int contador;
contador = 1;

try{
while (contador <= 5){
out.println("<h1>" + String.valueOf(contador) +"</h1>");
contador++;
}
}catch(java.io.IOException ioe){}
}
%>
</body>
</html>

sturner
02 de Octubre del 2003
Mira si quieres copia el código, a mi me funciona bien,
estoy utilizando tomcat 4.1.27, jsdk 1.4.2, win2k


oye, estoy seguro de que la versión de java no tiene
nada que ver en que tu jsp no funcione.

cópialo en
TOMCAT_HOME/webapps/examples/jsp/test.jsp
y accede
http://localhost:8080/examples/jsp/test.jsp
=============================================
<html>
<head><title>JSP Page</title></head>
<body>

<% mostrarLineas(out); %>
</body>
</html>

<%!

void mostrarLineas(JspWriter out){
int contador;
contador = 1;

try{
while (contador <= 5){
out.println("<h1>" + String.valueOf(contador) +"</h1>");
contador++;
}
}catch(java.io.IOException ioe){}
}
%>

=============================================
estoy, seguro que debería funcionar, sino
Dime que errores te dá, hace algo o no?

la explicación es la siguiente de por qué tú código
no funciona:

el contenedor de jsp crea un servlet a partir del código
html y jsp fuente.

todo el código que se encuentra entre <% %> es forma
parte de un método llamado _jspService el cual posee
referencias al response, request, session, etc.

el servlet se ve asi

public class MyServlet extends httpServlet{

....
public void _jspService(){
// todo el código entren <%%>
}

}

por otra parte el código que se encuentra entre <!% %>
no es parte de ese método _jspService, sino que las
variables que se declaran y métodos son instancias
de clase y métodos del servlet. e.g.

<!%
int a = 0;

public void metodo(){ // .. do something }
%>

esto quedaría así en el servlet
public class MyServlet extends HttpServlet{

// en el servlet las variables son globales
int a = 0;

public void metodo(){
// aquí se copia el cuerpo del método.
}

public void _jspService(){
// el código entre <% %>
}
}

los problemas con el código que tienes

1-) El método mostrarLineas no puede referenciar a los
objetos out, para escribir.

2-) la variable contador es local a mostrarLineas(),
y no puede ser accedida desde _jspService (es decir
donde haces la expresión <%= contador%>)

si quieres ver como funciona tú código (no de la forma
que esperas :) ) cambia la declaración del contador

juston despues de <!% int contador; void mostrar...() %>
es decir fuera de mostrar lineas
el resultado que has de obtener es

"el valor del contador es 6", bueno eso creo.
fíjate en el código fuente generado por la página
no está bien :(