我开始学习jsp,我看到,如果我们想在jsp中打印一些东西,我们必须写出out.println()而不是System.out.pritnln(),但是如果我们编写System.out.pritnln()它没有显示任何错误,但也不o / p到浏览器.我想知道为什么会这样吗?正如我们所知道的,系统是一个预定义的类,而输出流是连接到控制台的输出流.所以为什么我们不需要在jsp中编写System.
谢谢
谢谢
解决方法
因为我们指的是不是System.out,它是一个包含JSP页面的有效方法的变量. System.out写入到servlet容器的控制台(通常是一个日志文件); out是一个完全不同的类,写入生成的响应的输出流.
当JSP变成代码时,它(在理论上,与Tomcat实际上)通过两个步骤:JSP – > servlet源代码,然后是servlet源代码 – >类.整个页面放在一个方法中,其中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(而不是OutputStream与System.out类似).
(旁注:您在<%!...%>标签中包含的代码,而不是正常的<%...%>标记中的代码不会放在方法中;它会放在生成的servlet类的其他位置. )