Почему мы пишем out.println() в jsp вместо System.out.println()?

Я начал изучать jsp, и я вижу, что если мы хотим напечатать что-то в jsp, мы должны написать out.println() вместо System.out.println(), но если мы напишем System.out.println(), он не будет показывать никаких ошибок, но будет а не o/p для браузера. Я хочу знать, почему это происходит? Поскольку все мы знаем, что System является предопределенным классом, а out - выходной поток, подключенный к консоли. Итак, почему нам не нужно писать System в jsp? Спасибо.

Ответ 1

Поскольку out мы имеем в виду не System.out, это переменная в эффективном методе, который обертывает нашу страницу JSP. System.out записывается в консоль контейнера сервлета (обычно это файл журнала); out - это совсем другой класс, который записывает в выходной поток для сгенерированного ответа.

Когда JSP превращается в код, он (теоретически, и с Tomcat, по сути) проходит два этапа: JSP → исходный код сервлета, затем исходный код сервлета → класс. Вся страница помещается внутри метода, который с 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).

(Боковое примечание: код, который вы включаете в теги <%! ... %>, а не обычные теги <% ... %>, не помещается в метод, он помещен в другом месте в созданном классе сервлета.)

Ответ 2

out в jsp - это JspWriter объект, который создается Jsp автоматически, он используется для написания чего-либо на веб-странице, в то время как System.out.print() используется для вывода/записи чего-либо на консоль.