39

我刚开始学习JSP技术,碰壁了。

如何从 <%! ... %> JSP 声明块?

这不起作用:

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

服务器说没有“出局”。

U:我确实知道如何用这个返回字符串的方法重写代码,但是有没有办法在 <%! 无效(){}%>?尽管它可能不是最佳的,但它仍然很有趣。

4

8 回答 8

33

您不能在指令中使用“out”变量(也不能使用任何其他“预先声明的”scriptlet 变量)。

JSP 页面由您的网络服务器翻译成 Java servlet。例如,在 tomcats 中,scriptlet 中的所有内容(以“<%”开头)以及所有静态 HTML 都被转换为一个巨大的 Java 方法,该方法将您的页面逐行写入名为“out”的 JspWriter 实例。这就是为什么您可以直接在 scriptlet 中使用“out”参数的原因。另一方面,指令(以“<%!”开头)被翻译为单独的 Java 方法。

例如,一个非常简单的页面(我们称之为 foo.jsp):

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

最终会看起来像这样(为清楚起见忽略了很多细节):

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";
    }
}
于 2008-09-26T12:09:28.870 回答
14
<%!
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);
%>

试试这个,它对我有用!

于 2012-06-12T12:17:25.423 回答
11

我想这会有所帮助:

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

无论如何,在视图中包含代码并不是一个好主意。

于 2008-09-26T12:19:05.727 回答
10

您需要做的就是将 JspWriter 对象作为参数传递到您的方法中,即

void someOutput(JspWriter stream)

然后通过以下方式调用它:

<% someOutput(out) %>

writer 对象是 _jspService 中的一个局部变量,因此您需要将它传递给您的实用程序方法。这同样适用于所有其他内置引用(例如请求、响应、会话)。

查看正在发生的事情的一个好方法是使用 Tomcat 作为您的服务器并深入到从您的“jsp”页面生成的“.java”文件的“工作”目录。或者,在 weblogic 中,您可以使用“weblogic.jspc”页面编译器来查看请求页面时将生成的 Java。

于 2008-09-26T16:57:05.697 回答
6

一个简单的替代方案如下:

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

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

您可以在 jsp 代码中以任何方式简单地使用该变量

于 2014-03-15T17:18:52.960 回答
3

你可以这样做:

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

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

这将输出test 1 2 3到页面。

于 2014-03-03T23:17:04.603 回答
2

回答为时已晚,但这对其他人有帮助

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

       }
     }

%>
于 2015-08-28T04:24:02.390 回答
-1

你可以这样做:

<%

out.print("<p>Hey!</p>");    
out.print("<p>How are you?</p>");

%>
于 2013-07-15T19:06:53.523 回答