Tomcat 5: навстречу Web-дизайнерам

1 март, 2004 - 00:00Виктор Вейтман
Пользовательские дескрипторы: от сложного к простому

Наиболее значительным изменениям в новой версии Tomcat подвергся контейнер JSP, что вполне объяснимо. Ведь переход от Tomcat 4 к Tomcat 5 -- это, по сути, переход от JSP 1.2 к JSP 2.0. Похоже, что работа над Tomcat 5, как и ранее над JSP 2.0, шла под лозунгом "Упростим жизнь Web-дизайнеров". И действительно, нынешний выпуск Tomcat стал настоящим подарком для тех, кто, не будучи специалистом в области программирования, тем не менее непосредственно занимается созданием JSP-документов. Не иначе как участники рабочих групп осознали, насколько мощные средства им уже удалось реализовать, и решили обеспечить доступ к ним для как можно более широких кругов пользователей.

При подготовке новой версии JSP была предпринята попытка упростить процесс создания дескрипторов, определяемых пользователями. Как известно, процедура эта не проста. Необходимо написать класс поддержки дескриптора, реализующий интерфейс Tag, правильно сформировать файл описания библиотеки (.TLD) и, наконец, включить в JSP-документ директиву <%@ taglib %>. Облегчить работу программистов призваны новый интерфейс SimpleTag и реализующий его базовый класс SimpleTagSupport. Вместо методов doStartTag(), doEndTag() и doAfterBody() предусмотрен единственный doTag(), причем использующему его разработчику не приходится заботиться о возвращаемом значении, определяющем последующие действия контейнера.

Оправдает ли класс SimpleTagSupport силы и время, затраченные на его создание? Трудно сказать. Некоторым он, безусловно, поможет, другие, узнав о появлении упрощенного базового класса, уступающего по своим возможностям уже известным средствам, лишь недоуменно пожмут плечами. Ведь практически вся технология пользовательских дескрипторов осталась неизменной. Класс поддержки (являющийся подклассом SimpleTagSupport), как и прежде, надо учесть в файле описания библиотеки, да и без директивы <%@ taglib %> обойтись тоже нельзя. Что касается написания Java-кода, то метод doStartTag() -- далеко не самое сложное звено в данном процессе. Если вспомнить о том, что пользовательские дескрипторы нужны в первую очередь Web-дизайнерам, то нельзя не признать -- для многих из них освоить SimpleTagSupport будет не менее сложно, чем TagSupport.

С другой стороны, TagSupport и BodyTagSupport никто не отменял, поэтому наличие нового класса, если и не поможет, то уж, по крайней мере, никому не повредит.

Попытки упростить создание пользовательских дескрипторов не исчерпываются введением дополнительного интерфейса. Самого пристального внимания заслуживают файлы дескрипторов, определенные в спецификации JSP 2.0 и поддерживаемые Tomcat 5. Главная особенность состоит в том, что для создания с их помощью нового JSP-дескриптора не надо знать ни Java, ни другого языка программирования. Посредством данного инструмента реализовать пользовательский дескриптор сможет каждый, кто в состоянии подготовить обычный JSP-документ. Достаточно сохранить JSP-код в файл с расширением .TAG и разместить его в специальном каталоге, не обязательно даже создавать .TLD. Останется лишь включить в JSP-документ директиву <%@ taglib %> (она действительно необходима, так как с ее помощью задается префикс) -- и новый дескриптор готов к использованию.

Код, находящийся в файле дескриптора, несколько отличается от содержимого обычных JSP-документов. В частности, в нем не поддерживается широко используемая директива page. С другой стороны, некоторые элементы, например <%@ attribute %> и <jsp:invoke>, допустимы только в файлах дескрипторов.

После ознакомления с простейшими примерами может создаться впечатление, что новый инструмент ничем не отличается от действия <jsp:include>. Однако при более подробном рассмотрении становится ясно, что возможности файлов дескрипторов значительно шире. Дескриптор, оформленный таким образом, может содержать атрибуты, которые передаются и обрабатываются посредством директивы <%@ attribute %>, -- данный механизм прост и интуитивно понятен даже начинающему.

Используя файлы дескрипторов, Web-дизайнер получает возможность выполнять достаточно сложные операции. Так, задачу обработки тела дескриптора никак нельзя назвать тривиальной. Порой профессиональным программистам, имеющим большой опыт применения Java, но лишь приступающим к работе с JSP, не удается решить ее "с наскока". На помощь приходит действие <jsp:doBody>, которое позволяет производить некоторые операции с телом дескриптора "одним росчерком пера". Конечно, набор возможностей, предоставляемых файлами дескрипторов, не слишком велик, и говорить о том, что непрофессионалы смогут обойтись без услуг программистов, слишком рано. Но "степень свободы" дизайнеров, конечно же, существенно возрастет.


Expression Language: из библиотеки -- в тело документа

Как ни странно, при первом знакомстве с каждым нововведением, появившимся в JSP 2.0 и Tomcat 5, сразу же возникает вопрос: зачем это нужно? Не стал исключением и язык JSP Expression Language. Выражения, составленные на нем, могут использоваться практически в любой точке JSP-документа, в том числе допускается их применение для формирования значений атрибутов. Но ведь подобные средства существовали и раньше -- это обычные выражения JSP. Впрочем, отличия, и весьма весомые, все же имеются.

Для того чтобы выражение JSP выполняло свои функции, оно должно быть написано по всем правилам языка Java. Но Expression Language (EL), предусмотренный в спецификации JSP 2.0, ориентирован не на профессиональных разработчиков, а на Web-дизайнеров, которым некогда учиться программированию, -- EL вполне реально освоить за один вечер.

Как и более традиционные языки программирования, EL располагает своим набором операторов, не уступающим, скажем, C или Java. Однако на этом сходство и заканчивается, так как средства EL практически исчерпываются одними операторами. Основная цель фрагментов EL-кода -- обеспечить доступ к данным, предоставляемым элементами бизнес-логики. Поскольку вся необходимая предварительная обработка предполагается уже выполненной, не нужны и соответствующие языковые конструкции. Например, отобразить данные в окнах броузеров можно и не прибегая к циклам, поэтому ключевые слова для их организации в EL не предусмотрены.

Несколько особняком стоит оператор []. Если в Java он используется для обращения к обычным массивам, то в EL позволяет работать также со списками и с картами отображений. Последние в языке EL представляют собой специальные массивы, где роль индексов выполняют символьные идентификаторы. В виде таких карт реализованы многие предопределенные переменные, применяемые для доступа к параметрам запроса, полям заголовка, записям cookie и другим данным, определяющим сеанс работы с клиентом.

Несмотря на то что возможности EL намеренно ограничены, в нем все же присутствует поддержка функций. Однако создавать и использовать их гораздо сложнее, чем обычные выражения. Реализация функции предусматривает написание Java-кода и формирование TLD-файла, поэтому для решения данной задачи Web-дизайнерам в большинстве случаев придется прибегать к услугам профессиональных программистов.

Как было сказано выше, EL и JSP-выражения во многом дублируют друг друга. Во избежание путаницы при создании JSP-документов средства языка выражений допускается отключать -- ведь возможно, что синтаксические конструкции, подобные выражениям EL, войдут в состав какого-то документа на правах обычного текста.

EL уже успел завоевать популярность среди пользователей. Ограниченная поддержка была реализована ранее в библиотеке дескрипторов JSTL, и некоторые Web-дизайнеры и программисты не преминули воспользоваться новой технологией в своих разработках. Авторы EL получили множество положительных отзывов и, не колеблясь, приняли решение включить Expression Language в спецификацию JSP 2.0 и полностью реализовать его поддержку в очередной версии Tomcat.


Не забыты и сервлеты

Говоря о новых возможностях Tomcat 5, было бы несправедливо умолчать о средствах, объявленных в Servlet 2.4. По номеру версии нетрудно догадаться, что изменения, внесенные в эту спецификацию и реализованные в Tomcat 5, не относятся к категории принципиальных -- их уместнее назвать косметическими.

Наиболее важным из нововведений многие находят поддержку J2SE 1.3 (минимальное требование) и J2SE 1.4. Однако переход от J2SE 1.2 к J2SE 1.3 можно считать вполне закономерным, ведь набор инструментов программирования на Java и средства поддержки сервлетов -- это "члены одной семьи". Было бы весьма странно, если бы их взросление не происходило параллельно.

Еще одной значимой деталью является поддержка HTTP/1.1. Несмотря на то что соответствующие средства сводятся в основном к появлению константы SC_FOUND, описывающей код состояния 302, сам факт перехода к новой версии протокола HTTP -- это, безусловно, положительное явление.

Немалым шагом вперед является поддержка XML-схем в файлах web.xml. В то же время использование DTD-описаний не только не запрещено, но они даже не удалены из XML-файлов, поставляемых в составе Tomcat 5.

Интерфейс SingleThreadModel теперь не рекомендован к применению ("Компьютерное Обозрение", # 31--32, 2003). Среди других новшеств можно также отметить ряд дополнительных интерфейсов, позволяющих определять обработчики событий, связанных с запросами, а также появление атрибутов, используемых при перенаправлении запросов.


И вот -- дистрибутивный пакет получен...

Подобно предыдущим версиям Tomcat 5 распространяется бесплатно. Действия по установке данного сервера в системе Unix практически не отличаются от версии Tomcat 4. Для пользователей системы Windows, помимо ZIP-архива, также предусмотрена инсталляционная программа. Она размещает Tomcat в каталоге, выбранном пользователем, и создает соответствующие ярлыки в главном меню, но, к сожалению, корректно работает не во всех версиях операционной системы.

В Windows вас ожидает еще один неприятный сюрприз -- при обновлении Tomcat 4: оказывается, программа установки не изменяет значения переменной окружения CATALINA_HOME, и она по-прежнему указывает на старую инсталляцию. Соответственно, и файл startup.bat запустит предыдущую версию сервера.

Таким образом, надежнее работать по старинке. После сохранения содержимого дистрибутивного пакета в указанный каталог следует вручную задать новое значение переменной CATALINA_HOME. При последующем выполнении startup.bat новые возможности сервлетов и JSP будут к вашим услугам.