No se puede usar la variable 'out' (ni ninguna de las otras variables de scriptlet "predeclaradas") dentro de las directivas.
La página JSP es traducida por su servidor web a un servlet de Java. Dentro de tomcat, por ejemplo, todo dentro de scriptlets (que comienzan con "<%"), junto con todo el HTML estático, se traduce en un método Java gigante que escribe tu página, línea por línea, en una instancia de JspWriter llamada "out". Esta es la razón por la que puede usar el parámetro "salir" directamente en scriptlets. Las directivas, por otro lado (que comienzan con "<%!") Se traducen como métodos separados de Java.
A modo de ejemplo, una página muy simple (vamos a llamarlo foo.jsp):
<html>
<head/>
<body>
<%!
String someOutput() {
return "Some output";
}
%>
<% someOutput(); %>
</body>
</html>
terminaría buscando algo como esto (con mucho el detalle ignorado para mayor claridad):
public final class foo_jsp
{
// This is where the request comes in
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
// JspWriter instance is gotten from a factory
// This is why you can use 'out' directly in scriptlets
JspWriter out = ...;
// Snip
out.write("<html>");
out.write("<head/>");
out.write("<body>");
out.write(someOutput()); // i.e. write the results of the method call
out.write("</body>");
out.write("</html>");
}
// Directive gets translated as separate method - note
// there is no 'out' variable declared in scope
private String someOutput()
{
return "Some output";
}
}
Gracias por su buena respuesta, aunque no es lo que estoy buscando. – ansgri
La llamada a someOutput no se colocaría en una instrucción out.write a menos que haya utilizado la sintaxis de expresión <%= %>. Cuando usa la sintaxis de scriptlet, simplemente se inserta en línea. –
La respuesta de paradoja funcionó para mí, pero no es así. – mr5