Реализация JSP (Jasper) и поддержка прокси#

Реализация JSP#

Tomcat использует JSP engine 2 (Jasper 2) для реализации механизма Jakarta pages версии 4.0.

Jasper 2 обладает более высокой производительностью по сравнению с Jasper и имеет следующие отличия:

  • Объединение пользовательских тегов JSP в пул — объекты Java, созданные для пользовательских тегов JSP, можно объединять в пул и использовать повторно. Это значительно повышает производительность страниц JSP, использующих пользовательские теги.

  • Фоновая компиляция JSP-страниц — при изменении уже скомпилированных JSP-страниц, Jasper 2 может перекомпилировать данную страницу в фоновом режиме. Ранее скомпилированная JSP-страница по-прежнему будет доступна для обработки запросов. После успешной компиляции новой страницы она заменит старую. Это помогает повысить доступность JSP-страниц на рабочем сервере.

  • Перекомпиляция JSP при изменении включенной страницы — Jasper 2 может определять, когда страница, включенная во время компиляции из JSP, изменилась, и перекомпилировать родительский JSP.

  • Для компиляции страниц JSP используется JDT (Java Eclipse JDT) – в Jasper 2 JDT используется для компиляции исходного кода JSP. Данный компилятор загружает исходные зависимости из загрузчика классов контейнера. Использование Ant и javac остается доступным.

Поддержка прокси#

При использовании стандартных конфигураций Tomcat веб-приложения могут запрашивать имя сервера и номер порта, на который был направлен запрос для обработки. Когда Tomcat работает автономно с HTTP/1.1 Connector. Он сообщает имя сервера, указанное в запросе, и номер порта, на котором Connector ожидает подключения. Для данной цели используются следующие методы API сервлетов:

  • ServletRequest.getServerName() - возвращает имя хоста сервера, на который был отправлен запрос;

  • ServletRequest.getServerPort() - возвращает номер порта сервера, на который был отправлен запрос;

  • ServletRequest.getLocalName() - возвращает имя хоста интерфейса IP, на который был получен запрос;

  • ServletRequest.getLocalPort() - возвращает номер порта интерфейса IP, на который был получен запрос.

Когда Tomcat работает вместе с прокси-сервером (или веб-сервером, настроенным как прокси-сервер), иногда требуется управлять значениями, возвращаемыми методами, указанными выше. Номер порта в данном случае должен отражать значение, указанное в исходном запросе, а не то, на котором Connector ожидает подключения. Для настройки значений можно использовать атрибуты proxyName и proxyPort в элементе Connector.

Когда запросы проксируются через Tomcat, веб-сервер будет записывать их в свой журнал доступа. При проксировании данным образом все запросы к настроенным веб-приложениям будет обрабатывать Tomcat (включая запросы статического контента). Для повышения производительности можно использовать веб-коннектор mod_jk вместо mod_proxy. mod_jk настраивается так, чтобы веб-сервер обслуживал статический контент, не обрабатываемый фильтрами или ограничениями безопасности, определенными в дескрипторе развертывания веб-приложения (/WEB-INF/web.xml).