JSP / Java / HTML | JSP out.println(); 在方法中时打印到控制台

Wet*_*Wer 2 html java jsp tomcat

我正在使用jsp创建动态网站。

现在的问题是:当我使用<%编写我的java时,一切工作都很好。

<%
   out.println("<p>test</p>");
%>
Run Code Online (Sandbox Code Playgroud)

但是当我使用<%!这样的:

<%!
  private void test() {
   out.println("<p>test</p>");
}
%>
Run Code Online (Sandbox Code Playgroud)

我的输出将显示在我的代码编辑器控制台中,而不是按预期显示在我的网站上。

作为导入,我使用了<%@ page import="static java.lang.System.out" %>。这是正确的导入还是其他地方的问题?

如果需要更多信息,请发表评论!:)

T.J*_*der 6

您可能知道,Java EE容器将JSP即时转换为servlet。在一个<% ... %>块中,out_jspService生成的servlet中生成的(或类似方法)中的局部变量。这是JspWriter用于写入页面输出的。

在一个<%! ... %>块中,您不在该生成的_jspService(或类似的)方法之外,因此您的静态导入意味着您的out引用是System.out,这不是页面输出应发送到的位置。

如果要在<%! ... %>块中的JSP中定义方法,则必须将其传递out给它们:

<%!
private void test(JspWriter out) throws IOException {
    out.println("<p>test</p>");
}
%>
Run Code Online (Sandbox Code Playgroud)

关于该JSP-> servlet,说我们有这个JSP:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Example</title>
</head>
<body>
<%
    out.println("The current date/time is " + new java.util.Date());
    this.test(out, "Hi, Mom!");
%>
<%!
    private void test(JspWriter out, String msg) throws java.io.IOException {
        out.println(msg);
    }
%>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

请注意,它具有一个<%...%>块和一个<%! ... %>块。

Java EE容器将其转换为类似于以下内容的内容。注意我们的test方法在哪里结束,<%...%>块中的代码在哪里结束(以及原始的JSP文本/标记):

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

    private void test(JspWriter out, String msg) throws java.io.IOException {
        out.println(msg);
    }

    /* ...lots of setup stuff omitted... */

    public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

        PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        Object page = this;
        JspWriter _jspx_out = null;
        PageContext _jspx_page_context = null;


        try {
            response.setContentType("text/html");
            pageContext = _jspxFactory.getPageContext(this, request, response,
                        null, true, 8192, true);
            _jspx_page_context = pageContext;
            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();
            _jspx_out = out;

            out.write("<!doctype html>\n");
            out.write("<html>\n");
            out.write("<head>\n");
            out.write("<meta charset=\"utf-8\">\n");
            out.write("<title>Example</title>\n");
            out.write("</head>\n");
            out.write("<body>\n");

            out.println("The current date/time is " + new java.util.Date());
            this.test(out, "Hi, Mom!");

            out.write("\n");
            out.write("</body>\n");
            out.write("</html>\n");
        } catch (Throwable t) {
            if (!(t instanceof SkipPageException)){
                out = _jspx_out;
                if (out != null && out.getBufferSize() != 0)
                    try { out.clearBuffer(); } catch (java.io.IOException e) {}
                if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
                else log(t.getMessage(), t);
            }
        } finally {
            _jspxFactory.releasePageContext(_jspx_page_context);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)