`

СПЕЦІАЛЬНІ
ПАРТНЕРИ
ПРОЕКТУ

Чи використовує ваша компанія ChatGPT в роботі?

BEST CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

JavaServer Pages для общительных и нелюдимых

0 
 

Технология JavaServer Pages (JSP) практически с момента своего появления пользуется заслуженной популярностью среди разработчиков приложений, предназначенных для выполнения на стороне сервера. И неудивительно, ведь благодаря ей удалось объединить достоинства статических HTML-документов и Java-сервлетов.

Уже сама возможность чередовать HTML-дескрипторы с фрагментами кода существенно снижает затраты по созданию Web-страницы. Однако авторы спецификации JSP не остановились на этом и предложили чрезвычайно мощный механизм дескрипторов, определяемых разработчиком, или пользовательских дескрипторов.

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

Более того, применение пользовательских дескрипторов позволит достичь взаимопонимания между программистами и теми Web-дизайнерами, которые не могут (а вернее, не хотят) "мыслить программно". Теперь разработчик способен предоставить Web-дизайнеру не фрагмент Java-кода, а лишь еще один дескриптор, расширяющий набор инструментов, имеющихся в распоряжении последнего.

Подробно о создании пользовательских дескрипторов здесь говорить излишне. Этот вопрос неоднократно освещался в разных публикациях. Их преимущества для участников рабочей группы несомненны. Но на сегодняшний день в программировании немало одиночек, каждый из которых абсолютно уверен, что наилучшая команда состоит из него одного. Надо признать, многие из них добиваются неплохих результатов. Что же делать им? На первый взгляд может показаться, что пользовательские дескрипторы в индивидуальной работе излишни. Зачем разработчику тратить время на специальное оформление Java-кода, если применять его будет он сам? Однако не стоит спешить с выводами.

Программисты, стаж работы которых приближается к 15 годам, несомненно помнят появление языка С++ и страсть к объектно-ориентированному программированию, внезапно охватившую всех и каждого. Ни для кого не секрет, что объектная парадигма существовала и ранее, но объектно-ориентированный подход, как и поддерживающие его языки (например, SmallTalk), почти всех оставляли равнодушными. И вдруг -- сен­сация! Оказывается, что писать "необъектные" программы просто неприлично.

Что же получили поклонники нового подхода? Увы, большинство из них приобрели лишь новые проблемы. При создании простых приложений (а именно этим и занималась тогда основная масса отечественных программистов) классы оказывались совершенно ненужным балластом. В результате многие резко охладели к объектно-ориентированному программированию и лишь потом, с появлением многочисленных библиотек классов, поняли, что ООП -- вещь все же стоящая.

Можно ли провести аналогию между объектом и пользовательским дескриптором? Она напрашивается сама собой, в особенности если учесть, что основой дескриптора является класс поддержки, написанный на языке Java. Так что же нужно, чтобы применение пользовательских дескрипторов стало эффективным? Конечно же, библиотеки!


Просто и понятно

Если разработчик недостаточно искушен в вопросах создания и применения пользовательских дескрипторов, знакомство с библиотеками ему лучше начинать с Coldjava (http://coldjava.hypermart.net/jsp.htm). В состав данного пакета входят библиотеки, предназначенные для выполнения различных действий с файлами и каталогами (FileTags), для операций с датами и временем (DateTime), работы с записями cookie (Cookie), управления кэшем (Cache и Cache Off), обработки тела дескриптора в зависимости от определенных условий (IfTags), а также средства, реализующие многие другие возможности.

Применение дескрипторов из библиотек Coldjava демонстрирует следующий пример. Предположим, что нам необходимо узнать время последней модификации файла. Эта задача (искусственная, как и все простые примеры) решается с помощью фрагмента JSP-кода, приведенного в листинге 1.

Листинг 1

<%@ taglib uri="datetime" prefix="dt" %>
<%@ taglib uri="file" prefix="file" %>
<%@ taglib uri="iftags" prefix="if" %>
<if:IfParameterExists name="file">
  <file:isFile source='a.txt' id="fileExists" />
  <if:IfTrue cond= "<%=fileExists.booleanValue() %>">
    Файл изменен
    <file:lastModified source='<%=request.getParameter("file") %>' id="modifyTime" />
    <dt:DateTime format="dd-MM-yyyy hh:mm" value='<%= (Date)pageContext.getAttribute("modifyTime") %>' />
  </if:IfTrue>
</if:IfParameterExists>

Здесь, как видно из директив <%@ taglib %>, используются три библиотеки дескрипторов: datetime (префикс dt), file (префикс file) и iftags (префикс if).

Имя файла передается в составе запроса клиента. Если параметр с именем file присутствует (дескриптор <if:IfParame­terExists>) и если файл с заданным именем существует (<file:isFile />), то определяются (<file:lastModified>), форматируются (<dt:DateTime>) и выводятся дата и время его последней модификации.

Еще недавно набор возможностей, предоставляемых Coldjava, был крайне ограничен, но в последнее время появились средства, позволяющие выполнять достаточно сложные функции (например, обеспечивающие поддержку WML, HTTP-обмен, реализацию элементов электронной коммерции и т. д.). Следует заметить, что эти библиотеки не свободны от недостатков. Так, в IfTags явно "не хватает" дескриптора <if:Else>, а дескриптор <file:lastModified> представляет дату и время как объект Date, который давно не рекомендован к применению.

Однако, несмотря на недостатки, пакет Coldjava прост в использовании и может служить хорошей "стартовой точкой" для начинающего. А учитывая быстрое развитие проекта, вполне возможно, что в ближайшем будущем Coldjava составит реальную конкуренцию основным библиотекам дескрипторов.


На пути к созданию стандартной библиотеки

Все давно привыкли, что в состав каждого инструмента разработки входит библиотека (чаще -- несколько). Компилятор с языка программирования поставляется с библиотеками функций и классов. Графический редактор содержит "галерею" фрагментов, которые могут быть использованы при построении изображений. А теперь попробуем ответить на вопрос, является ли Web-сервер (а вернее, JSP-контейнер, входящий в его состав) инструментом разработки? Какой же это инструмент, -- скажут некоторые -- это лишь программа для обработки запросов. Но если мы размещаем на сервере JSP-документы, -- возразят другие -- неплохо бы иметь и средства для их создания.

В настоящее время базовая реализация JSP-контейнера -- сервер Tomcat -- поставляется без всяких библиотек. Но, по-видимому, такое положение будет сохраняться недолго. Работа по подготовке стандартных библиотек ведется в рамках проекта Jakarta Taglibs и уже близка к завершению. Базовой библиотекой (в ближайшем будущем ее планируется распространять вместе с Tomcat) является JSTL (JSP Standard Tag Library). Дескрипторы, входящие в состав JSTL, обеспечивают ряд операций, существенно упрощающих создание JSP-документов. Среди них уже знакомые по Coldjava дескрипторы поддержки условных операций и итераторы, а также дескрипторы, позволяющие импортировать ресурсы, взаимодействовать с базами данных, выполнять разбор и преобразование XML-документов, и многие другие средства.

Листинг 2 демонстрирует интересную возможность, предоставляемую JSTL, -- динамическое формирование URL в составе гипертекстовой ссылки.

Листинг 2

<%@ taglib uri="c-rt"
prefix="c-rt" %>
<a href='
  <c-rt:url value="http://www.myserver.com/cgi-bin/register.pl">
    <c-rt:param name="country" value="Ukraine"/>
    </c-rt:url> '
  >
click here
</a>

Включить в качестве значения атрибута href динамически сформированный URL несложно и традиционными средствами JSP. Но дескрипторы <c:url> и <c:param> также позволяют сформировать набор параметров, закодировать специальные символы трехзнаковыми последовательностями и присоединить параметры к URL.

Чтобы избежать включения дескрипторов <c:url> и <c:param> в состав дескриптора <a>, можно несколько изменить рассматриваемый код. Но, прежде чем сделать это, необходимо обратить внимание на файлы описания (TLD-файлы), поставляемые в составе библио­теки: c.tld, c-rt.tld, x.tld, x-rt.tld, fmt.tld, fmt-rt.tld, sql.tld, sql-rt.tld.

Как видно, каждому TLD-файлу соответствует другой такой же файл, отличающийся суффиксом "-rt". Так, c.tld соответствует c-rt.tld, fmt.tld -- fmt-rt.tld и т. д. Если вы откроете, например, файлы c.tld и c-rt.tld, то увидите, что имена дескрипторов, описываемых с помощью элементов <tag>, в обоих случаях в основном совпадают.

TLD-файлы с суффиксом "-rt" определяют обычные дескрипторы, значения атрибутов которых формируются по известным и привычным для всех правилам. В дескрипторах, описанных в файлах без суффикса "-rt", реализовано новое средство -- язык выражений (EL -- Expression Language). Его использование упрощает формирование значений атрибутов дескрипторов и снижает требования к разработчику. Благодаря EL создавать документы могут даже Web-дизайнеры, имеющие лишь туманное представление о Java.

Фрагмент кода, в котором при формировании гипертекстовой ссылки используется EL, приведен в листинге 3.

Листинг 3

<%@ taglib uri="c" prefix="c" %>
<c:url value="http://www.myserver.com/cgi-bin/register.pl" var="myURL">
  <c:param name="country"value="Ukraine"/>
</c:url>
<a href='<c:out value="$myURL" /> '>click here</a>

В данном случае сформированный дескриптор сохраняется в переменной myURL, затем используемой в дескрипторе <c:out>. Обратите внимание, что префиксы "c-rt" перед библиотечными дескрипторами заменены на "c".

Загрузив последний вариант Jakarta Taglibs (около 12 МВ), вы увидите, что JSTL -- лишь одна из очень многих библиотек, созданных в рамках данного проекта. Ниже приведены сведения о некоторых библиотеках пакета.

  • Application -- обеспечивает доступ к информации, содержащейся в контексте сервлета.
  • BSF -- предоставляет набор средств, предназначенных для интеграции языков сценариев, например Java­Script, VBScript, Perl, Tcl, Python и Rexx.
  • JDBC -- поддерживает обмен информацией с базами данных.
  • Mailer -- обеспечивает отправку почты как путем непосредственного взаимодействия с SMTP-сервером, так и с помощью JNDI.
  • Request -- предоставляет информацию об HTTP-запросе.
  • Response -- обеспечивает формирование HTTP-ответа.
  • Session -- поддерживает сеанс взаимодействия с пользователем. Для хранения данных о сеансе применяются механизм cookie и замена URL.
  • XSL -- обеспечивает обработку XML-документов, используя в качестве листов стилей XSL-файлы.
Перечисленные библиотеки составляют лишь небольшую часть средств, созданных в рамках проекта Jakarta Taglibs. Подробно вы сможете ознакомиться с ними по адресу http://jakarta.apache.org/builds/jakarta-taglibs/nightly/.

В качестве примера рассмотрим использование некоторых дескрипторов из библиотеки mailer. Предположим, что нам необходимо отправить письмо по адресу, указанному пользователем. Как сделать это при отсутствии библио­тек дескрипторов и специализированных библиотек Java? Наверное, следовало бы обратиться через порт 25 к компьютеру, на котором расположен SMTP-сервер, установить TCP-соединение и организовать передачу письма с помощью SMTP-протокола. Для Web-мастера/дизайнера такая задача чрезвычайно сложна. Можно было бы также воспользоваться API прикладной почтовой программы (если таковая присутствует на компьютере). Но и здесь разработчик встретится с массой проблем.

К счастью, библиотека mailer позволяет решить данную задачу крайне просто. Соответствующий JSP-код занимает всего несколько строк (листинг 4).

Листинг 4

<%@ taglib uri="mailer" prefix="mt" %>
<mt:mail server="my.mail.server.com" from="[email protected]" >
  <mt:setrecipient type="to" address="[email protected]"/>
  <mt:subject>Tag library</mt:subject>
  <mt:message>
    How about the mail tag library?
  </mt:message>
  <mt:send/>
</mt:mail>

При необходимости вы можете рассылать копии письма нескольким адресатам (дескриптор <mt:addrecipient>), присоединять к письму файлы (дескриптор <mt:attach>), специально устанавливать поля заголовка и выполнять другие, самые различные действия.

В завершение следует заметить, что библиотеки проекта Jakarta Taglibs совместимы не с каждым сервером. Чтобы приведенные фрагменты кода заработали, вам понадобится Tomcat 4.0 или более поздние реализации.


Jakarta Struts -- для профессионалов

Еще совсем недавно Web-сервер был лишь элементом Всемирной Паутины, предназначенным в основном для доставки HTML-документов на клиентские машины. Однако сегодня это ПО стало неотъемлемой частью корпоративной инфраструктуры. Правда, заняло оно скромное место сервера промежуточного уровня (middleware) -- посредника между клиентом и "настоящим" сервером. Большую же часть забот по обслуживанию запроса клиента взяли на себя специализированные программы, нередко реализуемые средствами JSP.

Создание таких программ вряд ли можно назвать простой задачей. Более того, она настолько сложна, что для того чтобы усилия разработчиков в обозримое время завершались созданием готовых продуктов, потребовалась новая архитектура приложений, получившая название "модель-представление-контроллер" (MVC -- Mo­del-View-Controller).

Согласно этому принципу построения ПО модель объединяет средства хранения информации, доступа к ней и так называемую бизнес-логику -- объекты, осуществляющие специальную обработку данных. Представление используется для визуальной подачи данных модели; эту роль, как правило, играют JSP-документы. И наконец, контроллер, как и следует из его названия, служит для обработки событий. Если речь идет о приложении, выполняющемся на стороне Web-сервера, то чаще всего событием является обращение клиента и для его предварительной обработки используется специальный сервлет.

Как известно, правильный выбор архитектуры не намного уменьшает объем работы по созданию приложения, а лишь позволяет должным образом организовать действия программиста. Реально облегчить работу может только базовый набор средств, поддерживающий конкретную архитектуру. На такую роль обоснованно претендует библиотека Jakarta Struts.

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

Объем Jakarta Struts так велик и функции, выполняемые ее компонентами, настолько разнообразны, что их невозможно даже кратко описать в рамках статьи. Чтобы получить исходные или двоичные коды библиотеки Jakarta Struts и руководство по ее использованию, достаточно обратиться на исходную страницу проекта http://jakarta.apache.org/struts.


На любой вкус...

Набор доступных библиотек не исчерпывается описанными выше. Каждый заинтересовавшийся найдет для себя что-то новое и полезное.

Библиотека WebWorks направлена на решение тех же задач, что и Jakarta Struts. В настоящее время разработка еще не завершена. Сведения о состоянии проекта можно получить по адресу http://sourceforge.net/projects/webwork/.

Известная компания Allaire реализовала библиотеку JRun Custom Tag Li­brary, которая дает возможность интегрировать средства J2EE (Java 2 Enterprise Edition) в HTML-документ. В частности, JRun Custom Tag Library поддерживает обмен информацией с базой данных, взаимодействие со службами имен и каталогов, а также позволяет выполнять преобразование XML-документов, обмениваться сообщениями и т. д. Информация об этом продукте в настоящее время находится на сервере http://www.macromedia.com/.

Небольшая библиотека Orion EJB Taglib (http://www.orionserver.com/tags/ejbtags/) обеспечивает взаимодействие с Enterprise JavaBeans. Form Tag Library специально предназначена для построения форм.

Это лишь немногие из библиотек, которыми может воспользоваться разработчик при создании JSP-документов и приложений на стороне сервера. Ограниченный объем статьи заставляет воздержаться от перечисления остальных.

И наконец, сведения, особенно приятные для разработчика. Все пакеты, рассмотренные в данной статье, распространяются бесплатно. Кроме того, бесплатно доступна и любая версия сервера Tomcat. А если учесть, что описанные средства выполняются на любой платформе, появляется возможность реализовать высококачественный сервер, не затратив ни копейки на приобретение программ.

Ready, set, buy! Посібник для початківців - як придбати Copilot для Microsoft 365

0 
 

Напечатать Отправить другу

Читайте также

 

Ukraine

 

  •  Home  •  Ринок  •  IТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Мережі  •  Безпека  •  Наука  •  IoT