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.
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";
}
}
<%!
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!
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.
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.
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
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.
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){
}
}
%>