【问题标题】:Why do we write out.println() in jsp instead of System.out.println()?为什么我们在 jsp 中写 out.println() 而不是 System.out.println()?
【发布时间】:2012-05-10 21:36:18
【问题描述】:

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

【问题讨论】:

    标签: java jsp


    【解决方案1】:

    因为我们指的out不是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)。

    (旁注:您包含在&lt;%! ... %&gt; 标记中的代码而不是普通的&lt;% ... %&gt; 标记没有放在方法中;它放在生成的servlet 类的其他位置。)

    【讨论】:

    • 在核心java中out是PrintStream类的变量,在jsp中是JspWriter的变量,在servlet中是PrintWriter类型,有点混乱。
    • @Debabratta: System.out 和 JSP 中使用的 out 没有任何关系,它们只是同名而已。我不知道为什么在 JSP 中使用 JspWriter 而不是 PrintWriter。我怀疑它与标签库有关。但从根本上说,控制台应用程序(使用System.out)与 JSP 有很大不同,而 JSP 与 servlet 有点不同,所以...
    【解决方案2】:

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

    【讨论】:

    • 一个JspWriter,而不是一个PrintWriter
    • 您可以编辑回复吗?另请将此链接添加为来源:docs.oracle.com/javaee/1.4/api/javax/servlet/jsp/JspWriter.html。我不知道为什么,但我在此回复上看不到编辑按钮。
    • @MonsterTruck:你不能编辑其他人的帖子,直到你有 2000 个代表,虽然我认为你可以提出编辑。如果我们要添加一个链接(我已经完成了),我们希望链接到最新的东西。 Java EE 1.4 被 Java EE 5 取代已经六年了,Java EE 5 已经被 6 取代了! ;-)
    • @Crowder,我应该在元网站上提出这个问题,但我在每个回复上都看到一个编辑链接,除了这个:S。对的版本。谷歌应该更新他们的搜索算法以更好地处理文档版本——你谷歌搜索的大多数 C# 类给出 3.0 结果,而 Java 类给出 1.4 结果。感谢您进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2016-09-27
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2019-09-29
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多