为什么我们在jsp而不是System.out.println()中写出out.println()?

我开始学习jsp,我看到,如果我们想在jsp中打印一些内容,我们必须编写out.println()而不是System.out.println() ,但如果我们编写System.out.println()它没有显示任何错误,但也没有o / p到浏览器。 我想知道它为什么会发生? 我们都知道System是一个预定义的类, out是连接到控制台的输出流。 那么为什么我们不需要在jsp中编写System ? 谢谢。

因为我们所指的out不是System.out ,所以它是包装JSP页面的有效方法中的变量。 System.out写入servlet容器的控制台(通常是一个日志文件); out是一个完全不同的类,它为生成的响应写入输出流。

当JSP转变为代码时,它(理论上和Tomcat实际上)经历了两个步骤:JSP – > servlet源代码,然后是servlet源代码 – > class。 整个页面放在一个方法中,Tomcat看起来像这样:

 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, "qdforumerror.jsp", true, 65536, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; /* ============================================= ...your <% ... %> JSP code here, with any markup outside those tags converted into out.print("..."); statments... ============================================= */ } 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); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } 

如您所见, out是该方法中的变量,类型为JspWriter (而不是与System.out OutputStream )。

(旁注:您在<%! ... %>标签中包含的代码而不是普通的<% ... %>标签不会放在方法中;它会放在生成的servlet类的其他位置。)

jsp中的out是一个JspWriter对象,由Jsp自动创建,用于向webpage写入内容,而System.out.print()用于向控制台输出/写入内容。