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

11

Я начал изучать jsp и вижу, что если мы хотим что-то напечатать в jsp, мы должны написатьout.println() вместо тогоSystem.out.println(), но если мы напишемSystem.out.println() он не отображает никаких ошибок, но также не отображает браузер. Я хочу знать, почему это происходит? Как все мы знаем, чтоSystem - это предопределенный класс, аout - выходной поток, подключенный к консоли. Так почему мы не требуем писатьSystem в JSP? Благодарность

Ваш Ответ

2   ответа
13

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).

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

@ Debabratta:System.out иout используемые в JSP не имеют ничего общего друг с другом, они просто имеют одинаковые имена. Я не знаю почемуJspWriter используется в JSP вместоPrintWriter. Я подозреваю, что это связано с taglibs. Но в основном консольные приложения (использующиеSystem.out) сильно отличаются от JSP, а JSP немного отличаются от сервлетов, поэтому ... T.J. Crowder
В ядре java out - это переменная класса PrintStream, в jsp это переменная JspWriter, а в сервлете она имеет тип PrintWriter, что немного сбивает с толку. Deb
Хорошо, спасибо за ваш ответ. Deb
10

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

A JspWriter, а неPrintWriter. T.J. Crowder
да, ты прав. user1335794
Можете ли вы отредактировать ответ? Пожалуйста, добавьте эту ссылку в качестве источника: Docs.oracle.com / JavaEE / 1.4 / API / javax / сервлет / JSP / JspWriter.html. Не знаю почему, но я не вижу кнопку редактирования в этом ответе. Apoorv Khurasia
@ MonsterTruck: Вы не можете редактировать посты других людей, пока у вас нет 2000 представителей, хотя я думал, что вы могли бы Предложить редактирует. Если мы собираемся добавить ссылку (что я сделал), мы бы хотели, чтобы ссылка на что-то в курсе. Прошло шесть лет с тех пор, как Java EE 1.4 была заменена Java EE 5, которая с тех пор была заменена на 6! ; -) T.J. Crowder
@ Crowder, я должен поднять это на мета-сайте, но я вижу ссылку для редактирования в каждом ответе, кроме этого: S. Прямо о версии. Google должен обновить свои поисковые алгоритмы, чтобы лучше обрабатывать версии документов - большинство классов C #, которые вы ищите, дают результаты 3.0, а классы Java дают результаты 1.4. Спасибо за редактирование. Apoorv Khurasia

Похожие вопросы