Подтвердить что ты не робот

Как работает jsp?

Мне интересно, собирает ли JSP компиляцию? Причины, по которым я спрашиваю, - это то, что всякий раз, когда я развертываю приложение Java EE на веб-сервере, я вижу только этот файл сервлета и beans в папке WEB-INF, поскольку они скомпилированы, но не тот JSP, так как он работает, и какой логический поток и большая картина нормального цикла запроса/ответа.

4b9b3361

Ответ 1

В принципе:

  • В вашем контейнере сервлета JSP-сервлет отображается на любой URL-адрес, который заканчивается на .jsp (обычно)

  • При запросе одного из этих .jsp URL-адресов запрос переходит к сервлету JSP. Затем этот сервлет проверяет, скомпилирован ли JSP.

  • Если JSP еще не скомпилирован, сервлет JSP переводит JSP в некоторый исходный код Java, реализующий интерфейс Servlet. Затем он компилирует этот исходный код Java в файл .class. Этот файл .class обычно находится где-то в рабочем каталоге контейнера сервлетов для приложения.

  • Как только сервлет JSP скомпилировал класс сервлета из исходного кода JSP, он просто перенаправляет запрос этому классу сервлета.

Дело в том, что если вы специально не прекомпилируете свой JSP, все это происходит во время выполнения и скрывается в рабочем каталоге контейнера сервлетов, поэтому оно "невидимо". Также имейте в виду, что это то, что происходит "концептуально", в этом рабочем процессе возможны несколько оптимизаций.

Ответ 2

JSPs компилируются в Servlets. У них просто есть специальный компилятор, который обычно встроен в контейнер.

Из хорошей википедии оле:

Архитектурно, JSP можно рассматривать как абстракцию высокого уровня сервлетов Java. JSP переведены в сервлеты во время выполнения; каждый сервлет JSP кэшируется и повторно используется до тех пор, пока не будет изменен исходный JSP.

Ответ 3

Да, они скомпилированы!

Старые компиляторы даже выпускают файлы java и class.

Похоже, что с более новыми компиляторами (по крайней мере, начиная с Sun JDK 6 update 30) они могут делать все генерации байтового кода в памяти, поэтому вы не видите никаких следов в своем приложении work или temp каталоги.

Ответ 4

Во время выполнения код JSP интерпретируется JSP, который разбирает все специальные функции в коде JSP и переводит их на Java код. Класс Java, созданный из каждого JSP, реализует Servlet. Затем код Java проходит тот же цикл, который он обычно выполняет. Еще во время выполнения он компилируется в байт-код, а затем в машину код. Наконец, JSP-turn-Servlet отвечает на запросы, как любой другой сервлет.

Если вы посмотрите на файл * _jsp.java, то вы должны найти класс, который расширяет org.apache.jasper.runtime.HttpJspBase. Эта абстрактный класс расширяет HttpServlet. HttpJspBase предоставляет некоторую базу функциональность, которая будет использоваться всеми JSP, которые компиляция Tomcat, и когда ваш JSP будет выполнен, в конечном счете, выполняется служебный метод для этого сервлета, который в конечном итоге выполняет Метод _jspService. Если вы проверите метод _jspService, вы найдете серию вызовов методов, записывающих ваш HTML-код в выходной поток. Этот код должен выглядеть вам очень хорошо, потому что он не отличается от код Java, который вы заменили этим JSP.

Конечно, класс JSP Servlet не выглядит одинаково на каждом веб-контейнере. Классы org.apache.jasper, например, являются классами, специфичными для Tomcat. Ваш JSP компилируется по-разному на каждом веб-контейнере, в котором вы его запускаете. Важный момент заключается в том, что существует стандартная спецификация поведения и синтаксиса JSP, и до тех пор, пока сеть контейнеры, которые вы используете, соответствуют спецификации, ваши JSP должны работать одинаково на всех их, даже если код Java, который они перевели, выглядит совершенно другим.

Взято (и перефразировано) из Профессиональной Java для веб-приложений Николаса С Уильямса