web-dev-qa-db-fra.com

Comment sortir du HTML depuis JSP <%! ...%> bloquer?

Je viens de commencer à apprendre la technologie JSP et je suis tombé sur un mur.

Comment sortir du HTML à partir d'une méthode en <%! ...%> Bloc de déclaration JSP?

Cela ne fonctionne pas:

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

Le serveur dit qu'il n'y a pas de "sortie".

: Je sais comment réécrire du code avec cette méthode renvoyant une chaîne, mais existe-t-il un moyen de le faire à l'intérieur de <%! void () {}%>? Bien qu'il ne soit pas optimal, il est toujours intéressant.

35
ansgri

Vous ne pouvez pas utiliser la variable 'out' (ni aucune des autres variables de scriptlet "prédéclarées") à l'intérieur des directives.

La page JSP est traduite par votre serveur Web en un Java. À l’intérieur des tomcats, par exemple, tout ce qui se trouve à l’intérieur des scriptlets (qui commencent "<%"), ainsi que tout le HTML statique, est traduit en un géant Java qui écrit votre page, ligne par ligne, dans une instance JspWriter appelée "out". C'est pourquoi vous pouvez utiliser le paramètre "out" directement dans les scriptlets. Directives, sur le d'autre part (qui commence par "<%!") est traduit comme des méthodes Java Java distinctes).

Par exemple, une page très simple (appelons-la foo.jsp):

<html>
    <head/>
    <body>
        <%!
            String someOutput() {
                return "Some output";
            }
        %>
        <% someOutput(); %>
    </body>
</html>

finirait par ressembler à quelque chose comme ça (avec beaucoup de détails ignorés pour plus de clarté):

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";
    }
}
29
Ashley Mercer
<%!
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);
%>

Essayez ça, ça a marché pour moi!

13
Dave

Je suppose que cela aiderait:

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

Quoi qu'il en soit, ce n'est pas une bonne idée d'avoir du code dans une vue.

9
paradoja

Tout ce que vous devez faire est de passer l'objet JspWriter dans votre méthode en tant que paramètre, c'est-à-dire.

void someOutput(JspWriter stream)

Appelez-le ensuite via:

<% someOutput(out) %>

L'objet writer est une variable locale à l'intérieur de _jspService, vous devez donc le transmettre à votre méthode utilitaire. La même chose s'appliquerait à toutes les autres références intégrées (par exemple, demande, réponse, session).

Une excellente façon de voir ce qui se passe est d'utiliser Tomcat comme serveur et de descendre dans le répertoire 'work' du fichier '.Java' généré à partir de votre page 'jsp'. Alternativement dans weblogic, vous pouvez utiliser le compilateur de page 'weblogic.jspc' pour afficher le Java qui sera généré lorsque la page sera demandée.

9
Garth Gilmour

Une alternative simple serait la suivante:

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

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

Vous pouvez simplement utiliser la variable de quelque manière que ce soit dans le code jsp

6
Jer Yango

Vous pouvez faire quelque chose comme ça:

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

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

Cela produira test 1 2 3 à la page.

3
Martin Carney

trop tard pour y répondre mais cela aide les autres

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

       }
     }

%>
1
Alaa Abuzaghleh