为什么我们在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()
用于向控制台输出/写入内容。