2008-09-26 11 views
30

Acabo de empezar a aprender tecnología JSP, y encontré una pared.Cómo generar HTML desde el bloque JSP <%! ... %>?

¡Cómo se imprime HTML desde un método en <%! ...%> Bloque de declaración JSP?

Esto no funciona:

<%! 
void someOutput() { 
    out.println("Some Output"); 
} 
%> 
... 
<% someOutput(); %> 

servidor dice que no hay “ ” a cabo.

U: Sé cómo reescribir el código con este método devolviendo una cadena, pero ¿hay alguna manera de hacerlo dentro de <%! void() {}%>? Aunque puede ser no óptimo, sigue siendo interesante.

Respuesta

27

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"; 
    } 
} 
+0

Gracias por su buena respuesta, aunque no es lo que estoy buscando. – ansgri

+3

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. –

+1

La respuesta de paradoja funcionó para mí, pero no es así. – mr5

8

supongo que esto ayudaría:

<%! 
    String someOutput() { 
    return "Some Output"; 
    } 
%> 
... 
<%= someOutput() %> 

de todos modos, no es una buena idea tener el código en una vista.

9

Todo lo que necesita hacer es pasar el objeto JspWriter en su método como parámetro es decir

void someOutput(JspWriter stream) 

Luego llamaría a través de:

<% someOutput(out) %> 

El objeto escritor es una variable local dentro _jspService por lo necesita pasarlo a su método de utilidad. Lo mismo se aplicaría a todas las demás referencias integradas (por ejemplo, solicitud, respuesta, sesión).

Una excelente manera de ver qué está pasando es utilizar Tomcat como su servidor y profundizar en el directorio 'trabajo' para el archivo '.java' generado desde su página 'jsp'. Alternativamente, en weblogic puede usar el compilador de la página 'weblogic.jspc' para ver el Java que se generará cuando se solicite la página.

12
<%! 
private void myFunc(String Bits, javax.servlet.jsp.JspWriter myOut) 
{ 
    try{ myOut.println("<div>"+Bits+"</div>"); } 
    catch(Exception eek) { } 
} 
%> 
... 
<% 
    myFunc("more difficult than it should be",out); 
%> 

¡Prueba esto, funcionó para mí!

-1

se puede hacer algo como esto:

<% 

out.print("<p>Hola</p>");  
out.print("<p>Cómo estás?</p>"); 

%> 
+1

La pregunta es específicamente sobre '<%! %>', con el signo de interrogación. – ansgri

3

se puede hacer algo como esto:

<%! 
String myMethod(String input) { 
    return "test " + input; 
} 
%> 

<%= myMethod("1 2 3") %> 

de salida Esta voluntad test 1 2 3 a la página.

6

Una alternativa sencilla sería la siguiente:

<%! 
    String myVariable = "Test"; 
    pageContext.setAttribute("myVariable", myVariable); 
%> 

<c:out value="myVariable"/> 
<h1>${myVariable}</h1> 

El simplemente puede utilizar la variable de cualquier manera dentro del código JSP

1

demasiado tarde para responder a ella, pero esto ayuda a otros

<%! 
    public void printChild(Categories cat, HttpServletResponse res){ 
     try{ 
      if(cat.getCategoriesSet().size() >0){ 
       res.getWriter().write("") ; 
      } 
     }catch(Exception exp){ 

     } 
    } 

%> 
Cuestiones relacionadas